Integer Overflow Attackとは?
Integer Overflow Attackは、プログラム内の数値が最大値に達して回り込みを起こすと発生します。これにより攻撃者が残高や上限を操作できるようになります。暗号資産の世界では、その回り込みが「トークンは十分にありますか?」というチェックを、本来は否であるべきところで肯定させてしまうことがあります。古い車のオドメーターが999999から000000に戻る様子を想像してください。ただし今回は金銭がかかっています。
「最新のコンパイラなら不可能だ」と言われますが、完全ではありません。多くの スマートコントラクト では、一部に未検査の算術演算や独自実装の数学処理、あるいはアセンブリが使われており、オーバーフローのバグが再発することがあります。
Integer Overflow Attackの仕組み
以下はトークンコントラクトを例にした簡単な流れです。
- Step 1: コントラクトは固定長整数で残高を保管し、金額を加算、減算、乗算する関数を持っています。
- Step 2: 攻撃者は数値を最大値を超えるような入力を選び、回り込みで小さな値やゼロのような値に変えてしまいます。
- Step 3: その回り込みでチェックが裏返ります。例:回り込み後に残高が巨大に見えたり送金上限が極端に小さく見えたりして、本来は通らないはずの require が通ってしまいます。
- Step 4: 攻撃者は未獲得のトークンを発行したり、上限を迂回したり、本来移動できない資金を移したりします。
- Step 5: 得た資金を取引やブリッジで流し、誰かが気づく前に抜けます。
実話:いくつかのERC20トークンではかつてバッチ処理のオーバーフローバグがあり、攻撃者がとんでもない量のトークンを発行して取引所で売り抜けたことがあります。本当に起きました。
Integer Overflow Attackが重要な理由
トークンを保有している人、アプリを作る人、DeFiで取引する人は知っておくべきです。これは数値の問題であり、数が暗号資産を動かしています。
- Benefit: 仕組みを知っていれば早期に危険信号を発見し資金を守りやすくなります。
- Perspective: 算術のバグは昔から存在します。新しいチェーンやツールが出ても、数学的なミスは攻撃者に狙われ続けます。
- Relevance: トークン供給の計算、報酬システム、NFTのカウンター、ユーザー残高を扱う人気の 分散型アプリ などで見られます。
Solidityでは算術演算をデフォルトで検査付きにし、uncheckedブロックは極力小さくして監査を行ってください。ハッピーパスだけでなく極端な値を試すファズテストを追加しましょう。
Integer Overflow Attackの主な特徴
他のバグと比べての特徴:
- Wraparound: 数値が最大から0に戻る、ループするカウンタのような挙動。
- Silent: 算術が未検査だとネイティブのエラーが出ず、失敗が正当な結果のように見える。
- Triggerable: 多くの場合、ユーザーの入力で正確なタイミングを発生させられる。
- Repeatable: 一度見つかれば攻撃者はスクリプト化して多数のターゲットに対して繰り返し実行できる。
バリエーション
よくあるタイプを紹介します:
- Underflow: 減算が0未満になり回り込んで巨大な値になる。
- Addition: 残高や供給に加算して最大値を超え、小さな値に戻る。
- Multiplication: 報酬の倍率やスケーリング係数で値が限界を超える。
- Counter: トークンIDや供給のカウンタがロールオーバーし、ミントが上限を超えて続いてしまう。
Integer Overflow AttackはSolidityだけの問題ではありません。Vyper、Rust、Move、カスタムアセンブリでも現れますし、公表された多くの エクスプロイト は残高や供給の周りの未検査の算術に起因しています。
例
ある報酬関数がユーザー入力の数に大きなボーナスを掛けると、値が回り込み、上限チェックが通ってしまい、Integer Overflow Attackにより攻撃者が想定よりはるかに多くのトークンを発行できてしまう場合があります。
豆知識
レベル256で止まることで有名なアーケードの名作のフリーズは、整数のオーバーフローが原因でした。レトロゲームでさえ暗号関連のバグを偶然示すことがあると分かります。
まとめ
Integer Overflow Attackは数値が一周して隙が生まれ、そこを悪用されるイメージです。算術を検査付きにしておけば安心感が増します。
