整数オーバーフロー
整数オーバーフロー とは何ですか?
整数オーバーフロー算術演算の結果が整数型の表現可能範囲を超え、ラップアラウンドや切り詰めがセキュリティ上重大な影響を及ぼすバグ。
整数オーバーフローは、計算結果が整数型の表現できる最大値(または最小値)を超え、ラップアラウンド・符号反転・切り詰めが生じる現象です。誤った値がその後バッファサイズ、ループカウンタ、配列インデックス、認可判定などに用いられるとセキュリティ問題となり、しばしばバッファオーバーフロー・無限ループ・上限のバイパスを引き起こします。
典型的なパターン。 よくある落とし穴が malloc(count * size) です。count * size が SIZE_MAX を超えてラップアラウンドすると、アロケータはコードが想定するよりもはるかに小さいバッファを返し、続くコピーが末尾を越えて書き込みます。これは誤った memcpy の長さではなく、乗算によって引き起こされるオーバーフローです。2015 年の Android の Stagefright 系脆弱性(CVE-2015-1538)はまさにこれを突きました。MP4 ファイルの stsc メタデータアトムにおける整数オーバーフローが小さすぎるヒープ確保を招き、たった 1 通の MMS メッセージで、推定約 9 億 5000 万台のデバイスにおいてリモートコード実行を成立させたのです。2002 年の OpenSSH の challenge-response の欠陥(CVE-2002-0639)や、多くの画像コーデック・フォントパーサのバグも同じ形をしています。符号付きから符号なしへの変換は関連する罠です。負の長さが巨大な符号なし値として解釈されると、if (len > max) のような素朴なチェックが破られます。
対策としては、検査付き算術(Rust の checked_add/checked_mul、C23 の ckd_*、コンパイラの -ftrapv や UBSan)、より広い型で計算してから縮める前に範囲チェックを行う手法、対象領域に合った型の選択、確保の前に攻撃者が制御するサイズを検証すること、そしてパーサへの積極的なファズテストが挙げられます。
flowchart TD
A[攻撃者が制御する<br/>count と size] --> B[size = count * elem]
B --> C{積が型の最大値を<br/>超えるか?}
C -->|いいえ| D[正しい確保]
C -->|はい| E[値が小さな数値へ<br/>ラップアラウンド]
E --> F[小さすぎるバッファを確保]
F --> G[コピーが末尾を越えて書き込み<br/>ヒープ破壊 / RCE]● 例
- 01
CVE-2002-0639(OpenSSH challenge-response):整数オーバーフローによりヒープが破壊される。
- 02
CVE-2015-1538(Android Stagefright):MP4 の 'stsc' アトムにおける整数オーバーフローでリモートコード実行が可能になる。
● よくある質問
整数オーバーフロー とは何ですか?
算術演算の結果が整数型の表現可能範囲を超え、ラップアラウンドや切り詰めがセキュリティ上重大な影響を及ぼすバグ。 サイバーセキュリティの 脆弱性 カテゴリに属します。
整数オーバーフロー とはどういう意味ですか?
算術演算の結果が整数型の表現可能範囲を超え、ラップアラウンドや切り詰めがセキュリティ上重大な影響を及ぼすバグ。
整数オーバーフロー からどのように防御しますか?
整数オーバーフロー に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。
整数オーバーフロー の別名は何ですか?
一般的な別名: 整数ラップアラウンド。