区块链安全

区块链安全第 9 课——重入攻击(二)

  • 重入攻击(一):理解 fallback function
  • 重入攻击(二):通过实例理解重入攻击
  • 重入攻击(三):DAO 攻击及重入攻击的防范

重入,就是外部恶意合约通过函数调用来“重新进入”漏洞合约的代码执行过程。

1. 漏洞合约

相信通过上面这么详细的注释,没有人看不懂这段合约代码。
这段合约的主要功能相当于一段理财存储代码:

  • 一个 address 可以向这个合约存钱
  • 满足一些限制条件的前提下,一个 address 可以向这个合约取钱

Ropsten contract address: 0xD72c7a898385e1DDe55a6Bf23dC2093A67C8d252

https://ropsten.etherscan.io/address/0xD72c7a898385e1DDe55a6Bf23dC2093A67C8d252

2. 攻击代码

注意在部署的时候,deploy 的参数一定要写入部署好的 EtherStore 合约的地址:

否则会得到如下报错:

creation of Attack errored: Error encoding arguments: Error: invalid address (argument="address", value="", code=INVALID_ARGUMENT, version=address/5.4.0) (argument=null, value="", code=INVALID_ARGUMENT, version=abi/5.4.0)

部署地址:
https://ropsten.etherscan.io/address/0xc85d83b688a88adEf08e9dc236BAF25f196bD98A

3. 攻击过程

首先向 EtherStore 合约存钱:

这个地方因为我太菜了真的试了很多次,尝试过程和遇到的问题可以看这个文档:https://shimo.im/docs/WXh3RhQyhYCyrg8W/

但是最终存入钱成功:

然后去尝试攻击函数:

然后点击 attackEtherStore:

最终 EtherStore 合约的余额仅剩1:

而 Attack 合约的余额接受了来自 EtherStore 合约的多次 transfer,最终为4:

4. 代码分析

根据如上的代码流程分析,相信很容易理解。
个人觉得导致重入攻击的关键点在于:

  1. 漏洞合约的函数中存在对触发地址的 fallback function 调用,导致可以构造恶意合约 fallback function 中插入恶意代码重入漏洞合约函数
  2. 对于判断条件的更新放在了触发 fallback function 之后,导致没起到作用