专栏首页区块链入门【链安】智能合约DoS攻击原理分析及相应漏洞修复

【链安】智能合约DoS攻击原理分析及相应漏洞修复

何为DoS

DoS 是DenialOfService,拒绝服务的缩写[3],从字面上来理解,就是用户所需要的服务请求无法被系统处理。 打个比方来形容DoS,火车站是为大家提供乘车服务的,如果想要DoS火车站的话,方法有很多,可以占用过道不上车,堵住售票点不付钱,阻挠列车员或者司机不让开车,甚至用破坏铁轨等更加极端的手段来影响车站服务的正常运营。 过去针对互联网的DoS有很多种方法,但基本分为三大类:利用软件实现的缺陷,利用协议的漏洞,利用资源压制[3]。 此外还有DDoS,称为分布式DoS,其区别就是攻击者利用远程操控的计算机同时向目标发起进攻,在上面的比喻中可以理解为雇佣了几百个地痞流氓来做同样的事影响车站的运作。

智能合约DoS攻击原理分析及相应漏洞修复

无处不在的DoS当然也会对基于Solidity语言的以太坊合约产生威胁。 针对智能合约的DoS攻击属于利用协议漏洞进行的手段,具体的攻击方法有三种[4],其目的是使合约在一段时间或者永久无法正常运行。通过DoS攻击,可以使合约中的Ether永远无法提取出来,区块成为“冰冻废土”。

在对于原始代码进行分析后,我们发现KotET事件中对君王称号进行锁定的DoS攻击属于:

1. 通过(Unexpected) Revert发动DoS

如果智能合约的状态改变依赖于外部函数执行的结果,又未对执行一直失败的情况做出防护,那么该智能合约就可能遭受DOS攻击[5]。

我们使用案例合约还原KotET的竞拍机制,进行模拟分析:

以上案列合约是一个简化版的KotET的竞拍争夺王位的合约,如果当前交易的携带的ether大于目前highestBid,那么highestBid所对应的ether就退回给currentLeader,然后设置当前竞拍者为currentLeader,currentLeader改为msg.value。但是当恶意攻击者部署如下图所示合约,并通过合约来竞拍将会出现问题:

攻击者先通过攻击合约向案例合约转账成为currentLeader,然后新的bider竞标的时候,执行到require(currentLeader.send(highestBid))会因为攻击合约的fallback()函数(这里指function()external payable函数)无法接收ether而一直为false,最后攻击合约以较低的ether赢得竞标。

漏洞修复

如果需要对外部函数调用的结果进行处理才能进入新的状态,请考虑外部调用可能一直失败的情况,也可以添加基于时间的操作,防止外部函数调用一直无法满足require判断。

对GovernMental事件中交易的gas值远远超出天际的原理分析,其属于通过区块Gas Limit发动DoS。

2. 通过区块Gas Limit发动DoS

一次性向所有人转账,很可能会导致达到以太坊区块gas limit的上限。以太坊规定了每一个区块所能花费的gas limit,如果超过交易便会失败。

即使没有故意的攻击,这也可能导致问题。然而,最为糟糕的是如果gas的花费被攻击者操控。在先前的例子中,如果攻击者增加一部分收款名单,并设置每一个收款地址都接收少量的退款。这样一来,更多的gas将会被花费从而导致达到区块gas limit的上限,整个转账的操作也会以失败告终。如以下简化版案例合约所示:

这个案例合约遍历可被人为操纵的investors[]数组。攻击者可以创建许多账户,使得investors[]数组变的很大,使得执行for循环所消耗的gas超过块gas极限,使得distribute函数一直处于out-of-gas(OOG)状态,而一直无法执行成功,合约正常功能实现受到影响。

漏洞修复

合约不应该循环对可以被外部用户人为操纵的数据结构进行批量操作,建议使用取回模式而不是发送模式,每个投资者可以使用withdrawFunds取回自己应得的代币;

如果实在必须通过遍历一个变长数组来进行转账,最好估计完成它们大概需要多少个区块以及多少笔交易。然后你还必须能够追踪得到当前进行到哪以便当操作失败时从那里开始恢复,举个例子:

image

3. 所有者操作发动DoS

另外, 我们联系之前提到的Owner权限过大,“超中心化”的问题,发现目前很多代币合约都有一个Owner账户,其拥有开启/暂停交易的权限,如果对owner保管不善,代币合约可能被一直冻结交易,导致非主观的拒绝服务攻击,例如如下owner权限中的功能:

