スマートコントラクト整数オーバーフロー脆弱性:防護措置の詳細

robot
概要作成中

整数オーバーフローの脆弱性とその防御

整数オーバーフローはプログラミングにおいて一般的な問題です。ほとんどのプログラミング言語では、整数値は固定長のメモリに格納されます。整数は符号なし数と符号付き数の2種類に分かれ、違いは最上位ビットが符号ビットとして使用されるかどうかです。例えば、32ビットのメモリは0から4,294,967,295の範囲の符号なし整数(uint32)、または-2,147,483,648から2,147,483,647の範囲の符号付き整数(int32)を格納できます。

整数型が表現できる範囲を超える計算結果が出ると、オーバーフローが発生します。ほとんどのプログラミング言語やコンパイラはこの種のエラーをチェックせず、単にモジュロ演算を実行するか、未定義の動作を引き起こします。これにより、プログラムの実行結果が予期しないものになる可能性があります。ブロックチェーンのスマートコントラクトの記述において、特に分散型金融の分野では整数計算が一般的であるため、整数オーバーフローの脆弱性に特に注意が必要です。

整数オーバーフローは、上オーバーフローと下オーバーフローの2つの状況に分けられます:

  1. オーバーフロー: 計算結果が型が表現できる最大値を超えること。例えば、uint32の0xFFFFFFFFに1を加えると0x00000000になる。

  2. アンダーフロー: 計算結果が型が表現できる最小値よりも小さくなること。例えば、uint32の0から1を引くと0xFFFFFFFFになります。

!

2018年4月、BeautyChain(BEC)トークン契約は整数オーバーフローの脆弱性のために攻撃され、攻撃者は大量のトークンを取得しました。この脆弱性はbatchTransfer関数に存在し、乗算オーバーフローのチェックがないため、少量のトークン残高で大量のトークンを引き出すことができました。

!

整数オーバーフローを防ぐために、以下の対策を講じることができます:

  1. Rustのコンパイルオプションを設定し、releaseモードでも整数オーバーフローをチェックしてpanicをトリガーします。

  2. uintクレートを使用して、U256、U512などのより大きな整数型をサポートします。

  3. uint型の変換関数を使用してオーバーフローを検出します。例えば、as_u128()。

  4. 計算がオーバーフローするかどうかを確認するために、Safe Math関数のchecked_add()を使用します。

これらの方法を使用することで、整数オーバーフローの脆弱性を効果的に回避し、スマートコントラクトの安全性を向上させることができます。大きな数値計算を含むコントラクトを書く際には、整数オーバーフローの問題を慎重に扱うことが不可欠です。

!

SAFE-1.68%
MATH-7.95%
原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • 5
  • 共有
コメント
0/400
AirdropHunterXiaovip
· 11時間前
オーバーフロー?クリップクーポンを取られるの?
原文表示返信0
gas_guzzlervip
· 12時間前
開発前にオーバーフローを調整するのを忘れないでください、兄弟たち
原文表示返信0
0xInsomniavip
· 12時間前
溢れ出しはどれだけ多くの初心者を苦しめたのか
原文表示返信0
AirdropHunterZhangvip
· 12時間前
白人の売春パーティーは頭痛の種です
原文表示返信0
0xOverleveragedvip
· 12時間前
スワップ夫人がまたいなくなった
原文表示返信0
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)