区块链研究实验室-智能合约数据下溢攻击案例分析

攻击#下溢

尽管DAO合同并未成为下溢攻击的受害者,但我们可以利用现有的babyDAO合同{}来更好地了解这种过于常见的攻击方式。

首先我们了解uint256是什么。 uint256是256位的无符号整数(无符号,只有正整数)。以太坊虚拟机被设计为使用256位作为其字大小,或者由计算机的CPU一次处理的位数。由于EVM的大小限制为256位,因此分配的编号范围为0到4,294,967,295(2²⁵⁶)。如果我们超过这个范围,数字将重置到范围的底部(2²⁵⁶+ 1 = 0)。如果我们进入这个范围,数字将重置到范围的顶端(0-1 =2²⁵⁶)。

当我们从零中减去一个大于零的数字时,会发生下溢,从而产生一个新分配的2²⁵⁶整数。现在如果攻击者的余额出现下溢,则会更新余额,以便所有资金都可能被盗。

如何攻击

  1. 攻击者通过向目标合同发送1 Wei发起攻击;

  2. 合同将发送方的资金记入贷方;

  3. 随后撤回相同的1 Wei;

  4. 合同从发件人的信用中减去1 Wei,现在余额再次为零;

  5. 由于目标合同向攻击者发送以太币,攻击者的撤回功能也会触发,并再次调用撤消;

  6. 撤回的1 Wei被记录在合同中;

  7. 攻击者合同的余额已更新两次,第一次为零,第二次为-1;

  8. 攻击者的余额重置为2²⁵⁶;

  9. 攻击者通过撤回目标合同的所有资金来完成攻击;

攻击代码

解决方案

为避免成为下溢攻击的受害者,最佳做法是检查更新的整数是否保持在其字节范围内。 我们可以在代码中添加参数检查以充当最后一道防线。 第一行函数withdraw()检查是否有足够的资金,第二行检查溢出,第三行检查是否有下溢。

本文转载公众号:区块链研究实验室

猜你喜欢

转载自blog.csdn.net/willam1/article/details/86687279