Integer Overflow (Web Applications)
Reading time: 5 minutes
tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
This page focuses on how integer overflows/truncations can be abused in web applications and browsers. For exploitation primitives inside native binaries you can continue reading the dedicated page:
{{#ref}}
../../binary-exploitation/integer-overflow-and-underflow.md {{#endref}}
1. Why integer math still matters on the web
Mimo że większość logiki biznesowej we współczesnych stackach jest napisana w językach memory-safe, podstawowe runtime'y (lub biblioteki firm trzecich) ostatecznie są zaimplementowane w C/C++. Kiedy liczby kontrolowane przez użytkownika są używane do alokacji buforów, obliczania offsetów lub wykonywania sprawdzeń długości, owijanie się (wrap-around) 32-bitowe lub 64-bitowe może przemienić pozornie nieszkodliwy parametr w odczyt/zapis poza zakresem, obejście logiki lub DoS.
Typowa powierzchnia ataku:
- Numeric request parameters – klasyczne pola id, offset lub count.
- Length / size headers – Content-Length, WebSocket frame length, HTTP/2 continuation_len itp.
- File-format metadata parsed server-side or client-side – wymiary obrazów, rozmiary chunków, tabele fontów.
- Language-level conversions – signed↔unsigned casts in PHP/Go/Rust FFI, JS Number → int32 truncations inside V8.
- Authentication & business logic – obliczenia wartości kuponu, ceny lub salda, które cicho przepełniają się.
2. Recent real-world vulnerabilities (2023-2025)
| Year | Component | Root cause | Impact |
|---|---|---|---|
| 2023 | libwebp – CVE-2023-4863 | 32-bit multiplication overflow when computing decoded pixel size | Triggered a Chrome 0-day (BLASTPASS on iOS), allowed remote code execution inside the renderer sandbox. |
| 2024 | V8 – CVE-2024-0519 | Truncation to 32-bit when growing a JSArray leads to OOB write on the backing store | Remote code execution after a single visit. |
| 2025 | Apollo GraphQL Server (unreleased patch) | 32-bit signed integer used for first/last pagination args; negative values wrap to huge positives | Logic bypass & memory exhaustion (DoS). |
3. Testing strategy
3.1 Boundary-value cheat-sheet
Wysyłaj extreme signed/unsigned values wszędzie tam, gdzie oczekiwany jest integer:
-1, 0, 1,
127, 128, 255, 256,
32767, 32768, 65535, 65536,
2147483647, 2147483648, 4294967295,
9223372036854775807, 9223372036854775808,
0x7fffffff, 0x80000000, 0xffffffff
Inne przydatne formaty:
- Hex (0x100), octal (0377), scientific (1e10), JSON big-int (9999999999999999999).
- Bardzo długie ciągi cyfr (>1kB), aby trafić 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 Biblioteki i runtime'y fuzzingu
- AFL++/Honggfuzz z użyciem harnessu libFuzzer wokół parsera (np. WebP, PNG, protobuf).
- Fuzzilli – grammar-aware fuzzing silników JavaScript, aby trafić w przycinanie wartości całkowitych w V8/JSC.
- boofuzz – network-protocol fuzzing (WebSocket, HTTP/2) skupiony na polach długości.
4. Wzorce eksploatacji
4.1 Omijanie logiki w kodzie po stronie serwera (przykład 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 Heap overflow via image decoder (libwebp 0-day)
WebP lossless decoder mnożył width × height × 4 (RGBA) wewnątrz 32-bitowego inta. Spreparowany plik o wymiarach 16384 × 16384 powodował overflow mnożenia, alokował za krótki bufor i następnie zapisywał ~1GB zdekompresowanych danych poza heap — prowadząc do RCE we wszystkich przeglądarkach opartych na Chromium przed 116.0.5845.187.
4.3 Browser-based XSS/RCE chain
- Integer overflow w V8 umożliwia arbitralny odczyt/zapis.
- Ucieczka z sandboxa za pomocą drugiego buga lub wywołanie native APIs, aby upuścić payload.
- Payload następnie wstrzykuje złośliwy skrypt do origin context → stored XSS.
5. Defensive guidelines
- Use wide types or checked math – np. size_t, Rust checked_add, Go math/bits.Add64.
- Validate ranges early: odrzucaj każdą wartość spoza domeny biznesowej przed wykonaniem operacji arytmetycznych.
- Enable compiler sanitizers: -fsanitize=integer, UBSan, Go race detector.
- Adopt fuzzing in CI/CD – łącz coverage feedback z korpusami brzegowymi.
- Stay patched – błędy typu Integer overflow w przeglądarkach są często wykorzystywane w ciągu kilku tygodni.
References
- NVD CVE-2023-4863 – libwebp Heap Buffer Overflow
- Google Project Zero – "Understanding V8 CVE-2024-0519"
tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
HackTricks