目录
在智能合约开发与审计过程中,Slither 是一款开源、功能强大的静态分析工具,由 Trail of Bits 团队维护。它通过将 Solidity 代码解析为 SlithIR(中间表示),结合污点跟踪、控制流分析等技术,帮助开发者快速定位漏洞、优化合约、理解逻辑结构。
本文将从高级角度出发,探讨 Slither 的精细定制使用方式、插件机制、CI 集成技巧及实战优化能力。
一、深入理解 SlithIR 与高级分析能力
Slither 将源码转换为 SSA 风格的 SlithIR,使其更适合污点传播、数据流分析和控制流图建立。高级用法包括:
-
利用 API 获取合约函数调用图(Call Graph)和继承图;
-
基于污点追踪发现私有变量泄露路径;
-
自定义检测器精准定位业务逻辑漏洞。
二、自定义检测器:基于 Python 的 API 开发
Slither 支持以 Python 编写检测插件,实现如“查找直接调用 transfer 前未处理返回值”之类的业务规则。
from slither.slither import Slither
from slither.core.declarations import Function
from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification
class NoUncheckedTransfer(AbstractDetector):
ARGUMENT = "no-unchecked-transfer"
HELP = "Detect transfer calls without checking return value"
IMPACT = DetectorClassification.LOW
def detect(self):
results = []
for contract in self.slither.contracts:
for func in contract.functions_and_modifiers:
for call in func.internal_calls:
if call.name in ["send", "transfer"] and func.kind == Function.Kind.FUNCTION:
results.append(self.generate_result(
f"{func.full_name} calls {call.name} without checking return"
))
return results
if __name__ == "__main__":
slither = Slither('MyContract.sol')
files = slither.run_detectors(detectors=[NoUncheckedTransfer()])
for r in files:
print(r)
-
覆盖业务常见 anti-pattern;
-
几行代码即可实现自定义逻辑。
三、高级打印器:获取逻辑结构与安全视角
Slither 内置打印器,可视化重要信息,部分打印器包括:
-
inheritance
: 输出继承树; -
call-graph
: 展示函数调用关系; -
taint
: 显示污点传播路径;
slither . --print inheritance,call-graph,taint
可输出如:
ContractA -> ContractB (is_a)
A.foo() -> B.bar()
tainted path: msg.sender -> sensitiveVar -> externalCall
用于审计流程、快速定位可疑逻辑片段。
四、多框架项目/CI 集成技巧
在 Hardhat、Foundry 等多框架项目中,建议:
-
使用
slither --config-file slither.config.json
自定义扫描路径或排除目录; -
配合 GitHub Action 每次 PR 执行静态安全审计;
-
配合 slither-docker 镜像嵌入 CI,保证一致性。
五、误报优化与结果过滤
通过配置文件可过滤低价值输出:
{
"filters": {
"detectors": ["unwrap-used"],
"contracts": ["Mock*"],
"functions": ["test*"]
}
}
配合命令:
slither --config-file slither.config.json .
减少误报噪声,尤其在测试文件、Mock 合约等目录下。
六、实战建议:如何提升审计效率
-
组合使用 detectors + printers:detect 潜在漏洞,用 printer 可视化确认路径;
-
对比 Slither 与规范检查:例如把
public
可变函数标为external
; -
自定义检测针对业务逻辑:结合合约逻辑添加检测器;
-
日志记录分析结果:将 slither 输出转为 json 并存入数据库,供持续回顾。
七、高级实用场景示例
A. ERC-20 权限漏洞分析
使用 taint printer 查看是否把 mint 权限传递给可控变量:
slither MyToken.sol --print taint
输出如:
tainted flow: msg.sender -> mintAuth -> _mint
提示警告:任何地址都可能获取 mint 权限。
B. Unchecked low-level 调用检测
slither . --detect unchecked-low-level
标记 .call()
、.delegatecall()
未检查返回值,避免重入等漏洞。
C. 股票合约迁移升级检测
针对 proxy 模式:
-
使用 call-graph 打印函数覆盖关系;
-
编写检测器发现逻辑漏洞,如 storage collision。
八:总结
-
Slither 是当前 Solidity 静态分析工具中领先者,速度快、精度高、 false positif 低;
-
支持 Python 定制检测器,极强扩展性;
-
能配合复杂审计流程、CI、框架集成使用;
-
打印器功能可视化代码结构与污点传播,对于快速理解及漏洞复查效率极高。
通过对高级功能的掌握,开发者可以构建契合自身业务逻辑的检测规则,为大规模审计提供稳定、高效、精准的静态分析能力。