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