脆弱性: ガス制限の脆弱性 (Vulnerability: Gas Limit Vulnerabilities)

説明:

Ethereum や他のブロックチェーンプラットフォームでは、スマートコントラクトが実行するすべての操作で、計算処理の単位である一定量のガスを消費します。ブロックガス制限は一つのブロックで使用できるガスの最大量です。スマートコントラクトの機能が、その実行を完了するためにブロックガス制限を超えるガスを必要とする場合、トランザクションは失敗します。このタイプの脆弱性は、反復回数が固定されておらず、任意に大きくなる可能性がある配列やリストなどの動的なデータ構造を反復処理するループで特によく見られます。

事例 :

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract TokenTransfer {
    mapping(address => uint256) public balances;

    function transfer(address _to, uint256 _amount) public {
        require(balances[msg.sender] >= _amount, "Insufficient balance");
        
        for (uint256 i = 0; i < _amount; i++) {  // The loop iterates _amount times, which can be very inefficient and can potentially exceed the block gas limit if _amount is too large.
            balances[msg.sender]--; 
            balances[_to]++; 
        }
    }
}

影響:

  • ガス制限の問題の影響を受けやすい機能は実行不能になる可能性があり、その結果、資金がロックされたり、コントラクトが凍結されます。ガス制限を超えたためにこれらの機能を完了できない場合、トランザクションに関連付けられた資金はアクセスできないままとなり、事実上コントラクト内でロックされます。

対策:

  • 機能は、大量のデータをトラバースするループ内で使用される変数の長さをユーザーが制御できないことを検証すべきです。省略できないのであれば、コードロジックに従って長さに制限を設ける必要があります。

  • Solidity でループが使用されるときは常に、開発者はループ内で発生するアクションに特に注意を払い、トランザクションが過剰なガスを消費することなく、ガス制限を超えないようにする必要があります。

Last updated