Solidity 智能合约安全漏洞——普通重入攻击

普通重入攻击

重入攻击(Re-Entrancy) 一直是以太坊智能合约中最危险的漏洞之一,导致了许多大规模的资金被盗事件。比如 2016 年发生在 The DAO 项目中的 Re-Entrancy 漏洞攻击,造成价值当时 6000 万美元的以太币被盗,直接导致以太坊主网硬分叉。

那么,什么是 Re-Entrancy 漏洞?它为何如此危险,如何防范,让我们一一深入解析。

Re-Entrancy 漏洞原理

Re-Entrancy 漏洞本质上是一个状态同步问题。当智能合约调用外部函数时,执行流会转移到被调用的合约。如果调用合约未能正确同步状态,就可能在转移执行流时被再次调用,从而重复执行相同的代码逻辑。

具体来说,攻击往往分两步:

1.被攻击的合约调用了攻击合约的外部函数,并转移了执行流。

2.在攻击合约函数中,利用某些技巧再次调用被攻击合约的漏洞函数。

由于 EVM 是单线程的,重新进入漏洞函数时,合约状态并未被正确更新,就像第一次调用一样。这样攻击者就能够多次重复执行一些代码逻辑,从而实现非预期的行为。典型的攻击模式是多次重复提取资金。
Solidity 智能合约安全漏洞——普通重入攻击_第1张图片

Re-Entrancy漏洞合约

以一个修改过的 WETH 合约为例:

contract EtherStore {
   
    mapping(address => uint256) public balances;

    function deposit() public payable {
   
        balances[msg.sender] += msg.value;
    }

    function withdraw() public {
   
        uint256 bal = balances[msg.sender];
        require(bal > 0);

        (bool sent,) = msg.sender.call{
   value: bal}("");
        require(sent, "Fail

你可能感兴趣的:(区块链,智能合约)