审查工具链搭建:Slither静态分析、Mythril符号执行、Echidna模糊测试、Foundry框架集成
说实话,刚入行那会儿,我总觉得审计就是拿着Solidity代码一行行读。直到有一次,一个看似完美的合约,被Slither抓出了一条隐藏的整数溢出——嗯,从那以后,我彻底改变了工作方式。
今天咱们聊聊工具链。说白了,就是给智能合约做「体检」的一套装备。我个人习惯把这四个工具组合起来用:Slither做静态分析、Mythril搞符号执行、Echidna负责模糊测试、Foundry当集成框架。它们各司其职,又互相补充。
一、Slither静态分析:代码的「X光机」
Slither是我用得最多的工具。它不运行代码,而是直接分析代码结构。你想想看,就像医生看X光片,不用开刀就能发现问题。
安装很简单:
pip3 install slither-analyzer
基本用法:
slither contracts/MyToken.sol
跑完之后,它会输出一堆检测结果。我遇到过最典型的案例——一个合约的transfer函数没有检查_to地址是否为0。Slither直接报了个unchecked-lowlevel警告。
核心检测项:
- 重入攻击:检测外部调用后是否缺少状态更新
- 未检查的返回值:比如
transfer、send的返回值被忽略 - 整数溢出:加减乘除是否使用了SafeMath或Solidity 0.8+的默认检查
- 权限控制:
onlyOwner修饰符是否遗漏
我的小技巧: 用slither --print human-summary可以生成人类可读的摘要。我每次审计新合约,第一件事就是跑这个命令,快速了解合约结构。
二、Mythril符号执行:逻辑的「探照灯」
Mythril跟Slither不一样。它不只看代码表面,而是模拟所有可能的执行路径。说白了,就是把你合约里的每个if-else分支都走一遍,看看有没有漏洞。
安装:
pip3 install mythril
使用示例:
myth analyze contracts/MyToken.sol --solc-json solc.json
我记得有一次,一个DeFi项目的合约逻辑特别复杂,嵌套了七八层if条件。Slither没发现问题,但Mythril跑了一分钟,直接报了一个「时间戳依赖」的漏洞——攻击者可以通过操纵区块时间戳来获利。
注意: Mythril跑起来比较慢,尤其是合约状态变量多的时候。我建议先跑Slither做快速筛查,再用Mythril做深度分析。别一上来就开Mythril,不然你可能要等半小时。
常用参数:
| 参数 | 作用 |
|---|---|
--execution-timeout |
设置超时时间(秒),默认60秒 |
--max-depth |
最大搜索深度,默认128 |
--solver-timeout |
SMT求解器超时时间 |
三、Echidna模糊测试:合约的「压力测试」
模糊测试,说白了就是给合约喂各种奇奇怪怪的输入,看它会不会崩溃。Echidna是这方面的专家。
安装:
cargo install echidna
写测试属性:
// 在合约里定义一个属性函数
function echidna_test_balance() public view returns (bool) {
return address(this).balance >= 0;
}
然后运行:
echidna-test contracts/MyToken.sol --contract MyToken
我曾经审计过一个借贷协议,人工测试怎么都找不到问题。但Echidna跑了10分钟,发现了一个边界情况:当用户抵押资产为0时,清算函数会直接回滚,导致整个协议卡死。嗯,这种问题人工很难想到。
Echidna的核心能力:
- 自动生成随机交易序列
- 检测不变式(invariant)是否被破坏
- 发现边界条件和异常状态
四、Foundry框架集成:把一切串起来
Foundry是我现在最常用的开发框架。它把编译、测试、部署、模糊测试全整合在一起了。你想想看,以前要装Truffle、Hardhat、Slither、Mythril一堆东西,现在一个Foundry搞定大部分。
安装:
curl -L https://foundry.paradigm.xyz | bash
foundryup
集成Slither:
# 在Foundry项目里跑Slither
slither src/ --foundry-out-dir out
集成Mythril:
# 先编译
forge build
# 再分析
myth analyze out/MyToken.sol/MyToken.json
集成Echidna:
# 在test目录下写模糊测试
forge test --fuzz-runs 10000
我的工作流:
- 用
forge build编译合约 - 跑
slither src/做静态分析 - 用
myth analyze做符号执行 - 最后
forge test --fuzz做模糊测试
整个过程大概10-15分钟,能覆盖90%以上的常见漏洞。
五、知识体系总览
下面这张图,是我自己总结的工具链配合逻辑。你一看就明白:
你看,整个流程是:源码进来,三个工具并行分析,最后汇总到Foundry里统一管理。我习惯把每个工具的配置文件都放在项目根目录,这样团队其他人拉下来就能直接跑。
避坑指南: 我曾经犯过一个错误——只依赖一个工具。结果Slither没检测出来的漏洞,Mythril也没发现,最后被Echidna抓到了。所以我的建议是:三个工具都要跑,别偷懒。每个工具都有自己的盲区,组合起来才能覆盖全面。
好了,工具链就聊到这儿。记住一句话:工具是死的,人是活的。再好的工具,也得靠你判断哪些是真漏洞、哪些是误报。多跑、多看、多总结,慢慢你就能一眼看出问题所在。