Przepełnienie całkowite (Aplikacje internetowe)

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

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)

RokKomponentPrzyczynaWpływ
2023libwebp – CVE-2023-4863Przepełnienie mnożenia 32-bitowego podczas obliczania rozmiaru odkodowanego pikselaWywołało 0-day w Chrome (BLASTPASS na iOS), umożliwiło zdalne wykonanie kodu wewnątrz piaskownicy renderera.
2024V8 – CVE-2024-0519Truncacja do 32-bitów podczas powiększania JSArray prowadzi do zapisu OOB w pamięci podręcznejZdalne wykonanie kodu po jednej wizycie.
2025Apollo 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 dodatnichObejś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

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