第1章:智能合约审计工具:Slither、Mythril、Oyente、Securify的使用与配置
做智能合约审计这几年,我最大的感触就是:工具用得好,漏洞跑不了。很多新手一上来就盯着代码硬看,说实话效率太低了。我刚开始做审计那会儿,也犯过这种傻——对着几百行Solidity代码逐行读,结果漏掉了一个重入漏洞,差点出大事。
后来我学乖了。审计工具不是万能的,但没有工具是万万不能的。今天我就把这四个最常用的工具——Slither、Mythril、Oyente、Securify——掰开揉碎了讲清楚。你想想看,这些工具各有各的脾气,用对了事半功倍,用错了反而添乱。
核心观点:没有哪个工具能覆盖所有漏洞类型。我的习惯是——先用Slither做静态扫描,再用Mythril做动态分析,最后用Oyente和Securify做交叉验证。四管齐下,基本能覆盖90%以上的常见漏洞。
1.1 Slither:静态分析的王者
Slither是我个人最常用的工具,没有之一。它由Trail of Bits开发,用Python写的,专门做Solidity的静态分析。说白了,它就是把你的代码从头到尾读一遍,然后告诉你哪里可能有问题。
安装配置:
# 用pip安装,简单粗暴
pip install slither-analyzer
# 验证安装
slither --version
# 基本用法
slither ./contracts/MyContract.sol
我在项目中遇到过最典型的场景:一个DeFi项目的合约有3000多行,我手动看了两小时头都大了。用Slither一跑,5分钟就发现了3个严重漏洞——包括一个未初始化的storage指针和一个危险的delegatecall调用。
我的小技巧:Slither支持输出JSON格式的结果,方便集成到CI/CD流水线里。命令是 slither . --json results.json。这样每次代码提交都能自动跑一遍审计。
常用检测器一览:
| 检测器名称 | 检测内容 | 严重程度 |
|---|---|---|
| reentrancy | 重入漏洞 | 高 |
| uninitialized-state | 未初始化状态变量 | 高 |
| tx-origin | tx.origin滥用 | 中 |
| timestamp | 时间戳依赖 | 低 |
| unused-return | 未使用的返回值 | 中 |
1.2 Mythril:符号执行的利器
Mythril跟Slither不一样,它用的是符号执行技术。什么意思呢?就是它不会只看代码表面,而是会模拟各种可能的执行路径,看看有没有漏洞能被触发。
嗯,这里要注意——Mythril跑起来比Slither慢很多,但查出来的漏洞往往更深。我建议你先用Slither扫一遍,再用Mythril做深度分析。
# 安装Mythril
pip install mythril
# 分析合约
myth analyze ./contracts/MyContract.sol
# 指定交易数量限制(防止跑太久)
myth analyze ./contracts/MyContract.sol --execution-timeout 60
避坑指南:我曾经有一次用Mythril分析一个复杂的DeFi合约,跑了整整两个小时还没出结果。后来发现是合约里有个无限循环的逻辑,导致符号执行爆炸了。遇到这种情况,记得加 --execution-timeout 参数限制时间。
Mythril最擅长检测的漏洞类型:
- 整数溢出/下溢
- 重入漏洞(比Slither更准)
- 未授权的资金转移
- 危险的delegatecall
1.3 Oyente:老牌工具,宝刀不老
Oyente算是智能合约审计工具里的老前辈了。2016年就出来了,虽然现在用得少了,但有些场景下它依然有独特价值。
说实话,Oyente的检测能力不如Slither和Mythril全面。但它有一个优点——轻量、快速。如果你只是想快速验证一下合约有没有明显的漏洞,Oyente是个不错的选择。
# 安装Oyente(需要Docker)
docker pull luongnguyen/oyente
# 运行分析
docker run -v $(pwd):/contracts luongnguyen/oyente python oyente.py -s /contracts/MyContract.sol
Oyente主要检测这几类漏洞:
- 交易顺序依赖(TOD)
- 时间戳依赖
- 异常处理不当
- Gas耗尽攻击
我的经验:Oyente对时间戳依赖的检测特别准。我在审计一个博彩类合约时,Slither和Mythril都没发现问题,但Oyente一下子就揪出了合约里用block.timestamp做随机数的问题。嗯,这个漏洞后来被证实确实存在。
1.4 Securify:形式化验证的代表
Securify是苏黎世联邦理工学院开发的工具,它用的是形式化验证技术。说白了,就是通过数学证明的方式来验证合约的安全性。听起来很高大上,用起来也确实有点门槛。
# Securify需要Java环境
# 下载Securify JAR包
wget https://github.com/eth-sri/securify/releases/download/v2.0/securify.jar
# 运行分析
java -jar securify.jar --contract ./contracts/MyContract.sol
Securify最牛的地方在于——它不会产生误报。Slither和Mythril有时候会报一些假阳性(就是代码其实没问题,但工具误判了),但Securify报出来的问题,基本100%是真实漏洞。
重要提醒:Securify的缺点也很明显——它只能检测有限类型的漏洞,而且对合约的复杂度有要求。太复杂的合约它可能分析不了。所以我的建议是:用Securify做最后一道防线,验证前面工具发现的问题。
1.5 四款工具对比总结
你想想看,这四个工具各有各的专长。我整理了一张对比表,方便你快速了解:
| 工具 | 技术原理 | 速度 | 准确率 | 最适合的场景 |
|---|---|---|---|---|
| Slither | 静态分析 | 快 | 中(有误报) | 快速扫描、CI集成 |
| Mythril | 符号执行 | 慢 | 高 | 深度分析、复杂漏洞 |
| Oyente | 符号执行 | 快 | 中 | 快速验证、特定漏洞 |
| Securify | 形式化验证 | 中 | 极高(无误报) | 最终验证、关键合约 |
1.6 我的审计工作流
最后分享一下我个人的审计流程。这套流程我用了两年多,审计了上百个合约,效果还不错:
- 第一步:Slither快速扫描(5分钟)——先看看有没有明显的低级错误
- 第二步:Mythril深度分析(30分钟-2小时)——重点查重入、溢出这类高危漏洞
- 第三步:Oyente交叉验证(10分钟)——查一下时间戳依赖和TOD问题
- 第四步:Securify最终确认(20分钟)——对前面发现的问题做形式化验证
- 第五步:人工复核(时间不定)——工具只是辅助,最终还是要靠人
切记:工具永远只是辅助。我曾经见过一个项目,四个工具全跑了一遍,一个漏洞都没报。结果我人工审的时候发现了一个业务逻辑漏洞——攻击者可以通过闪电贷操纵价格预言机。这种漏洞,工具是永远发现不了的。
好了,关于这四个工具的配置和使用,我就讲这么多。记住一句话:工具是死的,人是活的。多跑、多用、多总结,慢慢你就能摸透每个工具的脾气了。