智能合约问题频发,如何保护你的链上资产?

云链唐人财经
云链唐人财经 机构得得号

Aug 27, 2018 首家专注于区块链“安全、政策及法律”的媒体

摘要: 智能合约常见漏洞类型有隐私泄露,交易溢出与异常,合约故障,拒绝服务等。以太坊目前的设计最适合游戏积分之类的合约运行,重要的Token资产不适合构建在ERC20体系基础之上。

导语:

还记得BEC是怎样从神坛上跌落的吗?4个月前,因为一行智能合约代码的漏洞,与美图合作的公司美链BEC遭受黑客攻击,向两个地址转出了天量级别的 BEC 代币,导致市场上海量BEC被抛售,该数字货币价值几近归零,给BEC市场交易带来了毁灭性打击。

智能合约漏洞的危害不容小看,作为区块链2.0的核心,向来缺乏正规专业的安全监测体系。8月23日,腾讯宣布正在开发智能合约安全检测系统,一举进军区块链安全领域。作为老牌的BAT三大巨头之一,腾讯能否承担起“守卫”智能合约安全的重任呢?

据不完全统计,2011年至2018年4月30日,因各类区块链安全事件造成的损失达到20多亿美金。其中因为智能合约漏洞而引发的安全事件损失金额达12.4亿美元,占比达6成,形势可谓严峻。

腾讯于今年8月发布的《2018上半年区块链安全报告》显示,今年上半年,区块链因自身机制安全、生态安全和使用者安全三个方面造成的经济损失分别为12.5亿美元、14.2亿美元和0.56亿美元,共计高达27亿美元。仅上半年区块链行业的安全问题损失金额就赶超前7年的总数据。

伴随着区块链热潮,安全问题一并爆发。经整理分析,攻击事件可大致分为四类安全事件:共识机制、智能合约、交易平台和用户自身。

智能合约重大安全事件回顾

事件一:Bitfinex漏洞爆发,资金损失36%

Bitfinex在8月2日凌晨发布公告,发现了安全漏洞。该漏洞导致bitfinex全面停止交易,这将导致每位用户的账户平均损失36%。

攻击手法:利用热钱包安全机制漏洞

事件二:The DAO被黑,损失超5000万美元

黑客利用智能合约存在的漏洞攻击The Dao,造成价值逾5000万美元的损失。ETH市场价格从记录高位21.50美元跌至15.28美元。

攻击手法:利用递归调用(recursive calling)的漏洞

事件三:BEC智能合约漏洞爆出,一行代码蒸发了6447277680人民币

4月22日,OKEx暂停BEC交易和提现。因为BEC美蜜合约出现重大漏洞,攻击者可以通过代币合约的批量转账方法无限生成代币,BEC价值瞬间归零。

攻击手法:利用整数乘法溢出漏洞

除了以上三个遭受重大损失的智能合约安全事件外,还有大量基于以太坊平台开发的代币也接连被曝其智能合约存在漏洞。黑客利用漏洞入侵系统对智能合约用户造成巨大损失,缺乏对智能合约基本的安全监测,出现的大部分漏洞都很低级。

智能合约安全漏洞类型

(1)隐私泄露

智能合约对区块链上的所有用户可见,包括但不限于标记为 private 的资源,或可造成隐私信息泄露。

解决方案:

函数可见性审核

敏感函数继承权限检测

函数调用权限检测

(2)交易溢出与异常

由于智能合约本身的约束条件,如条件竞争、交易顺序依赖等,造成的交易溢出与异常。

解决方案:

合约限制绕过审核

使合约失效,删除地址字节码;

将所有合约资金发送到一个目标地址。

(3)合约故障

由于智能合约代码中可能存在的不合理故障处理机制,造成的异常行为。

解决方案:

调用栈耗尽审核

检测栈高度限制,是否出现栈耗尽情况。

(4)拒绝服务

由于各种原因可能导致的拒绝服务风险。

