xChar

什么是绕过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
}
Loading comments...