Translated ['src/pentesting-web/xss-cross-site-scripting/integer-overflo

This commit is contained in:
Translator 2025-07-24 16:26:34 +00:00
parent 7007cc6e1d
commit 17bbb4b9c1

View File

@ -1,11 +1,104 @@
# 整数オーバーフロー
# 整数オーバーフロー (ウェブアプリケーション)
{{#include ../../banners/hacktricks-training.md}}
チェック:
> このページは、**整数オーバーフロー/切り捨てがウェブアプリケーションやブラウザでどのように悪用されるか**に焦点を当てています。ネイティブバイナリ内のエクスプロイトプリミティブについては、専用ページを読み続けることができます:
>
> {{#ref}}
> ../../binary-exploitation/integer-overflow.md
> {{#endref}}
{{#ref}}
../../binary-exploitation/integer-overflow.md
{{#endref}}
---
## 1. なぜウェブ上で整数計算が依然として重要なのか
現代のスタックのほとんどのビジネスロジックは*メモリ安全*な言語で書かれていますが、基盤となるランタイムまたはサードパーティライブラリは最終的にC/C++で実装されています。ユーザー制御の数値がバッファの割り当て、オフセットの計算、または長さチェックに使用されるとき、**32ビットまたは64ビットのラップアラウンドが、見かけ上無害なパラメータを境界外の読み書き、ロジックバイパス、またはDoSに変える可能性があります**。
典型的な攻撃面:
1. **数値リクエストパラメータ** クラシックな`id``offset`、または`count`フィールド。
2. **長さ/サイズヘッダー** `Content-Length`、WebSocketフレームの長さ、HTTP/2 `continuation_len`など。
3. **サーバー側またはクライアント側で解析されるファイル形式メタデータ** 画像の寸法、チャンクサイズ、フォントテーブル。
4. **言語レベルの変換** PHP/Go/Rust FFIの符号付き↔符号なしキャスト、V8内のJS `Number``int32`切り捨て。
5. **認証とビジネスロジック** クーポンの価値、価格、または残高計算が静かにオーバーフローする。
---
## 2. 最近の実世界の脆弱性 (2023-2025)
| 年 | コンポーネント | 根本原因 | 影響 |
|------|----------------------------------|-------------------------------------------------------------|------------------------------------------------------------|
| 2023 | **libwebp CVE-2023-4863** | デコードされたピクセルサイズを計算する際の32ビット乗算オーバーフロー | Chromeの0-dayを引き起こしiOSでの`BLASTPASS`)、レンダラーサンドボックス内での*リモートコード実行*を許可。 |
| 2024 | **V8 CVE-2024-0519** | `JSArray`を成長させる際の32ビットへの切り捨てがバックストアでのOOB書き込みを引き起こす | 単一の訪問後にリモートコード実行。 |
| 2025 | **Apollo GraphQL Server** (未公開パッチ) | `first/last`ページネーション引数に使用される32ビット符号付き整数; 負の値が巨大な正の値にラップする | ロジックバイパスとメモリ枯渇DoS。 |
---
## 3. テスト戦略
### 3.1 境界値チートシート
整数が期待される場所に**極端な符号付き/符号なしの値**を送信します:
```
-1, 0, 1,
127, 128, 255, 256,
32767, 32768, 65535, 65536,
2147483647, 2147483648, 4294967295,
9223372036854775807, 9223372036854775808,
0x7fffffff, 0x80000000, 0xffffffff
```
他の便利なフォーマット:
* 16進数 (`0x100`)、8進数 (`0377`)、科学的表記 (`1e10`)、JSON big-int (`9999999999999999999`)。
* カスタムパーサーにヒットさせるための非常に長い数字列 (>1kB)。
### 3.2 Burp Intruder テンプレート
```
§INTEGER§
Payload type: Numbers
From: -10 To: 4294967300 Step: 1
Pad to length: 10, Enable hex prefix 0x
```
### 3.3 ファジングライブラリとランタイム
* **AFL++/Honggfuzz**`libFuzzer` ハーネスを使用したパーサー周りWebP、PNG、protobuf
* **Fuzzilli** JavaScriptエンジンの文法を意識したファジングでV8/JSCの整数切り捨てを狙う。
* **boofuzz** 長さフィールドに焦点を当てたネットワークプロトコルファジングWebSocket、HTTP/2
---
## 4. エクスプロイトパターン
### 4.1 サーバーサイドコードにおけるロジックバイパス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 画像デコーダーによるヒープオーバーフロー (libwebp 0-day)
WebPのロスレスデコーダーは、32ビットの`int`内で画像の幅 × 高さ × 4 (RGBA)を掛け算しました。`16384 × 16384`の寸法を持つファイルを作成すると、掛け算がオーバーフローし、短いバッファが割り当てられ、その後ヒープを超えて**~1GB**の解凍データが書き込まれます これにより、116.0.5845.187以前のすべてのChromiumベースのブラウザでRCEが発生します。
### 4.3 ブラウザベースのXSS/RCEチェーン
1. V8での**整数オーバーフロー**により、任意の読み書きが可能になります。
2. 2つ目のバグでサンドボックスを脱出するか、ネイティブAPIを呼び出してペイロードを落とします。
3. ペイロードは、オリジンコンテキストに悪意のあるスクリプトを注入します → ストレージXSS。
---
## 5. 防御ガイドライン
1. **広い型またはチェック付き数学を使用する** 例: `size_t`、Rust `checked_add`、Go `math/bits.Add64`
2. **範囲を早期に検証する**: 算術演算の前にビジネスドメイン外の値を拒否します。
3. **コンパイラのサニタイザーを有効にする**: `-fsanitize=integer`、UBSan、Goレース検出器。
4. **CI/CDでファジングを採用する** カバレッジフィードバックと境界コーパスを組み合わせます。
5. **パッチを適用し続ける** ブラウザの整数オーバーフローのバグは、数週間以内に頻繁に武器化されます。
---
## 参考文献
* [NVD CVE-2023-4863 libwebp ヒープバッファオーバーフロー](https://nvd.nist.gov/vuln/detail/CVE-2023-4863)
* [Google Project Zero "V8 CVE-2024-0519の理解"](https://googleprojectzero.github.io/)
{{#include ../../banners/hacktricks-training.md}}