スマートコントラクトのアクセス制御を理解する
アクセス制御は、アプリケーション内のユーザーの権限と役割に関する制限を定義します。スマートコントラクトにおけるアクセス制御は、ガバナンスや重要なロジック(トークンの発行、提案への投票、資金の引き出し、コントラクトの一時停止やアップグレード、所有権の変更など)に関連しています。
OpenZeppelinのアクセス制御ライブラリ
多くのスマートコントラクトでは、OpenZeppelinのOwnershipライブラリが使用されています。OpenZeppelinのOwnableは、「onlyOwner」のようなmodifierを定義し、関数呼び出しを行っているユーザーがコントラクトの所有者であるかどうかをチェックします。他のライブラリも、「hasRole」のようなmodifier/関数を使ってユーザーが関数を呼び出す権限を持っているかどうかをチェックします。スマートコントラクトは、要件に応じてカスタムロールを定義できます。これらのロールは特権ユーザーに割り当てられ、OpenZeppelinライブラリを使ってこれらのロールを検証することができます。
アクセス制御に関連する一般的な脆弱性
アクセス制御に関連する最も一般的な脆弱性は以下のように絞り込むことができます。
-
modifier検証の欠落 - 所有者の変更、資金およびトークンの移転、コントラクトの一時停止および再開などを実行する重要な関数には、アクセス制御の検証が必要です。modifierまたはrequire文や条件文内の検証が欠けていると、コントラクトの危険性や資金の損失がほぼ確実に発生します。
-
不正確なmodifier名 - 開発者のミスやスペルミスにより、modifierや関数の名前が意図したものとは異なる場合があります。悪意のある攻撃者は、modifierなしで重要な関数を呼び出すためにこれを悪用することもあり、関数のロジックによっては資金の損失や所有権の変更につながる可能性があります。
-
過剰な権限を持つロール - ユーザーに過剰な権限を持つロールを許可すると、脆弱性が生じる可能性があります。特権を割り当てる際には、最小限の特権の原則を常に守る必要があります。
Summary
スマートコントラクトのセキュリティは、アクセス制御の脆弱性によって深刻な影響を受けることがあります。攻撃者は資金を盗んだり、データを操作したり、コントラクトを破壊したりすることができます。コントラクトがアクセス制御攻撃に対して脆弱でないことを確認するために、コントラクト開発者は注意深く設計し、テストを行うべきです。また、modifierを使用する際はミススペルなどや検証漏れを防ぐために、既に多くの人に精査されて使用されているライブラリを使用することも大切です。