diff --git a/src/pentesting-web/xss-cross-site-scripting/integer-overflow.md b/src/pentesting-web/xss-cross-site-scripting/integer-overflow.md index d5162b8e5..a8666e18c 100644 --- a/src/pentesting-web/xss-cross-site-scripting/integer-overflow.md +++ b/src/pentesting-web/xss-cross-site-scripting/integer-overflow.md @@ -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}}