第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 我的审计工作流

最后分享一下我个人的审计流程。这套流程我用了两年多,审计了上百个合约,效果还不错:

  1. 第一步:Slither快速扫描(5分钟)——先看看有没有明显的低级错误
  2. 第二步:Mythril深度分析(30分钟-2小时)——重点查重入、溢出这类高危漏洞
  3. 第三步:Oyente交叉验证(10分钟)——查一下时间戳依赖和TOD问题
  4. 第四步:Securify最终确认(20分钟)——对前面发现的问题做形式化验证
  5. 第五步:人工复核(时间不定)——工具只是辅助,最终还是要靠人

切记:工具永远只是辅助。我曾经见过一个项目,四个工具全跑了一遍,一个漏洞都没报。结果我人工审的时候发现了一个业务逻辑漏洞——攻击者可以通过闪电贷操纵价格预言机。这种漏洞,工具是永远发现不了的。

好了,关于这四个工具的配置和使用,我就讲这么多。记住一句话:工具是死的,人是活的。多跑、多用、多总结,慢慢你就能摸透每个工具的脾气了。

智能合约审计工具工作流 智能合约源码 Slither 静态分析 Mythril 符号执行 Oyente 老牌工具 Securify 形式化验证 交叉验证 & 结果汇总 人工复核(最终决策) 审计报告

专注资料整理