安全,区块链领域举足轻重的话题,为什么一行代码能瞬间蒸发几十亿市值?合约底层函数的使用不当会引起哪些漏洞?在合约中发送以太币存在哪些风险?服务攻击DOS有哪些类型?

「区块链大本营」携手「链安科技」团队重磅推出「合约安全漏洞解析连载」,以讲故事的方式,带你回顾区块链安全走过的历程;分析漏洞背后的玄机。让开发者在趣味中学习,写出更加牢固的合约,且防患于未然。

当然,这些文章并不是专为开发者而作的,即使你不是开发者,当你读完本连载,相信再有安全问题爆出时,你会有全新的理解。

引子:秦人不暇自哀,而后人哀之;后人哀之而不鉴之,亦使后人而复哀后人也。

——《阿房宫赋》

上回书道

溢出漏洞引增发

币值一落千万丈

黑客造假本领大

SafeMath来救驾

没看过的请戳:合约安全漏洞连载之一

本回咱们聊聊:

DoS攻击重现区块链江湖

缜密防范助阵安全区阵营

眼观目前区块链发展的步伐越来越急促,似乎我们已无暇回首当初那些辉煌与挫败,只能低着头继续跟从与追赶。

回首2016年的战场,似乎一切都已冰封,少有人记得这里发生过什么。

我们将当时的「拒绝服务攻击事件」挖掘出来,并将原理分析和漏洞修复技巧与大家分享,提醒要时刻牢记过去的教训

事件回顾

2016年2月6日至8日The King of the Ether Throne(以下简称KotET)“纷争时代”(Turbulent Age)期间,许多游戏中的退位君王的补偿和未接受款项无法退回用户玩家的钱包[1] 。

具有讽刺意味的是同年6月,连庞氏骗局GovernMental的合约也遭遇DoS攻击,当时1100以太币是通过使用250万gas交易获得[2],这笔交易超出了合约能负荷的gas上限,带来交易活动的暂停。

无论是蓄意破坏交易正常流程还是阻塞交易通道,都用到了一个互联网时代已经盛行已久的攻击方式——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,然后设置当前竞拍者为currentLeadercurrentLeader改为msg.value

但是,当恶意攻击者部署如下图所示的合约,并通过合约来竞拍,就会出现问题

攻击者先通过攻击合约向案例合约转账成为currentLeader,然后新的bider竞标的时候,执行到

require(currentLeader.send(highestBid))

会因为攻击合约的fallback()函数

(这里指function()external payable函数)

无法接收Ether而一直为false,最后攻击合约以较低的Ether赢得竞标。

漏洞修复

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

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

2.  通过区块Gas Limit发动DoS

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

即使没有故意的攻击,这也可能导致问题。然而,最为糟糕的是gas的花费被攻击者操控。在先前的例子中,如果攻击者增加一部分收款名单,并设置每一个收款地址都接收少量的退款。

这样一来,更多的gas将会被花费从而导致达到区块gasLimit的上限,整个转账的操作也会以失败告终。

如以下简化版案例合约所示:

这个案例合约遍历可被人为操纵的investors[]数组。

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

漏洞修复

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

如果实在必须通过遍历一个变长数组来进行转账,最好估计完成它们大概需要多少个区块以及多少笔交易。

然后你还必须能够追踪得到当前进行到哪,以便当操作失败时从那里开始恢复,举个例子:

3. 所有者操作发动DoS

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

例如如下Owner权限中的功能:

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

漏洞修复

可以设置多个拥有Owner权限的地址,或者设置暂停交易的期限,超过期限就可以恢复交易,例如:

require(msg.sender == owner || now > unlockTime)

漏洞分析,永不过时

综上所述,对于合约的DoS攻击,开发者应引起足够的重视。要牢记以下原则:

对于调用外部函数的代码一定要考虑周全,对于例外情况的判定要加入代码中;

遍历变长数组来逐个支付的方法需要全方位考虑和估计。合约中不应存在外部人员操纵的成分;

强调再三的去中心化特征也应该应用到Owner权限这个概念上来。

俗话说:以铜为镜,可以正衣冠;以古为镜,可以知兴替;以人为镜,可以明得失。对以往安全事件的分析和回顾,是保证未来合约安全的基础。

从被DoS到交易系统异常,到项目被冰封直至被遗忘,这一过程也反应了互联网发展初期所遭受的苦难。

但是只要我们铭记教训,就能稳固地保持区块链技术的发展。

DappBrowser,是一款安全、易用、优质的Dapp导航产品,志在为用户提供深度优化的Dapp交易和管理体验。目前已经支持云斗龙等优质的Dapp,可以直接在手机端运行,不需要下载或在PC端安装插件。新版本增加交易所搬砖神器,合约安全检测功能 。下载链接

也可以扫码下载:

次回予告:

“重入”“竞态”里应外合币穷财尽

“交互”“限制”强强联手链泰民安

