SC01:2025 - 不適切なアクセス制御 (Improper Access Control)

説明:

アクセス制御の脆弱性とは、認可されていないユーザーがコントラクトのデータや機能にアクセスしたり変更できるセキュリティ上の欠陥です。これらの脆弱性は、コントラクトのコードがユーザーのパーミッションレベルに基づいてアクセスを適切に制限できない場合に発生します。スマートコントラクトのアクセス制御は、トークンの生成、プロポーザルの採択、資金の引き出し、コントラクトの一時停止とアップグレード、所有権の変更など、ガバナンスや重要なロジックに関連することがあります。

事例 (脆弱なコントラクト):

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

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

    // Burn function with no access control
    function burn(address account, uint256 amount) public {
        _burn(account, amount);
    }
}

影響:

  • 攻撃者はコントラクト内の重要な機能やデータへの認可されていないアクセスを獲得して、その完全性とセキュリティを危険にさらす可能性があります。

  • 脆弱性は、コントラクトによって管理されている資金や資産の窃取につながり、ユーザーや利害関係者に重大な金銭的損害を引き起こす可能性があります。

対策:

  • 初期化関数は認可されたエンティティによってのみ一度だけ排他的に呼び出されるようにします。

  • コントラクトに Ownable や RBAC (Role-Based Access Control) などの確立されたアクセス制御パターンを使用してパーミッションを管理し、認可されたユーザーだけが特定の機能にアクセスできるようにします。これは機密性の高い機能に onlyOwner やカスタムロールなどの適切なアクセス制御修飾子を追加することで実現できます。

事例 (修正バージョン):

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

// Import the Ownable contract from OpenZeppelin to manage ownership
import "@openzeppelin/contracts/access/Ownable.sol";

contract Solidity_AccessControl is Ownable {
    mapping(address => uint256) public balances;

    // Burn function with proper access control, only accessible by the contract owner
    function burn(address account, uint256 amount) public onlyOwner {
        _burn(account, amount);
    }
}

不適切なアクセス制御攻撃の被害を受けたスマートコントラクトの事例:

Last updated