【小哈划重点:描述包括递归调用漏洞、权限控制漏洞、算数问题、返回值问题、拒绝服务、伪随机在内的智能合约威胁。因翻译时间所限,难免出现疏漏,在FreeBuf上分享仅为抛砖引玉之用,望对去中心化应用感兴趣的同学在此多指正、多交流。】
NCC Group发起了一个名为2018年去中心化应用安全Top10(Decentralized Application Security Project)的项目。据悉,该项目会与类似于OWASP的方式发布去中心化应用安全领域中,每年的十大安全威胁报。与OWASP开放合作透明的运作理念相似,该项目也是以集成合作的方式披露智能合约中存在的安全漏洞。
本文是第一版的DASP Top10 2018内容,详细描述包括递归调用漏洞、权限控制漏洞、算数问题、返回值问题、拒绝服务、伪随机在内的智能合约威胁。因翻译时间所限,难免出现疏漏,在FreeBuf上分享仅为抛砖引玉之用,望对去中心化应用感兴趣的同学在此多指正、多交流。
一、递归调用漏洞
该漏洞的利用有一个知名的案例,以太坊(Ethereum)漏洞。在首次发现以太坊存在这个问题的时候,很多人都觉的不可思议,在高漏洞造成数千万美元的损失之后,该漏洞可谓直接导致了以太坊的硬分叉之路。
这个漏洞的触发在于外部合约对正在起草的合约进行新的调用,而这个调用发生在初次执行完成之前。对于函数而言,这个调用意味着合同状态发生了改变,调用的合约变得不可信,外部地址却上使用了低层功能。
该漏洞造成的损失:350万 ETH损失(当时价值 5000万美元)
二、权限控制漏洞
权限控制问题在所有程序中都很常见,而不仅存在于智能合约之中。事实上,在OWASP中该问题也排行第5。我们通常通过公开或者外部函数获取到合约的内容。但如果合约的可视性没有进行良好的安全设置,攻击者也很容易查看并获取合约的隐私内容和内部逻辑,他们能够找到绕过限制的方式。这些漏洞通常在合约使用tx.origin对调用者进行验证时触发。
漏洞造成的损失:大约15000ETH(当时约为3000万美元)
三、算数问题
整数的溢出并不少见,但这类问题在智能合约中尤其危险。合约中无符号整数的应用非常普遍,大多数开发人员习惯于简化 int类型(有符号整数)。如果溢出问题发生,许多良性代码路径会成为攻击者进行信息窃取或拒绝服务的载体。
四、未经核查的返回值问题
这个问题有时也称为无声的失败发送或者未经核实的发送。我们应该尽可能避免在合约中使用低层次的调用,因为返回值如果处理不当会出现很多意外的行为。
Solidity中有一部分功能是低层函数,如call,callcode,delegatecall和send。这些函数在处理错误方面的行为与其他 Solidity函数完全不同,他们不会回到当前执行的状态,而只会返回布尔值false,程序会继续执行。
如果这些返回值没有得到核查,就会导致一些预想不到的结果。
五、拒绝服务问题
拒绝服务的情况,包括达到到达了程序的容量上限,意外抛出错误,意外的进程杀死,或者访问控制违规问题。
在去中心化应用、以太坊的世界中,拒绝服务问题往往会是致命的:尽管其他类型的应用程序最终总是可以恢复服务的,但智能合约可能会因一次拒绝服务攻击而永久下线。
有多种原因引发导致拒绝服务,如在合约交易时收到了对方恶意行为的攻击,人为地提高了执行操作消耗的容量,滥用访问控制来获取智能合约的隐私组件,遭到混淆攻击。
这一系列攻击都包括了各种变体,并在未来的时间中攻击方式会继续变化。
漏洞造成的损失:估计为 514,874 ETH(当时约3亿美元)
六、伪随机问题
该漏洞也被称为 “没有什么是秘密的”。
随机问题很难在以太坊中得到纠正。尽管 Solidity提供了些难以预测值的函数和变量,但很多情况中还是难以保持隐私性。随机性在一定程度上是可预测的,所以恶意用户以此实施攻击。
漏洞造成的损失:超过400 ETH
七、竞争条件问题
由于矿工总是通过外部地址来获得报酬,因此用户可以指定更高的费用来让自己的交易更快地完成。
而以太坊区块链是公开的,每个人都可以看到其他人尚未完成的交易内容。
这意味着,如果某个用户正在处理问题,恶意用户也可以窃取该解决方案,以较高的费用发起新交易,抢占原始解决方案。
如果智能合约的开发者不太谨慎,这种情况会导致实际且毁灭性的攻击。
八、时间处理问题
从锁定令牌到在特定时间解锁资金,合约都需要依赖当前时间。这通常通过 block.timestamp或其 now来在 Solidity中实现。
由于这个时间依赖的是矿工,一笔交易的矿工如果在挖矿时间上会有余地,所以良好的智能合约应该避免时间依赖。而正如在6中探讨的,block.timestamp函数中使用的随机只是伪随机。
九、短地址攻击问题
短地址攻击是以太坊虚拟机未能接受正确参数的副产物。攻击者可以通过特定制作的地址利用这个弱点,针对部分编码错误的客户端进行参数填充。
尽管不同的人对于这个问题看法不同:
这是以太坊虚拟机的问题还是客户端的问题?这能够在智能合约中修复吗?
虽然这个漏洞还没有被大规模利用,但它很好地证明了客户和以太坊区块链之间的交互也可能存在问题。
其他链外问题也存在着:以太坊生态系统以来着特定的JavaScript前端,浏览器插件以及公共节点。
在Coindash ICO欺诈事件中的黑客也使用了臭名昭着的链外漏洞,他们在网页上修改了 ICO公司的以太坊地址,诱骗参与者将攻击者地址发到自己的账户。
十、未知
以太坊仍然处于起步阶段。用于开发智能合同的主要语言 Solidity尚未达到稳定版本,生态系统中的其他工具也仍然处于试验阶段。
每次发现具有破坏性的智能合约让许多人都感到惊讶,但我们没有理由相信其他同等性质破坏力的漏洞不会出现。代码审计和安全检查仍然会是有效的措施,尽管有很多不成熟的地方,去中心化应用仍然在以飞速的方式发展。
本文参考来源:dasp,编译整理Elaine