“冰封”合约背后的老牌劲敌——拒绝服务漏洞 | 漏洞解析连载之二相关推荐

  1. ‘冰封’合约背后的老牌劲敌 | 链安团队漏洞分析连载第二期 —— 拒绝服务漏洞

    针对区块链安全问题,链安科技团队每一周都将出智能合约安全漏洞解析连载,希望能帮助程序员写出更加安全牢固的合约,防患于未然. 引子:秦人不暇自哀,而后人哀之:后人哀之而不鉴之,亦使后人而复哀后人也. - ...

  2. 智能合约安全漏洞解析连载——CSDN区块链大本营出品

    史上杀伤力最大的溢出型漏洞到底是什么?看这一篇就够了 | 第1期 4月发生的BEC事件以及SMT事件已经沉淀一段时间了,具体的情况也被多方媒体所报道,相关的漏洞根源问题也有很多大神团队的分析和指正.近 ...

  3. 弯道超车老司机戏耍智能合约——竞态条件漏洞 | 漏洞解析连载之三

    安全,区块链领域举足轻重的话题,为什么一行代码能瞬间蒸发几十亿市值?合约底层函数的使用不当会引起哪些漏洞?重入漏洞会导致什么风险? 「区块链大本营」携手「链安科技」团队重磅推出「合约安全漏洞解析连载」 ...

  4. 偷天换日合约易主,地址变脸移花接木——底层函数误用漏洞 | 漏洞分析连载之四

    安全,区块链领域举足轻重的话题,为什么一行代码能瞬间蒸发几十亿市值?合约底层函数的使用不当会引起哪些漏洞?可注入call漏洞和delegatecall误用漏洞会导致什么风险? 「区块链大本营」携手「链 ...

  5. 偷天换日合约易主,地址变脸移花接木——底层函数误用漏洞 | 漏洞分析连载之四...

    安全,区块链领域举足轻重的话题,为什么一行代码能瞬间蒸发几十亿市值?合约底层函数的使用不当会引起哪些漏洞?可注入call漏洞和delegatecall误用漏洞会导致什么风险? 「区块链大本营」携手「链 ...

  6. 阿里聚安全Android应用漏洞扫描器解析:本地拒绝服务检测详解

    阿里聚安全Android应用漏洞扫描器解析:本地拒绝服务检测详解 阿里聚安全的Android应用漏洞扫描器有一个检测项是本地拒绝服务漏洞的检测,采用的是静态分析加动态模糊测试的方法来检测,检测结果准确 ...

  7. PAS安全:绿盟软件扫描,报“检测到目标主机可能存在缓慢的HTTP拒绝服务攻击“漏洞如何解决?

    [问题描述] 绿盟软件扫描PAS6.5,报"检测到目标主机可能存在缓慢的HTTP拒绝服务攻击"漏洞如何解决? [解决方案] 在PAS左侧菜单>配置>server-con ...

  8. ERC223智能合约ATN币出现owner权限窃取漏洞

    漏洞评估 安全等级:高 影响合约:atn-contracts 影响方面:导致 ATN Token 总供应量发生变化 事件经过:2018.5.11 上午 11:46,ATN 技术人员收到异常监控警示,显 ...

  9. 常见Web安全漏洞深入解析

    常见Web安全漏洞深入解析 1.XSS跨站脚本攻击 2.SQL注入攻击 3.OS命令注入攻击 4.HTTP首部注入攻击 5.邮件首部注入攻击 6.目录遍历攻击 7.远程文件包含漏洞 1.XSS跨站脚本 ...

最新文章

  1. sinatra 基本用法
  2. 关于CRTP(Curiously Recurring Template Prattern)的使用
  3. ZooKeeper学习第七期--ZooKeeper一致性原理
  4. 【转载】向量空间模型VSM及余弦计算
  5. java 获取视频信息_Java获取视频参数信息
  6. 其他转成十进制,十进制转其他进制
  7. 被中国人误传了数千年的七句话
  8. Erlang 之父两点忠告:不要在疲惫时写代码、先思考再编程
  9. CF卡 本地磁盘模式转换
  10. One Piece Introduction
  11. python获取文件大小
  12. Lucene高亮显示详解
  13. ParaView-1
  14. 嘚吧嘚java的发展历史
  15. 第一次迭代开发感想——快租车APP
  16. Windows7下PHP 7.1搭建开发环境
  17. 上海房价地图热传:数据挺新 但不科学
  18. 原创/自译教程:并没什么卵用的移动端UI姿势(原创文章)
  19. 【​观察】六脉神剑第六式-管家式之面面俱到
  20. 开卷有益:架构整洁之道

热门文章

  1. linux 查看主板sn_Linux系统查看硬件信息
  2. 面试被骗 :当了一小时讲师,最后反倒说我不合格
  3. 全能电子地图实时路况_全能SUV与城市SUV的区别在哪?日产奇骏对比本田皓影
  4. python之函数的定义
  5. 恶意软件横行无忌 DNS“功”不可没
  6. 加载繁体字体时遇到的问题
  7. 国科大学习资料--最优化计算方法(王晓)--期末考试试卷历年题按题型汇总
  8. Python+Django+Mysql实现在线电影推荐系统 基于用户、项目的协同过滤推荐在线电影系统 代码实现 源代码下载
  9. 计算机网络(2)--- 因特网的发展阶段与组织
  10. 5.Linux下的权限管理