image

此owner权限的局限性在于,在ICO结束后,如果特权用户丢失其私钥或变为非活动状态,Owner无法调用finalize(),用户则一直不可以发送代币,即令牌生态系统的整个操作取决于一个地址。

漏洞修复

可以设置多个拥有owner权限的地址,或者设置暂停交易的期限,超过期限就可以恢复交易,如:require(msg.sender == owner || now > unlockTime)

  1. 对于调用外部函数的代码一定要考虑周全,对于例外情况的判定要加入代码中。
  2. 遍历变长数组来逐个支付的方法需要全方位考虑和估计。合约中不应存在外部人员操纵的成分。
  3. 强调再三的去中心化特征也应该应用到Owner权限这个概念上来。

从被DoS到交易系统异常,到项目被冰封直至被遗忘,以上的例子也经历了互联网发展初期所遭受的苦难,但是只要我们铭记教训,就能稳固地保持区块链技术的发展。

引用

1). Post-Mortem Investigation 2). A survey of attacks on Ethereum smart 3). 张昆苍等.操作系统原理 DOS 篇(第2版):清华大学出版社,2000 年9月 4). https://blog.sigmaprime.io/solidity-security.html#dos 5). 以太坊智能合约 --- 最佳安全开发指南 通过(Unexpected)Throw发动DoS 6). 以太坊智能合约 --- 最佳安全开发指南 通过区块GasLimit发动DoS

本文转载自《冰封’合约背后的老牌劲敌 | 链安团队漏洞分析连载第二期 —— 拒绝服务漏洞》,版权属于原作者

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【实践】如何填写区块链信息服务备案?

    国家网信办于2019年1月10日公布了《区块链信息服务管理规定》(以下简称“《规定》”),已于2019年2月15日生效施行。对于区块链信息服务实体来说,如何填写...

    辉哥
  • 巴比特长铗:坚信它,不为短时间的波动就改变方向

    2003年到2010年间,长铗痴迷科幻。如果继续写下去,也许会成为下一个刘慈欣,但他并没有想过要以此为业,“别人把写作当做饭碗,但我不是,我是因为做不了科研,于...

    辉哥
  • 【区块链实践】大厂们入局区块链,到底谁最靠谱?

    第一大阵地俗称“币圈”,在这里面的人,你一提到区块链,大家第一反应就是虚拟币,因为他们认为虚拟币是区块链目前最“落地”的应用。

    辉哥
  • 2018公链之争,真正落地才是王者

    为何公有链竞争如此激烈?因为在区块链领域,一条基本的发展逻辑是“底层公链——解决方案——项目应用”。底层公链是区块链世界的基础设施,解决方案则用来拓展底层公链的...

    区块链领域
  • 《2018区块链整体架构及应用》发布

    中世纪的欧洲,城市是游离于封建领主之外的边缘之地,与实力强大的封建主相比,城市一开始弱小不堪。但这法外之地渐渐地成为商人、手工业者、逃民的乐土,市民们自管自治,...

    钱塘数据
  • java练习本(2019-06-27)

    C.abstract interface C extends D,E//D、E为已定义的接口{abstract void fun(){};}

    微笑的小小刀
  • 区块链:慈善腐败的克星

    根据慈善援助基金会发布的一份报告(币文库全文下载),区块链技术最终可用于执行很多传统监管机构的功能。

    D13
  • SIGGRAPH 2018技术前沿|英伟达、谷歌等大佬纷纷展示VR/AR新成果

    SIGGRAPH是由ACM SIGGRAPH(美国计算机协会计算机图形专业组)组织的计算机图形学顶级年度会议,每年举办一次。现在,为期五天的SIGGRAPH 2...

    VRPinea
  • 吴忌寒入选福布斯2019最年轻亿万富豪榜;黑客已将价值近千万EOS偷跑 | 1分钟链圈

    【开发零知识证明公司 StarkWare 推出可替代闪电网络的支付技术「StarkPay」】

    区块链大本营
  • 区块链技术真的能提升大选投票系统的安全性吗?

    近期,欧洲能源部门的委员Maroš Šefčovič公开赞扬了区块链技术,并且指出这项技术在未来选举进程中的重要性,因为很多网络安全专家都已经警告了政府部门目前...

    FB客服

扫码关注云+社区

领取腾讯云代金券