106 lines
5.4 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.

# Przepełnienie całkowite (Aplikacje internetowe)
{{#include ../../banners/hacktricks-training.md}}
> Ta strona koncentruje się na tym, jak **przepełnienia/truncacje całkowite mogą być wykorzystywane w aplikacjach internetowych i przeglądarkach**. Aby uzyskać informacje o prymitywach eksploatacyjnych w natywnych binariach, możesz kontynuować czytanie dedykowanej strony:
>
>
{{#ref}}
> ../../binary-exploitation/integer-overflow.md
> {{#endref}}
---
## 1. Dlaczego matematyka całkowita wciąż ma znaczenie w sieci
Mimo że większość logiki biznesowej w nowoczesnych stosach jest pisana w *językach bezpiecznych dla pamięci*, podstawowy runtime (lub biblioteki stron trzecich) jest ostatecznie zaimplementowany w C/C++. Kiedy liczby kontrolowane przez użytkownika są używane do alokacji buforów, obliczania przesunięć lub wykonywania kontroli długości, **przepełnienie 32-bitowe lub 64-bitowe może przekształcić pozornie nieszkodliwy parametr w odczyt/zapis poza zakresem, obejście logiki lub DoS**.
Typowa powierzchnia ataku:
1. **Numeryczne parametry żądania** klasyczne pola id, offset lub count.
2. **Nagłówki długości/rozmiaru** Content-Length, długość ramki WebSocket, HTTP/2 continuation_len itp.
3. **Metadane formatu pliku analizowane po stronie serwera lub klienta** wymiary obrazu, rozmiary kawałków, tabele czcionek.
4. **Konwersje na poziomie języka** rzutowania signed↔unsigned w PHP/Go/Rust FFI, truncacje JS Number → int32 wewnątrz V8.
5. **Uwierzytelnianie i logika biznesowa** wartość kuponu, cena lub obliczenia salda, które cicho przepełniają.
---
## 2. Ostatnie luki w zabezpieczeniach w rzeczywistym świecie (2023-2025)
| Rok | Komponent | Przyczyna | Wpływ |
|------|-----------|-----------|--------|
| 2023 | **libwebp CVE-2023-4863** | Przepełnienie mnożenia 32-bitowego podczas obliczania rozmiaru odkodowanego piksela | Wywołało 0-day w Chrome (BLASTPASS na iOS), umożliwiło *zdalne wykonanie kodu* wewnątrz piaskownicy renderera. |
| 2024 | **V8 CVE-2024-0519** | Truncacja do 32-bitów podczas powiększania JSArray prowadzi do zapisu OOB w pamięci podręcznej | Zdalne wykonanie kodu po jednej wizycie. |
| 2025 | **Apollo GraphQL Server** (nieopublikowana poprawka) | 32-bitowa liczba całkowita ze znakiem używana do argumentów paginacji first/last; wartości ujemne przepełniają się do ogromnych dodatnich | Obejście logiki i wyczerpanie pamięci (DoS). |
---
## 3. Strategia testowania
### 3.1 Arkusz oszustw wartości brzegowych
Wyślij **ekstremalne wartości signed/unsigned** wszędzie tam, gdzie oczekiwana jest liczba całkowita:
```
-1, 0, 1,
127, 128, 255, 256,
32767, 32768, 65535, 65536,
2147483647, 2147483648, 4294967295,
9223372036854775807, 9223372036854775808,
0x7fffffff, 0x80000000, 0xffffffff
```
Inne przydatne formaty:
* Hex (0x100), ósemkowy (0377), naukowy (1e10), JSON big-int (9999999999999999999).
* Bardzo długie ciągi cyfr (>1kB) do trafienia w niestandardowe parsery.
### 3.2 Szablon Burp Intruder
```
§INTEGER§
Payload type: Numbers
From: -10 To: 4294967300 Step: 1
Pad to length: 10, Enable hex prefix 0x
```
### 3.3 Fuzzing biblioteki i środowiska uruchomieniowe
* **AFL++/Honggfuzz** z libFuzzer wokół parsera (np. WebP, PNG, protobuf).
* **Fuzzilli** fuzzing z uwzględnieniem gramatyki silników JavaScript, aby trafić w obcinanie liczb całkowitych V8/JSC.
* **boofuzz** fuzzing protokołów sieciowych (WebSocket, HTTP/2) koncentrujący się na polach długości.
---
## 4. Wzorce eksploatacji
### 4.1 Ominięcie logiki w kodzie po stronie serwera (przykład PHP)
```php
$price = (int)$_POST['price']; // expecting cents (0-10000)
$total = $price * 100; // ← 32-bit overflow possible
if($total > 1000000){
die('Too expensive');
}
/* Sending price=21474850 → $total wraps to 2147483648 and check is bypassed */
```
### 4.2 Przepełnienie sterty za pomocą dekodera obrazów (libwebp 0-day)
Dekoder WebP bezstratny pomnożył szerokość obrazu × wysokość × 4 (RGBA) wewnątrz 32-bitowego inta. Opracowany plik o wymiarach 16384 × 16384 przepełnia mnożenie, alokuje krótki bufor i następnie zapisuje **~1GB** zdekompresowanych danych poza stertą prowadząc do RCE w każdej przeglądarce opartej na Chromium przed wersją 116.0.5845.187.
### 4.3 Łańcuch XSS/RCE oparty na przeglądarce
1. **Przepełnienie całkowite** w V8 daje dowolne odczyty/zapisy.
2. Ucieczka z piaskownicy za pomocą drugiego błędu lub wywołanie natywnych API w celu zrzucenia ładunku.
3. Ładunek następnie wstrzykuje złośliwy skrypt do kontekstu źródłowego → przechowywane XSS.
---
## 5. Wytyczne obronne
1. **Używaj szerokich typów lub sprawdzanej matematyki** np. size_t, Rust checked_add, Go math/bits.Add64.
2. **Waliduj zakresy wcześnie**: odrzucaj wszelkie wartości poza domeną biznesową przed arytmetyką.
3. **Włącz sanitizery kompilatora**: -fsanitize=integer, UBSan, Go race detector.
4. **Przyjmij fuzzing w CI/CD** połącz informacje zwrotne o pokryciu z granicznymi zbiorami.
5. **Bądź na bieżąco z łatkami** błędy przepełnienia całkowitego w przeglądarkach są często wykorzystywane w ciągu kilku tygodni.
---
## Referencje
* [NVD CVE-2023-4863 libwebp Heap Buffer Overflow](https://nvd.nist.gov/vuln/detail/CVE-2023-4863)
* [Google Project Zero "Understanding V8 CVE-2024-0519"](https://googleprojectzero.github.io/)
{{#include ../../banners/hacktricks-training.md}}