整数オーバーフロー (ウェブアプリケーション)

Reading time: 7 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

このページでは、整数オーバーフロー/切り捨てがウェブアプリケーションやブラウザでどのように悪用されるかに焦点を当てています。ネイティブバイナリ内のエクスプロイトプリミティブについては、専用ページを読み続けることができます:

{{#ref}}

../../binary-exploitation/integer-overflow.md {{#endref}}


1. なぜウェブ上で整数演算が重要なのか

現代のスタックのほとんどのビジネスロジックはメモリ安全な言語で書かれていますが、基盤となるランタイム(またはサードパーティライブラリ)は最終的にC/C++で実装されています。ユーザー制御の数値がバッファの割り当て、オフセットの計算、または長さチェックに使用されるとき、32ビットまたは64ビットのラップアラウンドが、見かけ上無害なパラメータを境界外の読み書き、ロジックバイパス、またはDoSに変える可能性があります

典型的な攻撃面:

  1. 数値リクエストパラメータ – クラシックなID、オフセット、またはカウントフィールド。
  2. 長さ/サイズヘッダー – Content-Length、WebSocketフレームの長さ、HTTP/2 continuation_lenなど。
  3. サーバー側またはクライアント側で解析されるファイル形式メタデータ – 画像の寸法、チャンクサイズ、フォントテーブル。
  4. 言語レベルの変換 – PHP/Go/Rust FFIにおける符号付き↔符号なしキャスト、V8内のJS Number → int32切り捨て。
  5. 認証とビジネスロジック – クーポンの価値、価格、または残高計算が静かにオーバーフローする。

2. 最近の実世界の脆弱性 (2023-2025)

コンポーネント根本原因影響
2023libwebp – CVE-2023-4863デコードされたピクセルサイズを計算する際の32ビット乗算オーバーフローChromeの0-dayを引き起こし(iOSのBLASTPASS)、レンダラーサンドボックス内でのリモートコード実行を許可。
2024V8 – CVE-2024-0519JSArrayを成長させる際の32ビットへの切り捨てがバックストアでのOOB書き込みを引き起こす単一の訪問後にリモートコード実行。
2025Apollo GraphQL Server (未公開パッチ)最初/最後のページネーション引数に使用される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ビッグ整数 (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 Fuzzing libraries & runtimes

  • AFL++/Honggfuzz は、パーサーの周りに libFuzzer ハーネスを持っています(例:WebP、PNG、protobuf)。
  • Fuzzilli – JavaScript エンジンの文法を意識したファジングで、V8/JSC の整数切り捨てを狙います。
  • boofuzz – 長さフィールドに焦点を当てたネットワークプロトコルファジング(WebSocket、HTTP/2)。

4. Exploitation patterns

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ビット整数内で画像の幅 × 高さ × 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. パッチを適用し続ける – ブラウザの整数オーバーフローバグは、数週間以内に頻繁に武器化されます。

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする