# 整数オーバーフローの脆弱性とその防御整数オーバーフローはプログラミングにおいて一般的な問題です。ほとんどのプログラミング言語では、整数値は固定長のメモリに格納されます。整数は符号なし数と符号付き数の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になります。! [](https://img-cdn.gateio.im/social/moments-32d8be6f4cc27be94c5669eb0de8cfe3)2018年4月、BeautyChain(BEC)トークン契約は整数オーバーフローの脆弱性のために攻撃され、攻撃者は大量のトークンを取得しました。この脆弱性はbatchTransfer関数に存在し、乗算オーバーフローのチェックがないため、少量のトークン残高で大量のトークンを引き出すことができました。! [](https://img-cdn.gateio.im/social/moments-f49145e0d7d3db85372af7a8675e62ea)整数オーバーフローを防ぐために、以下の対策を講じることができます:1. Rustのコンパイルオプションを設定し、releaseモードでも整数オーバーフローをチェックしてpanicをトリガーします。2. uintクレートを使用して、U256、U512などのより大きな整数型をサポートします。3. uint型の変換関数を使用してオーバーフローを検出します。例えば、as_u128()。4. 計算がオーバーフローするかどうかを確認するために、Safe Math関数のchecked_add()を使用します。これらの方法を使用することで、整数オーバーフローの脆弱性を効果的に回避し、スマートコントラクトの安全性を向上させることができます。大きな数値計算を含むコントラクトを書く際には、整数オーバーフローの問題を慎重に扱うことが不可欠です。! [](https://img-cdn.gateio.im/social/moments-769305b04302260fff84b99fd6ae0669)
スマートコントラクト整数オーバーフロー脆弱性:防護措置の詳細
整数オーバーフローの脆弱性とその防御
整数オーバーフローはプログラミングにおいて一般的な問題です。ほとんどのプログラミング言語では、整数値は固定長のメモリに格納されます。整数は符号なし数と符号付き数の2種類に分かれ、違いは最上位ビットが符号ビットとして使用されるかどうかです。例えば、32ビットのメモリは0から4,294,967,295の範囲の符号なし整数(uint32)、または-2,147,483,648から2,147,483,647の範囲の符号付き整数(int32)を格納できます。
整数型が表現できる範囲を超える計算結果が出ると、オーバーフローが発生します。ほとんどのプログラミング言語やコンパイラはこの種のエラーをチェックせず、単にモジュロ演算を実行するか、未定義の動作を引き起こします。これにより、プログラムの実行結果が予期しないものになる可能性があります。ブロックチェーンのスマートコントラクトの記述において、特に分散型金融の分野では整数計算が一般的であるため、整数オーバーフローの脆弱性に特に注意が必要です。
整数オーバーフローは、上オーバーフローと下オーバーフローの2つの状況に分けられます:
オーバーフロー: 計算結果が型が表現できる最大値を超えること。例えば、uint32の0xFFFFFFFFに1を加えると0x00000000になる。
アンダーフロー: 計算結果が型が表現できる最小値よりも小さくなること。例えば、uint32の0から1を引くと0xFFFFFFFFになります。
!
2018年4月、BeautyChain(BEC)トークン契約は整数オーバーフローの脆弱性のために攻撃され、攻撃者は大量のトークンを取得しました。この脆弱性はbatchTransfer関数に存在し、乗算オーバーフローのチェックがないため、少量のトークン残高で大量のトークンを引き出すことができました。
!
整数オーバーフローを防ぐために、以下の対策を講じることができます:
Rustのコンパイルオプションを設定し、releaseモードでも整数オーバーフローをチェックしてpanicをトリガーします。
uintクレートを使用して、U256、U512などのより大きな整数型をサポートします。
uint型の変換関数を使用してオーバーフローを検出します。例えば、as_u128()。
計算がオーバーフローするかどうかを確認するために、Safe Math関数のchecked_add()を使用します。
これらの方法を使用することで、整数オーバーフローの脆弱性を効果的に回避し、スマートコントラクトの安全性を向上させることができます。大きな数値計算を含むコントラクトを書く際には、整数オーバーフローの問題を慎重に扱うことが不可欠です。
!