阿里云BaaS智能合约扫描服务使用详解

阿里云BaaS智能合约扫描服务

区块链技术,是一种交易记录的存储技术。它对交易记录进行永久性存储,而且在存储之后永远无法删除,只能按照次序加入新的交易,由此对所有的交易历史进行永不结束的记载。这个看似简单的功能描述,实则含义深刻,它促使我们重新思考如何去创建交易、存储数据和交换资产,它是一场巨大变革的起点。

区块链通过不可变的特性提高参与方的可信度,还能通过交易中提供更大的透明度来减少各个参与方之间的摩擦,这些特性使得更多行业的应用场景得以重塑。如果说互联网彻底改变了信息传递的方式,那么区块链作为构造和传递信任的媒介,将可能彻底改变整个人类社会价值传递的方式。

智能合约是区块链最关键的特性,也是区块链能够被称为颠覆性技术的主要原因。智能合约肩负着交易数据的处理和最终上链共识的重任。又由于区块链不可纂改的特性,上链数据的正确性就需要得到极高的保证,智能合约的安全性和完备性也变的更加重要。

在一些公链上,一个小小的智能合约bug就可能导致上亿美元的损失。2018年3月,美链(BEC)被爆出 ERC20 协议安全漏洞,攻击者利用整数溢出BUG,可无限生成代币。被黑客进行漏洞攻击的美链,引发了价格闪崩,当日币价几乎归0。

最著名的黑客攻击事件要数The DAO。早在2016年,这个平台被盗了高达1.5个亿美金的ETH。攻击者利用了递归调用 splitDAO 函数这一技术层面的漏洞,这起事件同时也暴露了智能合约安全性的早期缺陷。据英国和新加坡的研究人员统计,超过34000个智能合约都有可被利用的安全隐患。

而在企业级的联盟链应用场景,链上数据与企业日常业务运行有着紧密的关联。在供应链金融、大宗商品仓单等场景下,智能合约漏洞可能直接给企业在企业信用及经济上都造成无法挽回的损失。

阿里云BaaS智能合约扫描服务

阿里云区块链服务是由蚂蚁金服在阿里云上提供的企业级区块链平台服务,支持Hyperledger Fabric、蚂蚁金服自研区块链技术、以及企业以太坊Quorum三种区块链引擎,能够帮助用户简单快速的构建更安全稳定的区块链环境,实现业务快速上链。同时,不仅在产品控制台里提供了便捷的智能合约扫描服务,用户直接可以在控制台内上传智能合约,即可获取扫描的结果,在AlibabaCloud BaaS VS Code插件中,用户也可以直接远程调用智能合约扫描服务,对当前正在开发的智能合约进行扫描检测。

下面我们使用一个可以运行成功但有明显缺陷的示例智能合约来试用一下阿里云BaaS的智能合约扫描服务。
示例合约代码:sacc.go

创建检测任务

我们可以看到,目前阿里云BaaS的智能合约扫描服务支持 Hyperledger Fabric的Golang 和以太坊/Quorum的Solidity 两种智能合约。
阿里云BaaS智能合约扫描服务使用详解

阿里云BaaS智能合约扫描服务使用详解

由于智能合约的逻辑并不复杂,扫描时间在1分钟内就返回了结果。

阿里云BaaS智能合约扫描服务使用详解

下载结果,并且解压之后,直接打开 findings.html 文件,既可以看到完整的扫描报告。

扫描结果概览

阿里云BaaS智能合约扫描服务使用详解

从扫描结果的概览中,我们看到一共扫描处11处需要关注的地方,其中,有4处安全隐患以及7处最佳实践缺陷

安全隐患

安全隐患是指智能合约中存在直接影响数据安全的隐患,可能是代码的bug,也可能是不符合智能合约开发规范导致。
点击标题,可以看到该缺陷的详细说明。我们挑选了其中的4个缺陷给大家做下详细的说明。

错误的依赖

下属错误是由于引入了可能会导致执行结果不确定性的库导致。智能合约的运行需要保证多个 peer 节点上运行结果是一致的,而引入 time 可能会导致不用的 peer 节点得到不同的结果,如果该结果参与到账本数据的计算,很可能导致键值不一致而背书失败。

Tips:点击Show Code可以看到源码的信息,这样有助于快速定位问题所在。点击 Hide Code 则可以隐藏源码。

阿里云BaaS智能合约扫描服务使用详解

全局状态变量

在智能合约中,对账本数据的操作不应该依赖全局变量。全局变量仅存在当前的节点中,并没有存储到账本中,当有节点宕机或出现错误时,有可能会导致该全局变量在多个peer节点中不一致。
阿里云BaaS智能合约扫描服务使用详解

最佳实践隐患

最佳实践隐患不会对智能合约的安全性产生影响,但是可能会导致异常退出、内存泄露、性能降低等问题。示例扫描结果中,有2类最佳实践隐患:未处理异常及写后读。

未处理异常

点击 unhandled_error 可以看到所有的6处缺陷信息。忽略异常可能会导致程序的执行错误或者异常退出,因此,所有的异常信息都需要被处理。
示例代码中,func set(stub shim.ChaincodeStubInterface, args [] string) (string, error) 在被line 62调用时,使用_ 占位符来忽略掉了本应该处理的错误。
阿里云BaaS智能合约扫描服务使用详解

写后读

写操作需要在提交事务并将其写入分类账之后才能生效。 因此,当读取在同一笔交易中已经被写入的值时,将从账本中检索其旧值,该旧值往往与上面PutState的值是不一致的,这很可能会导致一些非预期的行为产生。
阿里云BaaS智能合约扫描服务使用详解

Tips:如果该缺陷检测有误或者已经被处理,可以点击 Mark as False Positive进行忽略。

上述我们使用了一个示例智能合约来对阿里云BaaS的智能合约扫描服务进行了讲解,为了编写安全和高质量的智能合约,赶紧把写好的智能合约来扫描下看看吧!

联系我们

最后,欢迎感兴趣的同学加入钉钉群(钉钉群号: 23181816)。
阿里云BaaS智能合约扫描服务使用详解

上一篇:阿里云区块链服务通过国家互联网信息办公室第二批境内区块链信息服务备案


下一篇:[转载]阿里巴巴成为全球首批「超级账本认证服务供应商 HCSP」之一