整数オーバーフローとは何ですか?
Solidity では、整数はデフォルトで 256 ビットです。加算演算を行う際に、結果が 256 ビットを超えるとオーバーフローが発生します。これにより予期しない結果が生じ、ハッカーに悪用される可能性があります。
例えば、ユーザー A が 10 個のトークンを契約に入金し、契約がトークンの残高を計算する際には、検証のない uint256 変数 balance を使用します。その後、ハッカーが非常に大きな値を入力することで演算がオーバーフローし、balance が再度 0 から計算され、ハッカーは無制限にトークンを引き出すことができます。
整数オーバーフローを防ぐ方法:
安全な数学ライブラリを使用し、オーバーフローの起こりやすい演算を直接呼び出さないようにする。例えば、Safemath を使用する。
重要な変数にオーバーフローチェックを導入し、変更前に新しい値が妥当かどうかを確認する。
オーバーフローの起こりやすい関数のループ呼び出しを避ける。ユーザーの呼び出し回数を制限する。
コード例:
// Bad
uint256 balance;
function add(uint256 value) external {
balance += value;
}
// Good
using SafeMath for uint256;
uint256 balance;
function add(uint256 value) external {
balance = balance.add(value);
require(balance >= value, "Overflow detected");
}