从技术角度剖析针对THE DAO的攻击手法

区块链技术巴比特2017-11-25 06:56:02  阅读 -评论 0

本文内容并非原创,而是来自对于以下两篇博文的翻译和解读。

Blog 1: http://vessenes.com/more-ethereum-attacks-race-to-empty-is-the-real-deal/
Blog 2: http://vessenes.com/deconstructing-thedao-attack-a-brief-code-tour/

一、攻击手法解密

由于攻击者是在创建childDAO并将Ether持续转入其中,这是目前唯一可行的提取Ether的机制,所以关注点从splitDAO函数开始。

splitDAO会创建childDAO(如果不存在的话),将分裂者拥有的Ether转入childDAO中,支付任何孽生的Reward(目前应该是0)然后返回。

根据白皮书的设计,splitDAO的本意是要保护投票中处于弱势地位的少数派防止他们被多数派通过投票的方式合法剥削。通过分裂出一个小规模的DAO,给予他们一个用脚投票的机制,同时仍然确保他们可以获取分裂前进行的对外资助产生的可能收益。

但通往地狱的道路就这样用鲜花铺就了。

根据BLOG 2,在DAO.sol中,function splitDAO函数有这样一行:

从技术角度剖析针对THE DAO的攻击手法

合约中,为msg.sender记录的dao币余额归零、扣减dao币总量totalSupply等等都发生在将发回msg.sender之后,这里是博主在Blog 1中指出的一个典型“反模式”。

接下来看withdrawRewardFor函数。目前github中所见最新代码并非部署于Ethereum livenet的代码,出问题的代码博主说是这样:

从技术角度剖析针对THE DAO的攻击手法

paidOut[_account] += reward 在原来代码里面放在payOut函数调用之后,最新github代码中被移到了payOut之前。
再看payOut函数调用。rewardAccount的类型是ManagedAccount,在ManagedAccount.sol中可以看到:

从技术角度剖析针对THE DAO的攻击手法

注意标深的这一行:对_recipient发出call调用,转账_amount个Wei,call调用默认会使用当前剩余的所有gas,此时call调用所执行的代码步骤数可能很多,基本只受攻击者所发消息的可用的gas限制。
把这些拼起来,黑客的攻击手法就浮现了:
1) 准备工作

黑客创建自己的黑客合约HC,该合约带有一个匿名的fallback函数。根据solidity的规范,fallback函数将在HC收到Ether(不带data)时自动执行。此fallback函数将通过递归触发对THE DAO的splitDAO函数的多次调用(但不会次数太多以避免gas不够),过程中还应该需要记录当前调用深度以控制堆栈使用情况。

2) 开始攻击
黑客向THE DAO多次提交split proposal,并将每个proposal的recipient地址都设定为HC地址,同时设定适当的gasLimit。调用栈就会这样:

从技术角度剖析针对THE DAO的攻击手法
提交split proposal
—> splitDAO函数(No. 1)
—> withdrawRewardFor函数 (No. 1,黑客的dao余额和dao总量此时没变!)
—> papOut 函数(No. 1,向HC发送以太第一次)
—> HC的fallback函数 (No. 1)
—->如果递归未达预设深度:调用split DAO函数(No. 2)
—> withdrawRewardFor函数(No. 2, 黑客dao余额等仍然没变!)
—> payOut函数(No. 2, 向HC发送以太第二次)
—> HC的fallback函数 (No. 2)
—> (继续递归)

3) 转款走人
转入childDAO的钱在一定时间后根据原合约可以提取,黑客收割韭菜的时候到了。

二、防范和思考

从代码看,本次攻击得逞的因素有二:一是dao余额扣减和Ether转账这两步操作的顺序有误,二是不受限制地执行未知代码。

应用代码顺序方面,应先扣减dao的余额再转账Ether,因为dao的余额检查作为转账Ether的先决条件,要求dao的余额状况必须能够及时反映最新状况。在问题代码实现中,尽管最深的递归返回并成功扣减黑客的dao余额,但此时对黑客dao余额的扣减已经无济于事,因为其上各层递归调用中余额检查都已成功告终,已经不会再有机会判断最新余额了。

不受限制地执行未知代码方面,虽然黑客当前是利用了solidity提供的匿名fallback函数,但这种对未知代码的执行原则上可以发生在更多场景下,因为合约之间的消息传递完全类似于面向对象程序开发中的方法调用,而提供接口等待回调是设计模式中常见的手法,所以完全有可能执行一个未知的普通函数。

类似黑客事件不限于以太坊,很可能未来会在rootstock等平台上重演。这是因为本次漏洞属于应用层面,并不是以太坊本身的问题,甚至都不能归咎于“图灵完备”,因为这种攻击即使在一个非图灵完备的平台上也可以奏效。总的来说,应用越复杂,应用出现安全问题的概率就越高。

本次黑客事件带给我们很多思考:在TRUST MACHINE上是否应该信任未知代码?去中心化系统是否应该在设计之初就加入应急干预代码以备“临时停牌”?出现问题后在舆情掌控、信息公开等方面是否应该存在预案?项目在上线之前是否应该经过更长时间的社区审视和测试?

