©2020云安全联盟大中华区-版权所有1 @2020云安全联盟大中华区-保留所有权利。你可以在你的电脑上下载、储存、展示、查看、打印及,或者访问云安全联盟大中华区官网(https://www.c-csa.cn)。须遵守以下:(a)本文只可作个人、信息获取、非商业用途;(b)本文内容不得篡改;(c)本文不得转发;(d)该商标、版权或其他声明不得删除。在遵循中华人民共和国著作权法相关条款情况下合理使用本文内容,使用时请注明引用于云安全联盟大中华区。 致谢 云安全联盟大中华区(简称:CSAGCR)区块链安全工作组在2020年2月份成立。由黄连金担任工作组组长,9位领军人分别担任9个项目小组组长,分别有:知道创宇创始人&CEO赵伟领衔数字钱包安全小组,北大信息科学技术学院区块链研究中心主任陈钟领衔共识算法安全小组,赛博英杰创始人&董事长谭晓生领衔交易所安全小组,安比实验室创始人郭宇领衔智能合约安全小组,世界银行首席信息安全架构师张志军领衔Dapp安全小组,元界DNA创始人兼CEO初夏虎领衔去中心化数字身份安全小组,北理工教授祝烈煌领衔网络层安全小组,武汉大学教授陈晶领衔数据层安全小组,零时科技CEO邓永凯领衔AML技术与安全小组。 区块链安全工作组现有100多位安全专家们,分别来自中国电子学会、耶鲁大学、北京大学、北京理工大学、世界银行、中国金融认证中心、华为、腾讯、知道创宇、慢雾科技、启明星辰、天融信、联想、OPPO、零时科技、普华永道、安永、阿斯利康等六十多家单位。 本白皮书主要由智能合约安全小组专家撰写,感谢以下专家的贡献: 原创作者:郭宇、黄连金、吴潇、姚昌林、赵伟(按照字母排序) 审核专家:郭文生、叶振强、于晓航、余弦、祝烈煌(按照字母排序)贡献单位:长亭科技、知道创宇(按照字母排序) 关于研究工作组的更多介绍,请在CSA大中华区官网(https://c-csa.cn/research/)上查看。 如本白皮书有不妥当之处,敬请读者联系CSAGCR秘书处给与雅正!联系邮箱:info@c-csa.cn;云安全联盟CSA公众号: 序言 智能合约作为区块链的重要技术极大地扩展了区块链的应用场景与现实意义,被广泛地应用于金融、游戏、保险、物联网等多个领域,但同时也面临着严重的安全风险。相比于普通程序而言,智能合约的安全性不仅影响合约参与多方的公平性,还影响合约所管理的庞大数字资产的安全性。因此,对智能合约的安全性及相关安全漏洞开展研究显得尤为重要。 CSAGCR对于智能合约的安全进行系统化研究,从不同的角度去分析智能合约的安全,从智能合约开发者角度,在第一章从智能合约的安全框架出发提出了测试标准,可以为开发者在内部安全测试中参考。第二章结合部分典型案例,具体剖析曾发生过的经典智能合约安全事件和深层次原因,有利于开发者了解已经发生过的智能合约安全事件,引以为戒。第三章分析总结智能合约最佳实践,包括针对智能合约生态常见问题的基本对策、社区最佳实践和安全开发资料,以及推荐工具,可以在开发过程中使用。第四章从第三方审计的角度介绍智能合约安全审计的Checklist,供第三方审计参考使用。第五章做了简要的总结。 本文档主要用Solidity语言进行说明,因为绝大多数的智能合约是用Solidity进行编程的,但是大部分安全指南内容也可以用到其他编程语言开发的智能合约。智能合约的技术和编程语言在不停地发展,安全方面也需要与时俱进。本文档作为第一个版本抛砖引玉,希望专家们批评指正。 李雨航YaleLiCSA大中华区主席兼研究院院长 目录 致谢2 序言4 1.测试标准6 1.1合约平台底层安全6 1.2合约设计与实现安全8 1.3合约生态工具安全11 1.4合约交互与数据安全13 2.典型案例15 2.1重入漏洞15 2.2整数溢出漏洞15 2.3合约库安全问题16 2.4复杂DeFi协议组合安全16 2.5非标准接口16 2.6管理员权限过高或较中心化17 2.7业务逻辑与区块链共识产生冲突17 2.8开发者应持续关注更多安全案例18 3.最佳实践18 3.1基本对策18 3.2社区最佳实践和安全开发资料20 3.3推荐工具21 4:以太坊智能合约审计CheckList22 4.1编码规范问题23 4.2设计缺陷问题26 4.3编码安全问题32 4.4编码设计问题42 4.5编码问题隐患49 5.总结57 参考资料58 1.测试标准 智能合约是部署和运行在区块链上的程序。借助区块链,智能合约可以实现资产管理、多方游戏等各类去中心化应用(dApp)。与传统程序一样,智能合约中存在漏洞也在所难免。然而不同的是,智能合约运行在更为开放的环境中,并天生带有金融属性,且升级成本极高。这意味着其对安全的要求更高,任何一点瑕疵都可能带来无法预估的后果。 智能合约安全本身是一个系统性和专业性极强的工程,需要综合考虑合约平台底层安全、合约设计与实现安全、合约生态工具安全、合约交互与数据安全等各方面,任何一个环节出现细微问题都会留下极大的隐患。本标准从以上各个方面分别阐述,并给出详细具体要求,旨在通过规范测试标准提升智能合约安全水平。 图1-1 下面,我们从合约平台底层安全、合约设计与实现安全、合约生态工具安全、合约交互与数据安全四个方面规范智能合约安全测试标准。 1.1合约平台底层安全 本部分讨论智能合约平台相关的底层安全,包括虚拟机、区块链节点等。 1.1.1虚拟机安全 虚拟机是智能合约运行所需的环境(例如应用最广泛的以太坊EVM),关系着合约的执行结果,以及能否对区块链状态进行正确更改。虚拟机安全是智能合约安全的重要基石,合约执行功能的正确性、区块链系统的安全性都与之密切关联。智能合约必须能在虚拟机内正确且安全地执行。 具体要求: 1、不同操作符资源定价合理(如以太坊中对不同指令收取不同Gas费用) 2、准确执行操作符,操作符无二义性 3、能保证合约程序的终止性 4、能够安全处理异常调用 5、能保证合约对数据段的正确读取权限 6、不包含存在明显安全隐患的特性 7、不存在虚拟机逃逸漏洞 8、不存在任意代码执行漏洞 9、不存在DOS漏洞 10、预编译合约(内建合约、系统合约)调用与执行安全 1.1.2区块链节点安全 完整的区块链系统由众多部署运行在不同机器上的节点构成。智能合约通过交易的形式在节点上部署和执行,而节点则会开放接口供外部调用或查询合约。节点需做好最坏情况下的安全防护,确保主机安全。智能合约的部署与运行应不影响区块链节点的正常工作,且不影响节点间的同步与共识。 具体要求: 1、区块链系统(节点)运营者需要做好安全防护,保障主机安全 2、区块链系统(节点)需要防止已部署合约代码被任意篡改 3、区块链系统(节点)需要防止针对已部署合约的非法调用 4、提供合约查询和调用服务的节点需确保自身状态正确且保持最新 5、防止合约部署或调用占用节点过多计算资源 6、防止合约部署或调用引起节点崩溃 7、能够正常防范针对节点发起的其他形式的攻击 1.2合约设计与实现安全 本部分讨论智能合约代码实现层面的安全,包括常见安全漏洞、业务逻辑安全、规范标准、权限安全等。 1.2.1常见合约安全漏洞 智能合约开发者应当熟悉各类常见的安全漏洞,在编写智能合约时注意规避。另外还尤其要关注传统程序与智能合约开发之间的差异。合约代码实现应规避常见安全漏洞。 具体要求: 1.正常通过编译且无警告输出 2.合约各功能能够正常执行 3.不存在冗余代码 4.能够安全进行和接受转账 5.无「数值溢出」漏洞 6.无「随机数预测」漏洞 7.依赖的合约代码库安全可靠 8.合理校验输入数据 9.严格进行权限校验 10.不存在未知步数循环 11.无「重入(Reentrancy)」漏洞 12.充分检查合约中硬编码的地址 13.通知事件(Event)与代码实际执行保持一致 14.关键逻辑判断不依赖可被矿工操纵的变量(区块哈希、时间戳等) 15.关键逻辑判断不依赖可被用户任意操纵的变量(如合约内资产数量等) 16.无严重消耗资源(如以太坊平台的Gas、EOS平台的Ram)的操作 17.合约正式部署上线前应该经过详细测试(核心代码测试覆盖率95%以上)或第三方安全审计 1.2.2业务逻辑安全 作为去中心化应用的核心部分,智能合约还需要可靠的设计。糟糕的设计可能会引入难以发现的深层次安全问题,这类问题往往无法简单通过扫描源代码发现。智能合约设计者需要综合考虑业务逻辑、多角色权限和博弈、区块链共识等多方面因素。合约业务逻辑设计与实现应不存在明显安全问题。 具体要求: 1.合约的机制设计无明显缺陷 2.合约代码实现与业务逻辑设计相符合,不存在歧义 3.多角色的合约,各角色权限和优先级划分明确 4.多角色的合约,各角色之前的公平性有一定保障 5.存在博弈环节的合约,博弈过程无明显漏洞 6.不存在「抢先交易」或「交易顺序依赖」的风险 7.不存在「拒绝服务」(Denial-of-Service,DoS)风险 8.不会因「薅羊毛」等行为给合约正常运行造成不良影响 9.不存在交易参数签名重放问题 10.业务逻辑不会与合约所属区块链系统共识机制产生冲突 1.2.3合约规范标准 智能合约开发应当做到规范,遵循社区公认的代码最佳实践,以降低代码安全审计复杂度。智能合约本身表达比较灵活,而社区或特定行业会因为发展需要,对同类型的合约进行接口规范约定。这可以降低与各个合约的对接成本,并利于统一收录和交互。相反,如果合约规范标准得不到应有的重视,则会出现各类兼容性问题甚至安全隐患。特定类型合约应符合相应标准。 具体要求: 1.函数及变量标明可见性,遵循变量声明和作用域的规范 2.变量标明数据类型 3.不使用已过期或即将废弃的用法 4.代码风格简洁,命名规范 5.特定类型合约实现严格按照相关合约标准(如ERC20、ERC721),保持接口和实现的兼容性 6.使用经过多方充分讨论和审计的合约标准和代码实现 7.优先使用经过详细测试或审计的可靠合约代码库,并确保在理解的情况下进行使用 8.规范使用内置函数 1.2.4合约权限安全 部分智能合约会受管理员控制,而部分管理员甚至拥有极高的特殊权限,特定场景下会威胁合约其他用户的资产安全。为了智能合约安全,我们一方面需要警惕超级管理员作恶,另一方面需要考虑管理员身份被盗用所带来的后果。接口调用权限、管理员权限等需要划分清晰。 具体要求: 1.限制管理员的特殊权限,防止权限过大,不可危及普通用户安全 2.合约管理员账户应该通过多重签名钱包(合约)的方式来安全管理 3.安全保护管理员私钥,防止因管理员身份被盗用对合约造成致命影响 4.无其他极易发生「单点失效」的薄弱环节,必要时引入多签账户或DAO降低风 险 1.3合约生态工具安全 本部分讨论智能合约生态基础设施工具安全,包括合约语言、编译器、测试工具、代码扫描工具等。 1.3.1合约语言设计安全 开发者会使用特定的智能合约语言编写智能合约,而合约语言本身的设计会从底层影响开发难度、开发效率以及合约安全性。 具体要求: 1.具备完整明确的语义定义 2.不存在容易导致漏洞的非确定语义 3.语言开发文档描述完整,文档定义与语言实现保持一致 4.不包含存在安全隐患的特性 1.3.2编译器安全 编译器通过语法、语义分析,将开发者编写的源代码经过解析最终转换为目标代码 (通常是机器码)。安全可信的编译器对于智能合约安全尤为重要:一方面,编译器需确保源代码到目标代码的正确翻译,不引入错误;另一方面,编译器还可具备一定的安全检测特性,从而可尽早帮助开发者发现源代码中的常见安全风险。 具体要求: 1.能够正确地将源代码翻译成目标代码 2.能够检查常见合约漏洞并给出清晰的提示 3.编译优化不应引入新的代码漏洞或改变代码原始功能 4.编译器的实现具备完整的测试框架和测试用例 1.3.3测试工具、代码扫描工具、测试环境 智能合约平台应该为开发者提供良好的调试工具、代码扫描工具和测试环境