解决方案:

拒绝服务审核

过多货币交易发生异常,导致交易回滚,最终导致合约拒绝服务。

智能合约漏洞具体举例

(1)BatchOverFlow(批量溢出)漏洞

特点:自己“印”的Token也能用

BatchOverFlow漏洞中,当用户输入转账的数值超过设定的最大值,只要用户账户余额大于0,就可以直接将巨额的币转走,并且账户中收到的Token可以正常地转入交易所进行交易,与真的Token无差别。

(2)ProxyOverflow(代理溢出)漏洞

特点:Token想发多少发多少

攻击者调动向多用户转账的函数触发漏洞,由于做安全运算的函数簇没有设计溢出判断,攻击者便能转入 tokens,导致 totalTokensToTransfer 溢出,随意增发代币。加减乘除采用安全函数的合约只占少数,实现转账功能的基本每个合约都有。

例子:

SMT整数加法溢出漏洞:proxyTransfer函数存在一个经典的整数溢出问题,攻击者利用该漏洞不需要任何Token,就可以向一个地址转入大量的Token。

BEC整数乘法溢出漏洞:BEC的某一段代码忘记使用safeMath方法,导致系统产生了整数溢出漏洞,黑客可以通过转账手段生成大量原本合约中不存在的代币。

EDU缺乏Safemath漏洞:在一个名为transferFrom 函数中,缺少 Safemath 验证,利用溢出攻击可以让攻击者从任何一个 EDU 余额不为 0 的账号内向另外一个账号转出 任意数量的EDU Token。

RMC代币合约:transferFrom函数的错误逻辑产生溢出漏洞,攻击者不需要私钥即可无限制的将任意账户的RMC币转到指定的账户(_to),从而导致所有持有RMC币的账户都有可能被盗取。

UselessEthereumToken:和RMC类似,因为溢出漏洞攻击者无需任何私钥,只需调用该函数时,把传入的参数_value设置得足够大,即可操纵_from和_to的账户余额。

(3)transferFlaw(转移错误)漏洞

特点:空手套白狼

攻击者利用代码编写逻辑错误,攻击者可以在在自己账户Token为零的情况下,把这些代币从你的钱包里全部转走。

(4)ownerAnyone(所有者任何人)漏洞

特点:冒名顶替,用你的身份花你的钱

攻击者可利用此漏洞拥有某些基于ERC20的智能合同,甚至可能引发受影响智能合约的拒绝访问。以下是典型的一类:

隐形Owner漏洞:此类漏洞的出现源于设计时,允许该项目团队拥有最高权限,从而黑客利用该缺陷获取项目权限后,通过修改地址方式将这部分任意资金转出,导致该项目蒙受巨大损失。

例子:

Bancor(BNT):Bancor的管理员账户被窃取, 导致了暂存在Bancor合约里价值千万的虚拟货币被提取到了一个私人地址。

(5) multiOverflow(多重溢出)漏洞

特点:自由增发币

multiOverflo中的每次交易都可能有比较高的交易费用,这个函数的作用是把多笔的单笔交易组成一个批处理,批处理有两个参数,就是转入方和转入的数值,这里面拥有多笔交易,它做成数组,代码行227和228数值长度是一样的,才是个有效的数据,数值长度就变成当前有多少个单个交易,代码行249-251相当于把这些要转出的交易的数值做了一个加法,获取总值之后判断转出方有足够的余额去授权管理,但因为这个漏洞存在,所以能够感觉到这个变样有可能溢出,有可能变成零。它与代理溢出相似。

(6)代码调用漏洞

特点:就是不置0,又双叒叕……操作

在调用其他函数的操作完成之前,这个被调的函数可能会多次执行。这可能会导致智能合约中的几个函数以破坏性的方式进行交互。

合约编程和一般的编程不一样,更注重安全可靠,尽量不要用递归。合约代码尽量是封闭的,既不调用未知的代码,也不被未知的代码调用(通过加某些特殊判断语句)。

