oswaldblockdev/slither-detector-101

GitHub: oswaldblockdev/slither-detector-101

这是一个从基础到进阶的实战教程,指导用户如何利用 Slither 框架开发自定义的智能合约静态分析检测器。

Stars: 1 | Forks: 0

# Slither-Detector-101 🕵️‍♂️ 欢迎来到 **Slither-Detector-101** 教程系列。本仓库旨在教你如何使用 [Slither](https://github.com/crytic/slither) 框架为以太坊智能合约编写自定义静态分析检测器。 ## 🏗️ 核心概念 在深入各个关卡之前,理解 Slither 用于表示合约的层级结构至关重要。你的检测器将在这个树状结构中导航: * **Contract(合约):** 包含函数和状态变量的顶层对象。 * **Function(函数):** 包含可见性、修饰符和节点列表。 * **Node(节点):** 单独的一行或控制流语句(if、循环、表达式)。 * **SlithIR:** 中间表示,其中高级 Solidity 被分解为简化的指令(例如 `HighLevelCall`、`BinaryOp`)。 ## 🚀 10级路线图 本大纲从基础的元数据过滤过渡到复杂的数据流和依赖分析。 ### 第 1 级:“Hello World”(元数据) **目标:** 查找具有特定名称的函数。 * **学习内容:** 遍历 `contract.functions`。 * **任务:** 标记生产环境中遗留的名为 `debug_kill()` 或 `test_reset()` 的函数。 ### 第 2 级:可见性与授权 **目标:** 识别未受保护的入口点。 * **学习内容:** 检查 `f.visibility` 和 `f.modifiers`。 * **任务:** 标记那些修改了状态但缺少 `onlyOwner` 或 `onlyRole` 修饰符的 `public`/`external` 函数。 ### 第 3 级:Gas 耗尽模式 **目标:** 查找容易导致 DoS 的循环。 * **学习内容:** 识别 `node.type == NodeType.LOOP`。 * **任务:** 检测遍历动态数组长度的 `for` 循环(例如 `users.length`)。 ### 第 4 级:事件发射追踪 **目标:** 确保状态更改被记录。 * **学习内容:** 使用 `function.state_variables_written`。 * **任务:** 标记那些更新了 `balance` 映射但没有发出相应 `Transfer` 或 `Update` 事件的函数。 ### 第 5 级:接口合规性 **目标:** 验证标准实现。 * **学习内容:** 比较函数签名和返回类型。 * **任务:** 验证声称是 ERC20 的合约是否实现了具有正确 `bool` 返回类型的 `transfer` 函数。 ### 第 6 级:SlithIR 深入探究 **目标:** 分析低级操作。 * **学习内容:** 遍历 `node.irs`(中间表示)。 * **任务:** 检测 `SELFDESTRUCT` opcode 的使用,无论 Solidity 中使用的变量名如何。 ### 第 7 级:防护栏逻辑 **目标:** 分析函数要求。 * **学习内容:** 过滤节点以查找 `SolidityCall` 中的 `require()` 或 `revert()`。 * **任务:** 标记执行外部 `call` 但没有前置 `require()` 检查的函数。 ### 第 8 级:重入原语 **目标:** 识别“检查-生效-交互”违规。 * **学习内容:** 排序 `HighLevelCall` 与 `StateVariableWrite`。 * **任务:** 如果在同一个函数中,外部调用发生*之后*才写入状态变量,则发出警报。 ### 第 9 级:污点分析(数据依赖) **目标:** 追踪用户输入到敏感接收点。 * **学习内容:** 使用 `Slither.context` 和 `is_dependent()`。 * **任务:** 确定用户提供的 `address` 参数是否被用作 `low_level_call` 的目标。 ### 第 10 级:跨函数数据流 **目标:** 检测跨越多次调用的漏洞。 * **学习内容:** 跨合约的高级状态跟踪。 * **任务:** 识别未初始化的代理漏洞,即在敏感的 `setup()` 函数中未检查全局 `initialized` 布尔值。 ## 🛠️ 如何使用本仓库 1. **探索:** 每个文件夹 `level-0x` 包含一个 `detector.py` 和一个 `vulnerable.sol`。 2. **运行:** 使用以下命令执行检测器: ``` uv run ./level-01-metadata/detector.py ``` 3. **调试:** 使用 `slither-read-contract vulnerable.sol --print nodes` 查看 IR 树。
标签:ASN解析, DeFi安全, Python, Slither, SlithIR, Solidity, Web3安全, 中间代码, 云安全监控, 以太坊, 区块链安全, 技术指南, 无后门, 智能合约审计, 智能合约开发, 编程教程, 逆向工具, 配置错误, 静态分析, 风险控制