skka3134

skka3134

email
telegram

智能契約のセキュリティ:2. EOAチェックの回避

EOA チェックをバイパスするとは何ですか?

多くの DeFi 契約では、重要な操作は EOA のみが許可されています。契約アドレスは呼び出すことができません。これは msg.sender をチェックすることで実現されています。しかし、攻撃者は自身の悪意のある契約で、EOS や delegatecall などの方法を使用して msg.sender を EOA アドレスに偽装することができます。これにより、チェックをバイパスすることができます。

EOA チェックをバイパスするための方法:

msg.sender だけでなく、tx.origin もチェックして、呼び出し元が EOA であることを確認します。
ユーザーの最初の呼び出し時に EOA を記録するために状態変数を使用し、後続の呼び出しでは recordedEOA を強制的に使用します。
安全なインターフェース契約で EOA チェックを行い、ユーザーはそのインターフェース契約を介してのみ呼び出すことができます。
OpenZeppelin の EOAChecker など、監査済みの安全なライブラリを使用します。

コード例:

// Also check tx.origin
require(msg.sender == tx.origin, "Not EOA");

// Record EOA on first call
address public userEOA; 

function initEOA() external {
  require(userEOA == address(0), "Already initialized");
  userEOA = msg.sender;
}

function criticalFunc() external {
  require(msg.sender == userEOA, "Only EOA can call");
  
  // Function logic
}
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。