区块链时代,智能合约的安全性被无限放大,一个小小的bug就能导致上亿美元的损失。美链(BEC)近日被爆出安全漏洞,被黑客用以太坊ERC-20智能合约中BatchOverFlow漏洞攻击,引发价格闪崩,当日币价几乎归0。除了美链,据英国和新加坡的研究人员统计,超过34000个智能合约都有可被利用的安全隐患。
智能合约的安全问题频频亮红灯,黑客简单的一串数字就能套利千万,让人血本无归。想要保证智能合约能够100%的正确,只有形式化验证(Formal Verification)可以确保这些漏洞完全被检测。具体的方式我们用美链来探讨一下。
美链到底出了什么安全漏洞?
美链这个安全漏洞其实非常简单!美链智能合约中一个batchTransfer函数, 主要目的是实现BEC token的批量转账: 将固定整数数量(_value) 转账到一批接收账号的数组里 (_receivers). 为了实现这样的批量转账, BEC的开发人员, 首先计算需要转账的总金额, 计算的公式是:
总金额 (amount) = 需要给每个接收方转账的额度(_value) x 总共需要转账的账户个数 (_cnt)
然后在确保发送方拥有足够的余额后, 给每个接收方发送转账的额度.
但是, 出了什么问题呢?
在计算 amount = _value x _cnt 的过程中, 开发人员并没有考虑到256位整数数据溢出的可能性,因此黑客们, 依靠这个漏洞, 成功的余额不足的情况下, 依然从账户中转走了总计2²⁵⁶个BEC Token。
用形式化验证方法轻松检测漏洞
事后看来好像美链这个安全漏洞看起来是个愚蠢的错误,但是类似BEC的安全漏洞其实很容易忽略,而智能合约上一个小的程序上的疏忽,就能导致上千万甚至上亿的损失。
自动化的形式化验证平台很可能能帮助检测和避免类似的错误。来看看Certik的自动化形式化验证平台是如何做到的。
将这段代码提交到CertiK的验证引擎,添加几个标签,Certik的自动化验证引擎能够轻易的检测到BEC的溢出错误。Certik的形式化验证引擎能够处理这些标签并且能够根据标签来检查代码实现的正确性。如果美链的智能合约提交之前能够被CertiK做安全检测,那么这上亿的损失就能被避免。