首页 / 资讯中心 / 文章详情

如何用 Slither 与 Manticore 搭建 Solidity 合约的测试验证流程

如何用 Slither 与 Manticore 搭建 Solidity 合约的测试验证流程 ★ FEATURED ARTICLE
如何用 Slither 与 Manticore 搭建 Solidity 合约的测试验证流程【免费下载链接】publicationsPublications from Trail of Bits项目地址: https://gitcode.com/GitHub_Trending/pu/publicationspublications 仓库收录了 Trail of Bits 的安全工具与研究资料。这篇文章讲 Slither 和 Manticore 的用法先用 Slither 做静态扫描定位已知问题再用 Manticore 做符号执行探测试图覆盖不到的执行路径最后借助仓库里的审计发现数据集交叉核对检测范围。适合准备上线合约的 Solidity 开发者也适合想入门智能合约安全工具的新手。 适用场景与读者对象适合 Solidity 开发者在合约部署前想自己跑一轮验证而不是只依赖人工审查。适合想学习符号执行、静态分析概念的新手仓库自带可运行的工作坊样例可以边读边跑。当收到安全审查报告、想确认某类发现能否被自动化工具检出时用仓库内的审计发现数据集做对照。适合想把自动化检查纳入合约开发流程的小团队作为 CI 里的扫描步骤。当手写的单元测试总是漏掉某些边界输入时用 Manticore 自动生成符号输入补位。 核心能力拆解能力维度承担者落到实际的用途静态检查SlitherSolidity 先被转换进 SlithIR 中间表示再在其上跑内置安全检测器找已知漏洞模式和 gas 优化点动态验证Manticore符号执行自动构造输入逐个探索合约可能状态把手写测试没覆盖的路径跑出来自定义规则Slither Python API基于框架写自己的分析脚本比如枚举所有 public 函数做专项审查报告输出Slither printers输出人类可读的摘要配合代码评审使用练习支持仓库工作坊workshops/下提供成对的 .py 驱动脚本和 .sol 合约样例可直接跟练交叉验证数据审计发现数据集datasets/smart_contract_audit_findings/按类型、严重度、是否可被静态/动态分析检出对历史发现做了分类Slither 的关键在于 SlithIR源码先转成中间表示污点跟踪这类通用程序分析技术才能在上面稳定运行而不是停留在关键字匹配的层面。Manticore 则按状态逐个搜索合约执行过程下图是状态搜索的基本形态![Manticore 符号执行状态搜索树示意图红框表示 value 等于 1 的可达状态分支](https://raw.gitcode.com/GitHub_Trending/pu/publications/raw/89940dfbec07ad03b0989e67d78e84250765366b/presentations/Return to the 100 Acre Woods/statesearch.png?utm_sourcegitcode_repo_files)图中根节点是合约入口每个 stack 分支代表一种输入取值红色标记的是满足state.can_be_true(value 1)判定的目标状态——这正是符号执行找某条路径是否可达的典型用法。 推荐工作流克隆仓库拿到练习样例执行git clone https://gitcode.com/GitHub_Trending/pu/publications进入workshops/Using Manticore and Symbolic Execution to Find Smart Contracts Bugs - Devcon 4。目的先在有标准答案的小样例上熟悉流程。判断结果目录下examples/与exercises/中各有成对的 .py 和 .sol 文件缺文件说明拉取不完整。安装两个工具pip install slither-analyzer pip3 install manticore --user目的完成本地环境准备。判断结果两条命令均无报错输出Manticore 侧建议先跑通工作坊样例再碰真实合约。先跑 Slither 扫描slither contracts/MyContract.sol --checklist目的用内置检测器快速筛出已知漏洞模式。判断结果出现高严重度发现就先修复再进入动态验证只有低严重度提示则可直接进入第 4 步。用 Manticore 做符号执行from manticore.ethereum import ManticoreEVM m ManticoreEVM() contract m.solidity_create_contract(MyContract.sol) m.run()目的让工具自动构造输入、枚举执行路径看是否存在触发异常或违反不变量的路径。判断结果把可达的异常状态固化为一条回归测试用例跑通后重跑确认消失。用发现数据集核对覆盖范围打开datasets/smart_contract_audit_findings/initial_findings.csv。目的确认你关心的发现类型在static、dynamic字段中的检出能力标注。判断结果标注为当前自动化手段难以检出的类型保留人工审查环节不要假设工具能兜底。按需加自定义检查参考presentations/Write Better Smart Contracts By Checking Them With Slithers Python API/里的detect.py与AlarmClock.sol样例。目的按项目风险点写自己的 Slither 规则并挂进 CI。判断结果规则在你的目标合约上能稳定命中预期对象再合入流程。✅ 快速验证要点是否跑通过工作坊样例exercises/里的脚本能在本地 Manticore 环境里出结果说明环境没问题。是否出现误报抑制效果在对应行加// slither-disable-next-line注释后该条 Slither 发现是否消失。是否能定位状态Manticore 跑完后能否用状态判定如图中的state.can_be_true(value 1)确认某条件可达或不可达。是否对得上检测边界你合约涉及的发现类型在initial_findings.csv中static/dynamic字段的标注是否符合你的预期。是否量化了覆盖变化用coverage.py对比引入符号执行前后的分支覆盖率变化是否落在你新增的测试路径上。 常见误判与排障误报怎么判Slither 的每一条发现不等于真实漏洞先看报告指向的具体行判断输入是否真的来自不可信来源再决定是否处理。确认是误报时用--exclude排除对应检测器或只用// slither-disable-next-line忽略单行避免整类关闭后漏掉真实问题。Manticore 跑得慢慢通常是分支爆炸用--depth限制探索深度或缩小入口函数的分析范围。先在小样例上确认基线耗时再上真实合约避免把环境问题和状态爆炸混在一起排查。报告怎么读Slither 输出按严重度从高分开始读优化类提示统一放到最后批量处理。Manticore 的状态输出不好读时换某条件能否为真的判定方式去验证具体路径。覆盖率的数字变化要能对应到具体新增路径对应不上时先检查测试是否真的进了那条分支。 仓库资源与延伸阅读Slither 演讲资料presentations/Slither: A Static Analysis Framework for Smart Contracts/内含2019-03-07-Slither_EthCC.pdf讲清了 SlithIR 设计与四大用途。Manticore 工作坊workshops/Using Manticore and Symbolic Execution to Find Smart Contracts Bugs - Devcon 4/含exercises.pdf、manticore_api.pdf和可运行样例。Slither Python API 实操presentations/Write Better Smart Contracts By Checking Them With Slithers Python API/detect.py展示了自定义检测的写法。审计发现数据集datasets/smart_contract_audit_findings/CSV 字段含义见同目录README.md。背景论文papers/smart_contract_flaws_fc2020.pdf、papers/manticore.pdf以及 presentations/How to Become a Smart Contract Auditor/HowToBecomeASmartContractAuditor.pdf。先在workshops/的样例合约上把这套流程完整跑一遍再把自己要上线的合约接进来扫一轮。【免费下载链接】publicationsPublications from Trail of Bits项目地址: https://gitcode.com/GitHub_Trending/pu/publications创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站