本次黑客事件不意味着以太坊乃至去中心化、区块链的终结。虽然教训深刻,但如果能够汲取教训,那么从中获益的不仅仅是THE DAO, 以太坊,整个区块链社区都将从中获益。

声明:链世界登载此文仅出于分享区块链知识,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。此文如侵犯到您的合法权益,请联系我们100@7234.cn

    参与讨论 (0 人参与讨论)

    相关推荐

    区块链投资趋势报告:巨头入场布局行业趋于成熟

    区块链投资趋势报告:巨头入场布局行业趋于成熟

    来自:https://mp.weixin.qq.com/s?__biz=MzI4NzIxOTY1NA==&mid=2650632639&idx=1&sn=e6d1c29731d992a80410aaee82ec3ea6&chksm=f3d8db16c4af520097e4a64a71b1d4743ac326b9f027

    重新发明货币

    重新发明货币

    一、货币的演化过程 先简单回顾一下人类货币的演化过程,大概有以下阶段: a. 1.0版本:自然货币(贝壳、牲口、金银……) 这个阶段,货币基于一般等价物的稀有性或者实用性,货币不可能出现人为操纵的超发。 b. 2.0版本:早期纸币、银票到本位纸币 当贸易量越来越大,实物货币太不方便了,而且大家发现其实并不在意货币本身有什么价值,在意的只是这么多的货币能不能交换到足够的物品,于是纸币这种信用货

    从比特币交易看欧洲央行虚拟货币分类

    从比特币交易看欧洲央行虚拟货币分类

      互联网对传统社会的颠覆从未停止,在其完成对信息流、商流、物流、资金流的初步改造之后,或将以虚拟货币的形式打破现有货币体系   4月18日,在中国极客张沈鹏创办的比特币交易平台(42BTC.com)上,比特币对人民币的平均交易价为576元。当天,该平台完成了100个比特币的交易量。仅仅过去一周,4月25日上午,比特币对人民币的平均交易价已达到906元。据42BTC网站统计:在过去的32个月

    欧洲央行-比特币报告

    3.1 比特币 3.1.1 基本特征          比特币可能是最成功的,也可能是最有争议的虚拟货币方案,由日本程序员中本聪(译者注:事实上,中本聪是不是日本人,甚至是不是单个人无从考证)在2009年设计并实现。该计划基于一个类似于BitTorrent的P2P网络。BitTorrent是互联网上著名的共享文件协议,应用在电影,游戏和音乐领域。比特币在全球层面上运作,可用于各类货币交易(虚

    彻底玩转比特币地址和私匙

    彻底玩转比特币地址和私匙

    比特币地址和私匙是所有比特币初学者面对的一大难题,再加上那一串超长的字符串,让人更是摸不到头脑。 现在编者以问答的形式,带你一步步的揭开比特币地址和私匙的面纱。 还不知道什么是比特币地址和私匙的同学请点这里 问题一、比特币钱包由什么组成? 答 我们知道,比特币地址和私匙组成了比特币钱包,而私匙则决定了比特币地址上比特币的归属。 地址和私匙 问题二、如果只记得私匙我们还能还原比特币地址么? 答

    用GO语言实现比特币算法

    用GO语言实现比特币算法

    本节的这个例子展示一点点高精度数学包math/big、一点点散列包hash、一点点加密包crypto,还有一点点测试包testing的知识。这里不介绍bitcoin协议和算法——尽管它们很有趣,而是试图指出,Go对多种操作系统的支持,是实现这种跨平台应用的理想语言。 位钱(bitcoin)是一种使用加密手段制作的分布式电子货币。它最初于1998年由Wei Dai提出,并由中本聪(Satoshi

    详解比特币的找零机制

    详解比特币的找零机制

    比特币的找零机制一直让人有些迷惑,明明只向一个地址发送了比特币为什么 blockchain 上面的显示的有时是1个地址对多个地址,有时是多个地址对1个地址,有时又显示多个地址对多个地址? 为什么比特币资深用户要提醒大家当比特币钱包交易100次以上时再次交易后要重新备份钱包,恢复以前的钱包备份有可能会遭遇损失? 是的,这一切都是因为比特币的找零(Change)机制。本文参考 Bitcoin的维

    玩转比特币客户端之一:C盘转移和加速下载

    玩转比特币客户端之一:C盘转移和加速下载

    C盘空间不足?交易数据下载速度太慢?别着急,乐享比特币教你轻松玩转比特币官方客户端。 所有新人开始接触比特币时做的第一件事情大多数是安装比特币的官方客户端。 安全起见大家最好直接访问官方发布渠道sourceforge的地址进行下载:http://sourceforge.net/projects/bitcoin/files/Bitcoin/ 该网页列出了各版本的官方比特币客户端,目前

    麦妖榜
    更新日期 2019-03-21
    排名用户贡献值
    1BitettFan23752
    2等待的宿命23696
    3六叶树20309
    4天下无双16192
    5区块大康15902
    6lizhen00214889
    7让时间淡忘14256
    8linjm122712327
    9冷风大q11188
    10momo11174
    返回顶部 ↑