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

# Tam Sayı Taşması (Web Uygulamaları)
{{#include ../../banners/hacktricks-training.md}}
> Bu sayfa, **tam sayı taşmalarının/kesimlerinin web uygulamalarında ve tarayıcılarda nasıl kötüye kullanılabileceğine** odaklanmaktadır. Yerel ikili dosyalar içindeki istismar ilkeleri için özel sayfayı okumaya devam edebilirsiniz:
>
>
{{#ref}}
> ../../binary-exploitation/integer-overflow.md
> {{#endref}}
---
## 1. Neden tam sayı matematiği web'de hala önemlidir
Modern yığınlardaki çoğu iş mantığı *bellek güvenli* dillerde yazılmış olsa da, temel çalışma zamanı (veya üçüncü taraf kütüphaneler) nihayetinde C/C++ ile uygulanmaktadır. Kullanıcı kontrolündeki sayılar tamponları ayırmak, ofsetleri hesaplamak veya uzunluk kontrolleri yapmak için kullanıldığında, **32-bit veya 64-bit sarılması, görünüşte zararsız bir parametreyi sınır dışı okuma/yazma, mantık atlaması veya DoS'a dönüştürebilir**.
Tipik saldırı yüzeyi:
1. **Sayısal istek parametreleri** klasik id, ofset veya sayı alanları.
2. **Uzunluk / boyut başlıkları** Content-Length, WebSocket çerçeve uzunluğu, HTTP/2 continuation_len, vb.
3. **Sunucu tarafında veya istemci tarafında ayrıştırılan dosya formatı meta verileri** resim boyutları, parça boyutları, yazı tipi tabloları.
4. **Dil düzeyinde dönüşümler** PHP/Go/Rust FFI'de işaretli↔işaretsiz dönüşümler, V8 içinde JS Number → int32 kesimleri.
5. **Kimlik doğrulama ve iş mantığı** sessizce taşan kupon değeri, fiyat veya bakiye hesaplamaları.
---
## 2. Son zamanlardaki gerçek dünya zafiyetleri (2023-2025)
| Yıl | Bileşen | Temel neden | Etki |
|------|-----------|-----------|--------|
| 2023 | **libwebp CVE-2023-4863** | Çözülmüş piksel boyutunu hesaplarken 32-bit çarpma taşması | Chrome 0-günü tetikledi (iOS'ta BLASTPASS), *uzaktan kod yürütme* izni verdi. |
| 2024 | **V8 CVE-2024-0519** | JSArray büyütülürken 32-bit'e kesilme, destekleyici depoda OOB yazmaya yol açar | Tek bir ziyaret sonrası uzaktan kod yürütme. |
| 2025 | **Apollo GraphQL Server** (yayınlanmamış yamanın) | İlk/son sayfalama argümanları için kullanılan 32-bit işaretli tam sayı; negatif değerler büyük pozitiflere sarılır | Mantık atlaması ve bellek tükenmesi (DoS). |
---
## 3. Test stratejisi
### 3.1 Sınır değeri ipucu sayfası
Bir tam sayı beklenirken **aşırı işaretli/işaretsiz değerler** gönderin:
```
-1, 0, 1,
127, 128, 255, 256,
32767, 32768, 65535, 65536,
2147483647, 2147483648, 4294967295,
9223372036854775807, 9223372036854775808,
0x7fffffff, 0x80000000, 0xffffffff
```
Diğer yararlı formatlar:
* Hex (0x100), sekizli (0377), bilimsel (1e10), JSON büyük-tamsayı (9999999999999999999).
* Özel ayrıştırıcılara ulaşmak için çok uzun rakam dizileri (>1kB).
### 3.2 Burp Intruder şablonu
```
§INTEGER§
Payload type: Numbers
From: -10 To: 4294967300 Step: 1
Pad to length: 10, Enable hex prefix 0x
```
### 3.3 Fuzzing kütüphaneleri ve çalışma zamanları
* **AFL++/Honggfuzz** ile parser etrafında libFuzzer harness (örn., WebP, PNG, protobuf).
* **Fuzzilli** JavaScript motorlarının dil bilgisi farkındalığı ile fuzzing'i, V8/JSC tam sayı kesmelerine ulaşmak için.
* **boofuzz** uzunluk alanlarına odaklanan ağ protokolü fuzzing'i (WebSocket, HTTP/2).
---
## 4. Sömürü desenleri
### 4.1 Sunucu tarafı kodunda mantık atlatma (PHP örneği)
```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 Görüntü kodlayıcı aracılığıyla yığın taşması (libwebp 0-günü)
WebP kayıpsız kodlayıcı, 32-bit int içinde görüntü genişliğini × yüksekliğini × 4 (RGBA) ile çarpar. 16384 × 16384 boyutlarına sahip bir dosya, çarpımı taşır, kısa bir tampon ayırır ve ardından yığının ötesine **~1GB** sıkıştırılmamış veri yazar bu da 116.0.5845.187 öncesindeki her Chromium tabanlı tarayıcıda RCE'ye yol açar.
### 4.3 Tarayıcı tabanlı XSS/RCE zinciri
1. V8'deki **tamsayı taşması**, keyfi okuma/yazma sağlar.
2. İkinci bir hata ile kum havuzunu aşın veya bir yük bırakmak için yerel API'leri çağırın.
3. Yük, ardından köken bağlamına kötü niyetli bir betik enjekte eder → saklanan XSS.
---
## 5. Savunma yönergeleri
1. **Geniş türler veya kontrol edilen matematik kullanın** örneğin, size_t, Rust checked_add, Go math/bits.Add64.
2. **Aralıkları erken doğrulayın**: aritmetik işlemden önce iş alanının dışındaki herhangi bir değeri reddedin.
3. **Derleyici sanitizasyonlarını etkinleştirin**: -fsanitize=integer, UBSan, Go yarış dedektörü.
4. **CI/CD'de fuzzing benimseyin** kapsama geri bildirimini sınır verileri ile birleştirin.
5. **Yaman kalın** tarayıcı tamsayı taşması hataları genellikle haftalar içinde silahlandırılır.
---
## Referanslar
* [NVD CVE-2023-4863 libwebp Yığın Tampon Taşması](https://nvd.nist.gov/vuln/detail/CVE-2023-4863)
* [Google Project Zero "V8 CVE-2024-0519'u Anlamak"](https://googleprojectzero.github.io/)
{{#include ../../banners/hacktricks-training.md}}