# 迭代式代码安全审计 `安全审计` `Claude Code` `智能体` `漏洞检测` `多语言支持` # N E M E S I S ### 无处遁形的审计者 ``` +===============================================================+ | | | "涅墨西斯——惩罚傲慢者的神圣复仇女神。" | | | | 你的代码是带着自信写就的。 | | 涅墨西斯质疑这份自信。 | | 然后找出你的自信忘记保护的地方。 | | 然后再次质疑。 | | | | 没有任何东西能同时通过两轮审查。 | | | +===============================================================+ ``` 一款用于 [Claude Code](https://docs.anthropic.com/en/docs/claude-code) 的迭代式深度逻辑安全审计代理。Nemesis 将两种互补的审计方法交替组合成反馈循环,以发现单一方法无法独立捕获的漏洞。**语言无关**——支持 Solidity、Move、Rust、Go、C++、Python、TypeScript 或任何代码库。 --- ## 工作原理 Nemesis 是一个**代理**——一个在两个子代理之间运行迭代交替循环的编排器: | 轮次 | 代理 | 发现内容 | |------|------|----------| | 1 | **费曼审计器** | 通过第一性原理质疑发现业务逻辑漏洞。每一行代码都受到挑战,每一个假设都被暴露。 | | 2 | **状态不一致审计器** | 耦合状态同步漏洞。映射每一条状态变更路径,找出一侧更新而另一侧未更新的缺口。 | | 3+ | **交替定向审查** | 每轮结果作为下一轮的输入。费曼发现的可疑点成为状态审计目标,状态缺口成为费曼追问的对象。 | 循环持续至**收敛**——某轮审查无新发现为止(最多 6 轮)。 ### 为何两者缺一不可? - **单独使用费曼** 能发现逻辑漏洞,但可能遗漏结构性状态缺口 - **单独使用状态不一致审计器** 能发现同步漏洞,但可能遗漏状态如此设计的原因 - **Nemesis** 交替运行两者,每轮结果反馈至下一轮,在每次迭代中发现上一轮遗漏的漏洞 --- ## 环境要求 - 已安装并配置 [Claude Code](https://docs.anthropic.com/en/docs/claude-code) CLI - 需要审计的代码库 --- ## 安装 ### 方案 A:复制到你的项目中(推荐) ```bash # 克隆本仓库 git clone https://github.com/0xiehnnkta/nemesis-auditor.git # 将 .claude 文件夹复制到你的项目中 cp -r nemesis-auditor/.claude /path/to/your-project/ # 复制完成后可删除克隆的仓库 rm -rf nemesis-auditor ``` ### 方案 B:直接在本仓库中运行 ```bash # 克隆并进入仓库 git clone https://github.com/0xiehnnkta/nemesis-auditor.git cd nemesis-auditor # 将你的代码库软链接到此目录 ln -s /path/to/your/contracts ./contracts ``` --- ## 使用方法 ### 1. 在项目目录中启动 Claude Code ```bash cd /path/to/your-project # 必须包含 .claude/ 文件夹 claude ``` ### 2. 启动审计 在 Claude Code 提示符中输入以下任意命令: ``` /nemesis # 完整迭代审计(推荐) /nemesis --contract MyToken # 审计单个合约 /nemesis --pass1 # 仅运行费曼审计器 /nemesis --pass2 # 仅运行状态不一致审计器 ``` ### 3. 接下来发生什么 输入 `/nemesis` 后,代理将执行: 1. **阶段 0——侦察:** 扫描代码库,识别入口点,构建攻击者目标清单 2. **第 1 轮——费曼审计器:** 逐行阅读每个函数,追问"这行代码为何存在?修改它会破坏什么?它依赖什么假设?"产出发现、可疑点及暴露的假设 3. **第 2 轮——状态不一致审计器:** 映射每对耦合状态(余额 <-> 检查点、质押量 <-> 奖励债务等),追踪每条变更路径,找出一侧更新而另一侧未更新的所有缺口。将第 1 轮的可疑点作为额外目标 4. **第 3 轮及以后——迭代精化:** 费曼重新审问第 2 轮的缺口,状态审计器重新检验第 3 轮的新发现,交替进行直至无新内容出现 5. **最终——整合:** 去重、验证所有严重/高危/中危发现,生成最终报告 ### 4. 查看结果 发现内容保存至 `.audit/findings/`: ``` .audit/findings/ feynman-pass1.md # 第 1 轮费曼发现 state-pass2.md # 第 2 轮状态不一致发现 feynman-pass3.md # 第 3 轮定向费曼(如需要) state-pass4.md # 第 4 轮定向状态(如需要) nemesis-verified.md # 最终整合并验证的报告 ``` ### 5. 中断后继续 若审计中途被中断: ``` /nemesis --continue # 从最后完成的轮次继续 ``` --- ## 所有命令 | 命令 | 功能 | |------|------| | `/nemesis` | 完整迭代审计直至收敛 | | `/nemesis --pass1` | 仅第 1 轮——完整费曼审计器 | | `/nemesis --pass2` | 仅第 2 轮——基于已有第 1 轮输出的状态不一致审计 | | `/nemesis --continue` | 从上次中断处继续 | | `/nemesis --contract [name]` | 限定在单个合约范围内的完整审计 | | `/feynman` | 独立运行费曼审计器(无迭代) | | `/state-audit` | 独立运行状态不一致审计器(无迭代) | --- ## 发现格式 报告中每条发现包含: ```markdown ### 发现 NEM-001:[标题] **严重性:** 严重 | 高危 | 中危 | 低危 **发现路径:** 仅费曼 | 仅状态 | 交叉反馈 第N轮 -> 第M轮 **根本原因:** [问题所在及原因] **触发序列:** 1. [逐步复现步骤] **影响:** [产生的后果——资金损失、状态锁定等] **修复方案:** [最小代码改动] **验证方式:** 代码追踪 | PoC 测试 | 两者皆有 ``` --- ## 架构 Nemesis 由 3 个 Claude Code 技能构建: ``` .claude/ skills/ nemesis-auditor/ SKILL.md # 编排器——运行迭代循环 feynman-auditor/ SKILL.md # 第一性原理逻辑漏洞发现器 state-inconsistency-auditor/ SKILL.md # 耦合状态同步漏洞检测器 ``` ### 费曼审计器 运用费曼技术:若无法解释某行代码为何存在,则说明你未真正理解这段代码——而理解断裂之处,正是漏洞藏身之所。 - **阶段 0:** 攻击者视角侦察(什么值得窃取?攻击链是什么?) - **阶段 1:** 范围与清单——构建函数-状态矩阵 - **阶段 2:** 逐函数审问(7 大类别,每函数 28+ 个问题) - **阶段 3:** 跨函数分析(守卫一致性、逆向对称性) - **阶段 4:** 综合原始发现 - **阶段 5:** 验证关卡(消除误报) ### 状态不一致审计器 系统性地发现某操作修改了一部分耦合状态却未更新其依赖对应项的漏洞。 - **阶段 1:** 映射所有耦合状态对(余额 <-> 检查点、质押量 <-> 奖励债务等) - **阶段 2:** 找出每个状态变量的所有变更路径 - **阶段 3:** 交叉验证——每次变更是否更新了所有耦合状态? - **阶段 4:** 检查函数内的操作顺序 - **阶段 5:** 比较并行代码路径(提现 vs 清算、转账 vs 销毁) - **阶段 6:** 追踪多步骤用户旅程中的陈旧状态积累 - **阶段 7:** 检测隐藏损坏不变量的掩蔽/防御性代码 - **阶段 8:** 验证关卡(消除误报) --- ## 语言支持 Nemesis **与语言无关**。逻辑漏洞存在于推理之中,而非语法之内。 | 语言 | 状态 | |------|------| | Solidity | 完全支持 | | Move(Sui/Aptos) | 完全支持 | | Rust | 完全支持 | | Go | 完全支持 | | C++ | 完全支持 | | Python | 完全支持 | | TypeScript | 完全支持 | --- ## 许可证 MIT