智能合约安全审计的意义
智能合约审计用于整个 DeFi 生态系统,通过对协议代码的深入审查,可以帮助解决识别错误、低效代码以及这些问题。智能合约具有不可篡改的特点,这使得审计成为任何区块链项目安全流程的关键部分。
代码审计对任何应用程序都很重要,但它们对去中心化应用程序 (dApp) 尤其重要,因为它们建立在其之上的区块链是不可变的。如果代码漏洞导致用户资金丢失,这些资金将无法找回。迄今为止,DeFi中的黑客已经损失了超过 50 亿美元。
智能合约审计包括对一个协议的智能合约代码进行详细分析,以识别安全漏洞、不良的编码实现方式和低效代码,然后再提出解决这些问题的解决方案。审计有助于确保跨 Web3 的去中心化应用程序的安全性、可靠性和性能。
智能合约代码最终将部署到 Avalanche、BNB Chain 或 Ethereum 等区块链中。一旦合约生效,任何人都可以访问它们——从终端用户到恶意攻击者——这就是为什么在启动或更新去中心化应用程序之前必须解决所有漏洞。
审计完成后,审计师会发布一份摘要报告,其中提供有关审计结果、解决方法和任何其他问题的详细信息,以及未来解决现存问题的路线图。经过全面的智能合约审计后,项目可以放心地部署他们的合约,因为应用程序的安全性有了保证,用户资金也受到保护。
被审计的项目必须先冻结代码,并向审计员提供技术文档,包括代码库、白皮书、架构和任何其他相关材料。该文档应该为审计员提供有关代码旨在实现的目标、范围和具体实施的详细指南。
安全专家团队仔细检查每一行代码,找出错误和漏洞。虽然自动化测试可以很好地识别代码中的错误,但人类工程师更有能力检测合约逻辑或架构的问题、技术上正确且通过自动化测试的不良编码实现、gas 优化以及常见攻击点(比如说抢先交易)
BscScan中某代币的智能合约如下:
常见漏洞类型
以下是当前智能合约审计清单的一部分的常见漏洞。
重新输入问题
当智能合约函数被不受信任的外部合约调用时,可能会发生重入攻击。重入攻击中,使该外部合约能够通过递归调用原始合约来耗尽用户资金或进行其他恶意操作。
整数上溢和下溢
当智能合约执行算术运算输出超过当前存储容量的数字时,可能会发生整数溢出或下溢,从而导致计算错误。
抢先交易机会
设计不合理的代码可能会泄露有关dApp尚未发生的交易信息,其他用户可以先运行这些信息,以牺牲协议为代价换取锁定利润。
重放攻击
当数据出现故障延迟或重复时,就会发生重播攻击,尤其是在硬分叉事件期间,攻击者可以使用新的系统上的消息从遗留系统中提取资金。
随机数漏洞
如果dApp使用公开的数字(例如块哈希)来播种随机数,则它很容易被利用,这就是为什么许多协议使用Chainlink VRF来实现随机性。
函数可见性错误
打算私有的函数必须定义为私有的,因为Solidity中的默认可见性属性是公共的。如果是公开的,任何人都可以调用该函数。
中心化风险
中心化机制有单点故障的问题,如果单个私钥或类似密钥被泄露,可能会破坏协议的安全性。时间锁和授予 DAO 特权是处理中心化风险的常用技术。
未锁定编译器版本
Solidity有许多编译器版本。dApps应该锁定他们使用的编译器版本,这样用户就不能用不同的版本编译它,否则这可能会导致不同的字节码和意想不到的问题。
智能合约安全审计工具
流行的智能合约安全审计工具包括:
Echidna – 一个 Haskell 程序,专为模糊测试的以太坊智能合约而设计。
Ethlint — 分析Solidity代码的风格和安全问题并帮助解决这些问题。
Mythril – EVM字节码安全分析工具,使用符号执行(symbolic execution)、SMT求解(SMT solving)和污点分析(taint analysis)来检测各种安全漏洞。
MythX – 自动扫描以太坊和其他基于EVM的区块链智能合约中的安全漏洞。
Rattle — 一个使用流敏感分析(flow-sensitive analysis)的EVM二进制静态分析框架。
Slither – 针对安全漏洞和最佳实践对Solidity源代码进行静态分析。
Solgraph — 生成一个DOT图,可视化功能控制流并显示潜在的安全漏洞。
Scribble – 规范语言和运行时验证工具,可将高级规范转换为Solidity代码。