零点课堂 | 主流区块链攻击底层逻辑(3)
6. 智能合约层
智能合约本质是一段运行在区块链网络中的代码,它完成用户所赋予的业务逻辑。一方面,区块链为智能合约的运用提供可信的计算运行平台,另一方面,智能合约大大扩展了区块链的应用范围。合约条款由计算机代码评估并执行不受人为干预,所以合约代码一旦上链,执行过程和结果都完全公开而且不可篡改。随着智能合约的广泛应用,出现了各种漏洞攻击事件,安全风险问题日益严重。智能合约漏洞一旦被黑客利用就可能导致很多严重的安全问题,特别是资产安全问题。
一旦智能合约的编程代码设计不完善,就可能出现安全风险。其安全风险包含了三个方面:第一,漏洞风险,包括合约代码中是否有常见的安全漏洞。第二,可信风险。没有漏洞的智能合约,未必就安全,合约本身要保证公平可信。第三,不合规范风险。由于合约的创建要求以数字形式来定义承诺,所以如果合约的创建过程不够规范,就容易留下巨大的隐患。
目前针对智能合约的主要攻击方式有:可重入攻击、调用深度攻击、交易顺序依赖攻击、时间戳依赖攻击、误操作异常攻击、整数溢出攻击和接口权限攻击等。
可重入攻击是指当一个合约调用另一个合约的时候,当前的操作就要等到调用结束之后才会继续。这时,如果被调用者需要使用调用者当前所处的状态,就可能发生问题。2017年7月,以太坊钱包Parity爆出极其严重的的漏洞,使得攻击者从三个高安全的多重签名合约中窃取到超过15万ETH(约3000万美元)。攻击者通过调用initWallet智能合约(理论上这个智能合约只允许被调用成功一次),而initWallet智能合约未设置重入检查,以防止攻击者多次初始化智能合约将这个钱包合约的所有者进行覆盖从而将钱包所有者修改为攻击者,这相当于从unix中获得了root权限。
调用深度攻击针对虚拟机中智能合约的调用深度限制,这个限制是为了防止调用栈资源被滥用。调用深度攻击可以让合约调用失败,即使这个调用在逻辑上不存在任何问题,在虚拟机层面已经不被允许了,因为调用深度达到了虚拟机中的阈值,不再往下执行。攻击者可以通过控制调用深度来使某些关键操作无法执行,如转账、余额清零等。
交易顺序依赖攻击是指交易进入未确认的交易池,并可能被矿工无序地包含在区块中,因此打包在区块中的交易顺序与交易生成的顺序完全不同。如果攻击者可监听到网络中对应合约的交易,然后发出他自己的交易来改变当前的合约状态,例如对于悬赏合约减少合约回报,则有一定几率使这两笔交易包含在同一个区块下面,并且排在另一个交易之前,完成攻击。
时间戳依赖攻击是指攻击者可以通过设置区块的时间戳来尽可能满足有利于他的条件,从中获利。
误操作异常攻击是指当一个合约调用另外一个合约时,后者操作可能执行失败,从而退回到未执行前的状态,此时前者若不检查后者执行的结果继续往下执行,会导致很多问题。
整数溢出攻击是指如果攻击者向智能合约提供了一个超出代码处理范围的参数,就会产生崩溃结果,这样的崩溃助长了多重攻击。崩溃可能触发拒绝服务攻击,更严重地,关于系统内部的重要信息可能会在错误消息中泄漏。2018年初,区块链形式化验证平台VaaS(Verification as a Service)检测发现,基于EOS区块链的代币合约同样可能存在BEC代币合约类似的整数溢出漏洞。
接口权限攻击是指智能合约错误地将高权限的接口暴露给普通用户调用,导致系统状态出现异常。常见的接口权限攻击多出现在ERC20 代币合约的铸币权限上,一些开发者没有在初始化后关闭铸币权限,导致任何人可以调用生成新的代币。2017年11月,著名的Parity 多签钱包被一个用户误触发了共享库销毁函数,导致价值2.85亿美元的以太币永久锁定。
从以上的安全事件可以看出,现阶段智能合约并不完善,存在的各种漏洞一旦被黑客利用,就会造成资产损失。解决这些问题仍具有挑战性。
智能合约的本质是代码,它界定了各方使用合约的条件,在满足合约条件下机器指令被执行,其开发本身对程序员就是一项挑战。受限于自身的安全意识和代码编写能力,开发人员一旦没有全面考虑可能应对的风险,智能合约的可靠性就难以保证。
为防范智能合约层的安全风险,首先,在开发数值计算相关的智能合约时应该使用安全数值计算库,并做完整的生命周期式安全合规检查,防止整数溢出漏洞;应充分考量智能合约执行的功能,不能对数据完整性、安全性和平台稳定性产生负面影响。
其次,智能合约不可避免地与区块链之外的应用程序相互作用,目前没有方法和标准可以将与外部应用程序连接时引入安全漏洞的风险降至最低。所以一方面需要先进行智能合约协议安全性分析,防止业务逻辑漏洞的出现;另一方面应对与外部应用程序进行智能合约交互进行标准化,为保护完整性、安全性和稳定性提供指导。
最后,在系统安装智能合约代码时,确保代码来自正确的可信提供商并且未被修改,如果攻击者有能力安装恶意智能合约代码则可以改变智能合约的行为。必须有控制措施确保智能合约只能由已被授权人员安装,或能将部署在链上的代码和公布的合约源码自行编译后的结果进行比对以确认其一致。
7. 系统应用层
系统应用层涉及不同行业领域的场景和用户交互,导致各类传统安全隐患较为集中,成为攻击者实施攻击的首选。2018年7月至12月间,EOS链上的DApp共发生49起安全事件,波及37个DApp,导致项目方共损失近75万枚EOS,按照攻击发生时的币价折算,总损失约合319万美元。
加密货币交易平台是为用户提供在线交易服务的重要渠道。不论是内部泄露数据还是外部黑客入侵,都会造成关键信息泄露。目前针对交易平台的攻击主要包括:账户泄露攻击(撞库、穷举)、DDoS攻击、Web注入攻击、钓鱼网页攻击。
账户泄露攻击(撞库、穷举)是指攻击者通过手机互联网上已公开或还未公开的用户名、邮箱、密码等信息来在要攻击的网站上通过程序批量尝试。若网站不对登陆接口做请求限制或者风控,则会导致攻击者可以无限发送请求逐个测试可能的值来暴力破解某些关键信息。
2017年10月2日,okcoin旗下交易所出现大量账户被盗情况,不完全统计损失金额在1000万元人民币左右,用户怀疑平台已被攻击,或有已被关闭平台的交易所员工向黑客泄漏了平台用户的账户信息,黑客通过用户信息破解账户密码登录平台,然后在平台上完成数字资产转移。
DDoS攻击是攻击者想办法让目标机器停止提供服务,若交易平台被DDoS攻击,不但交易平台蒙受损失,加密货币的交易量也将大大减少,间接影响价格涨跌。
Web注入攻击是指通过对web连接的数据库发送恶意的SQL语句而产生的攻击,从而产生安全隐患和对网站的威胁,可以造成逃过验证或者私密信息泄露等危害。
钓鱼网页攻击是指是一种企图从电子通讯中,通过伪装成用户信任的网页以获得如用户名、密码和信用卡明细等个人敏感信息的犯罪诈骗过程。常用手段是导引用户到URL与界面外观与真正网站几无二致的假冒网站输入个人数据。就算使用强式加密的SSL服务器认证,要侦测网站是否仿冒实际上仍很困难。