重入( Re-Entrancy )Bug

6月9日,开发商Peter Vessenes和Chriseth报告称,大多数基于以太坊的合约管理基金都可能容易受到可以清空合约资金的漏洞<<[2]>>的影响。几天后(6月12日)斯蒂芬·塔尔(Slock.It的创始人)报告说,DAO的代码并不容易受到彼得和克里斯描述的错误的影响。<<[3]>> 令人担忧的DAO贡献者暂时松了一口气,直到5天后(6月17日),一名未知的攻击者(“DAO攻击者”)开始使用类似于6月9日描述的漏洞利用DAO <<[4]>> 。最终,DAO攻击者从DAO中吸取了大约360万个ether。

同时,一群自称为Robinhood Group(RHG)的志愿者开始使用相同的漏洞来提取剩余的资金。6月21日,RHG宣布<<[5]>>他们已经获得了另外70%的DAO,约720万以太,并计划将其退还社区。RHG的快速行动和思考被给予了很多感谢和赞扬,这有助于保护社区的大部分ether。

Re-Entrancy技术

虽然Phil Daian <<[6]>> 描述了对该错误的更详细和详尽的解释,但简短的解释是可以在以太坊虚拟机上同时多次调用合约函数)。这允许DAO攻击者反复请求提取ether,并且在合约记录DAO攻击者已经提取之前,攻击者再次提取。

Re-Entrancy 攻击流程

想象一下,你的银行账户中有100美元,你可以向你的银行出纳员提取任意数量的提款单。银行出纳员按顺序为你提供每张单据的金额,并且只有在所有单据结束时才会记录你的提款。如果你给他们带来三张单,每张100美元怎么办?如果你给他们带来三千个怎么办?

换句话说,流程是:

  1. DAO攻击者要求DAO合约提取DAO tokens。

  2. 在合约更新其DAO被提取的记录之前,DAO攻击者要求合约再次提取DAO。

  3. 尽可能重复第二步。

  4. 合约最终记录了一次DAO的提取,失去了在此期间发生的取款。