CVE-2020-6820
Priorize a correção. Ela está sob exploração confirmada pelo CISA.
Apply updates per vendor instructions.
Resumo
Use-after-free explorável por condição de corrida no manuseio de ReadableStream no motor Gecko, afetando Firefox, Firefox ESR e Thunderbird. A Mozilla confirmou exploração ativa e direcionada antes da correção, o que motivou sua inclusão no catálogo KEV da CISA — não é uma falha teórica de fuzzer, foi usada contra alvos reais.
Detalhamento técnico
O bug (Bugzilla #1626728, componente 'Storage: Cache API') foi encontrado por AddressSanitizer como heap-use-after-free em mozilla/ipc/ProtocolUtils.h:229, dentro da função Id chamada por PCacheStreamControlParent::SendCloseAll(). A cadeia de chamadas passa por dom::cache::Context::CancelAll() e Manager::Factory::Abort(), disparados a partir de QuotaManager::OpenDirectoryInternal() — ou seja, a falha está na lógica de cancelamento/abort de operações assíncronas da Cache API e do subsistema de armazenamento (Quota Manager), que interagem com streams de leitura expostos ao JavaScript de conteúdo web via ReadableStream.
A classe de falha é condição de corrida (CWE-362) entre threads (a IPDL Background thread aparece no stack trace) que leva a um objeto sendo liberado (freed) e em seguida acessado novamente — o clássico use-after-free (CWE-416). O atacante não controla diretamente o payload de memória sobrescrita; ele controla o timing e o padrão de uso da API ReadableStream/Cache API a partir de JavaScript de página web para forçar a janela de corrida entre a destruição do objeto e seu uso subsequente pelo código de IPC/threading do navegador.
A Mozilla relatou esta CVE junto com a CVE-2020-6819 (use-after-free no destrutor do nsDocShell) no mesmo advisory, ambas reportadas pelos mesmos pesquisadores (Francisco Alonso / @revskills, trabalhando com Javier Marcos / @JMPSec) e ambas descritas como abusadas em ataques direcionados — sugerindo uso conjunto como parte de uma cadeia de exploração (uma pode ser usada para obter primitiva de leitura/corrupção, outra para escalar para execução de código).
O relatório também indica um bug 1600570 marcado como duplicata e uma regressão associada (bug 1628076) introduzida pela própria correção, o que é comum em patches de condição de corrida em código de threading complexo.
Como é explorada
O vetor é conteúdo web: uma página maliciosa (ou anúncio, ou conteúdo de e-mail HTML no caso do Thunderbird) que usa a API ReadableStream de forma a induzir a corrida entre threads no código de Cache API/Quota Manager. Não há indício nas fontes de que seja necessária autenticação, configuração não padrão ou acesso à rede privilegiado — o requisito prático é o usuário visitar/renderizar conteúdo controlado pelo atacante, e o CVSS reportado (UI:N) sugere que a Mozilla não considerou necessária interação explícita do usuário além de carregar a página.
A complexidade de ataque é alta (AC:H no vetor CVSS) porque explorar uma condição de corrida de forma confiável exige controle fino de timing entre threads, normalmente com técnicas de manipulação de agendamento (heap grooming, múltiplos workers, timers) para aumentar a probabilidade de vencer a corrida — isso é consistente com o padrão de 'ataques direcionados' citado pela Mozilla, já que exploits de UAF por corrida tendem a ser específicos de versão/build e não triviais de weaponizar em massa.
A Mozilla declarou estar ciente de exploração in-the-wild no momento da divulgação (abril de 2020), e a CISA adicionou a CVE ao catálogo KEV (adicionada em 2021-11-03, prazo de correção 2022-05-03), confirmando exploração real, embora sem detalhar o ator ou a campanha. O resultado de uma exploração bem-sucedida de um UAF nesse subsistema é, no mínimo, corrupção de memória controlável no processo que hospeda o objeto liberado; dependendo do processo (conteúdo vs. pai) e de encadeamento com outras falhas, pode viabilizar execução de código no contexto do navegador.
Versões
Como se proteger
Atualizar é a única mitigação real: Firefox para 74.0.1 ou posterior, Firefox ESR para a série 68.6.1 ou posterior, e Thunderbird para 68.7.0 ou posterior (a correção foi backportada para o ramo ESR68, conforme os flags de rastreamento do bug — firefox-esr68 74+ fixed). Não há flag de configuração, preferência about:config ou controle de rede documentado nas fontes que neutralize a falha sem atualizar o binário, porque o bug está no código C++ do motor, não em uma feature opcional.
Como paliativo real na ausência de atualização imediata, a única redução de superfície plausível é limitar exposição a conteúdo web não confiável (navegação restrita a domínios controlados, isolamento de processo/sandboxing do sistema operacional) — mas isso não elimina o risco, apenas reduz a chance de encontro com conteúdo malicioso, já que a falha é acionada por JavaScript padrão de página web.
Não funciona como mitigação: desabilitar JavaScript de forma seletiva por site não é garantia, pois ReadableStream e Cache API podem ser acionados por qualquer script executado; WAF ou controles de borda de rede não têm visibilidade sobre a lógica de threading do cliente e não bloqueiam o vetor. Ambientes ainda em versões vulneráveis do Firefox ESR 68.x ou Thunderbird pré-68.7.0 devem tratar isso como P1 dado o registro em KEV.
Como detectar
Não há assinatura de rede ou de log de servidor confiável para detectar tentativas de exploração — a falha é client-side, acionada por JavaScript em conteúdo renderizado, e o comprometimento ocorre dentro do processo do navegador/cliente de e-mail sem necessariamente gerar tráfego distinguível de navegação normal. O sinal mais próximo disponível publicamente é o próprio crash report/ASan trace usado pelos pesquisadores da Mozilla (heap-use-after-free em ProtocolUtils.h via PCacheStreamControlParent::SendCloseAll), útil para triagem de crashes reproduzidos internamente, mas não para telemetria de SOC em produção. Na prática, a detecção depende de EDR observando comportamento pós-exploração (execução de código anômala originada do processo do navegador) e não da falha em si.