例子:

The DAO:因为用户的余额一直没有被置0,直到函数执行的结束。第二次(之后一次)调用其他函数的操作仍会成功,并且会一次一次地取消对账户余额的置0操作。调用withdrawBalance()时调用transfer() 函数,由于他们的余额在此时还未被置0,所以即使他们已经收到退款,他们也还能转移通证,这个漏洞也被用在了The DAO事件中。

(7)allowAnyone(允许任何人)漏洞

特点:黑客可是被“授权”偷的啊

该漏洞可允许攻击者盗取他人代币。

(8)ceoAnyone(控制任何人)漏洞

特点:我挣的钱怎么进了你的口袋

在多个加密游戏智能合同中识别出新的控制任何人(ceoAnyone)漏洞,利用该漏洞,攻击者可以替换并控制管理员的权限。可被人以调用方调用的DrugDealer()函数,允许调用者修改收益地址——ceoAddress。

其他:燃烧溢出 (burnOverflow),allowFlaw(允许错误)漏洞,tradeTrap(交易陷阱)漏洞和evilReflex漏洞。

智能合约安全审计要做什么?

安全审计模块针对的漏洞包括代码编程规范漏洞、代码逻辑漏洞、函数调用漏洞、整型溢出漏洞、可重入攻击漏洞、执行顺序依赖漏洞、时间戳依赖漏洞、平台接口误用漏洞。

针对这些漏洞,安全审计可以从3个时间段采取行动:

事前防护:代码编写过程中的规范化与代码发布的漏洞检测;

事中验证:在智能合约虚拟机中完成代码的执行与动态安全检测;

事后弥补:对智能合约执行结果进行审计,确保执行不会出现偏差,执行结果在可信范畴。利益关联方能够及时发起申述,并进行裁决。

建立安全防护体系,可以从以下4点考虑:

代码定型与发布时的验证与检查。无论设计者是否愿意,每个发布的代码将接受自动规则验证检查,从而确保静态代码审查通过,那些典型的溢出漏洞规则将无处藏身;

节点在执行合约中的动态验证。该动态验证将涵盖本合约、关联合约的验证,并对执行过程中的状态进行审查,从而实现各种执行漏洞进行弥补,即使黑客造出漏洞,各个合约执行者也会严密审视,并挂起可以执行操作;

合约执行完毕的合理性判断。合约执行完毕的结果将通过一定的规则进行评判,同时引入人工智能,对合约执行的合理区间进行分析,从而决定最终的结果输出;例如对账目进行复式审查或更高维度进行审查;

相关利益方的申诉机制与自动判决技术。在智慧合约部署的节点上,每个节点都内置基于规则的判决机制以及人工智能审核机制,支持自动投票表决,从而保证一定的机会挽回损失。

以太坊不适合发行Token资产

基于ERC20协议的数字货币(以下简称为ERC20货币)实际上是以太坊上运行的智能合约。

以太坊只是一个记录 dapp 执行结果的区块链,其本身并没有加密货币复式记账所需的 utxo 模型。重要的 token 资产本身是需要货币级别的安全程度,以太坊目前的设计更适合游戏积分之类的合约运行结果。

重要的 token 资产不适合构建在 ERC20 体系基础之上。通过以太坊智能合约“发币”容易,若不做好严格的代码审计和安全防护,亿级资金的损失只在一瞬间。

(作者:云链唐人财经,内容来自链得得内容开放平台“得得号”;本文仅代表作者观点,不代表链得得官方立场)

链得得仅提供相关信息展示,不构成任何投资建议
本文系作者 云链唐人财经 授权链得得发表,并经链得得编辑,转载请注明出处、作者和本文链接

更多精彩内容,关注链得得微信号(ID:ChainDD),或者下载链得得App

分享到:

相关推荐

    评论(0

    Oh! no

    您是否确认要删除该条评论吗?

    分享到微信