mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/xss-cross-site-scripting/integer-overflo
This commit is contained in:
parent
7007cc6e1d
commit
17bbb4b9c1
@ -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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user