mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
106 lines
5.4 KiB
Markdown
106 lines
5.4 KiB
Markdown
# 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}}
|