MikeHathaway/smart-contract-auditor
GitHub: MikeHathaway/smart-contract-auditor
这是一个基于 GitHub Actions 的可复用工作流,通过集成 Trail of Bits 和 forefy 的 AI 技能,自动对智能合约 Pull Request 和分支快照执行深度安全审计。
Stars: 0 | Forks: 0
# codex-smart-contract-auditor
`codex-smart-contract-auditor` 是一个可复用的 GitHub Actions 仓库,用于**针对 Pull Request 和分支快照进行最大深度、顺序执行的智能合约审计**。
它将两个必需的审计技能系列连接在一起:
- Trail of Bits `building-secure-contracts`,特别是 `$secure-workflow-guide`
- forefy `.context`,特别是 `$smart-contract-audit`
目标很简单:让一个 EVM 仓库放入**一个工作流文件**,并获得合并后的 Markdown 和 JSON 审计报告,以及一个可选的置顶 PR 摘要评论。
该可复用工作流同时支持 OpenAI 托管的 Responses 和 Venice 托管的 Responses。
## 本仓库的功能
该可复用工作流:
1. 检出调用者仓库。
2. 安装确定性审计先决条件,例如 Slither。
3. 从其上游仓库的固定引用处安装外部技能包。
4. 通过仓库作用域的 `.agents/skills` 向 Codex 暴露选定的技能。
5. 构建运行时审计提示,包含审计模式、范围上下文、爆炸半径、入口点表面、代币表面和升级表面。
6. 运行**顺序** Codex 审计:
- `$secure-workflow-guide`
- `$smart-contract-audit`
- 需要时确定性触发的辅助技能,例如 `$token-integration-analyzer`、`$entry-point-analyzer` 和 `$foundry-poc`
- 合并的最终报告
7. 上传:
- `audit-report.md`
- `audit-report.json`
- `.codex-smart-contract-auditor/preflight/`
- `.context/outputs/`
8. 可选地更新置顶 PR 评论,包含严重性计数和 blocked-check 状态。
## 为什么采用顺序执行
这个 v1 设计特意采用**仅顺序执行**。
对于智能合约审计来说,这是更好的可复用默认设置:
- 一个共享的预检
- 一个确定性提示
- 更少的竞态条件
- 更简单的产物处理
- 更清晰的合并输出
- 当所需技能被阻止时,更容易调试
- 更好地保留原始审计证据
并行执行以后是可能的,但它增加了重复、合并复杂性,以及可复用工作流以嘈杂方式失败的更多途径。
## 使用者设置
向你要审计的仓库添加一个工作流文件:
```
name: Smart Contract Audit
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: read
issues: write
pull-requests: write
jobs:
audit:
uses: MikeHathaway/smart-contract-auditor/.github/workflows/codex-smart-contract-audit.yml@main
with:
provider: auto
audit-mode: pr
model: ""
effort: ""
severity-threshold: medium
fail-on-severity: high
post-pr-comment: true
pr-number: ${{ github.event.pull_request.number }}
base-sha: ${{ github.event.pull_request.base.sha }}
head-sha: ${{ github.event.pull_request.head.sha }}
secrets:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
VENICE_API_KEY: ${{ secrets.VENICE_API_KEY }}
```
即拿即用的使用者工作流:
- 通用 provider 感知示例:[`.github/workflows/example-consumer.yml`](/home/mike/Projects-2026/smart-contract-auditor/.github/workflows/example-consumer.yml)
- 仅 Venice 示例:[`.github/workflows/example-consumer-venice.yml`](/home/mike/Projects-2026/smart-contract-auditor/.github/workflows/example-consumer-venice.yml)
- 手动分支快照示例:[`.github/workflows/example-consumer-manual-snapshot.yml`](/home/mike/Projects-2026/smart-contract-auditor/.github/workflows/example-consumer-manual-snapshot.yml)
如果你直接使用此仓库,请保持 `uses:` 目标指向 `MikeHathaway/smart-contract-auditor`。
如果你 fork 或重新发布此可复用工作流,还需要设置这些高级输入以匹配你的 fork 和引用:
- `workflow-source-repository`
- `workflow-source-ref`
这是必要的,因为可复用工作流在调用者仓库上下文中运行,所以辅助脚本必须显式地从工作流源仓库检出。
## Provider Secrets
- `OPENAI_API_KEY` 用于 OpenAI 托管的 Responses
- `VENICE_API_KEY` 用于 Venice 托管的 Responses
默认情况下,将这些存储为 **GitHub Actions 仓库 secrets**:
- 仓库:`Settings` -> `Secrets and variables` -> `Actions` -> `Repository secrets`
这是该工作流的预期默认设置。它不需要 GitHub Actions 环境。
这两个 secrets 都是可选的,以便工作流可以在像 fork 的 PR 这样的环境中优雅降级。如果选定的 provider key 不可用,它仍然会生成带有 `Blocked Checks` 部分的确定性产物,而不是静默失败。
如果选择了 `provider: venice` 且未设置 `VENICE_API_KEY`,工作流将回退到 `OPENAI_API_KEY` 作为兼容性逃生舱。如果你已经在旧的 secret 名称下存储了 Venice key,这很有用,但 `VENICE_API_KEY` 是更清晰的长期设置。
如果你想跨多个仓库共享一个 provider key,请使用组织 secret。仅当你有意想要环境级别的批准或作用域,并且也在调用者工作流中连接了 `environment:` 时,才使用环境 secret。
## 快速设置指南
对于典型的 Venice 支持的 Pull Request 设置:
1. 在你要审计的仓库中,转到 `Settings` -> `Secrets and variables` -> `Actions`。
2. 在 `Repository secrets` 下,创建 `VENICE_API_KEY`。
3. 添加一个调用以下内容的工作流:
`MikeHathaway/smart-contract-auditor/.github/workflows/codex-smart-contract-audit.yml@main`
4. 设置 `provider: venice`。
5. 如果你想要工作流的 Venice 默认值,请保留 `model: ""` 和 `effort: ""`。
6. 通过以下方式传递 secret:
`VENICE_API_KEY: ${{ secrets.VENICE_API_KEY }}`
7. 打开或更新 Pull Request 以触发审计。
## 所需权限
调用者工作流:
- `contents: read`
- `issues: write` 如果你想要置顶 PR 评论
- `pull-requests: write` 如果你想要置顶 PR 评论
审计作业本身仅使用 `contents: read`。PR 写入权限被隔离到单独的评论作业。
## 输入
该可复用工作流支持以下输入:
- `provider`:`auto`、`openai` 或 `venice`;默认为 `auto`
- `audit-mode`:`pr` 或 `snapshot`;默认为 `pr`
- `model`:可选的 Codex 模型覆盖
- `effort`:可选的 Codex 推理努力覆盖
- `responses-api-endpoint`:可选的 Responses API 端点覆盖
- `working-directory`:要优先考虑的仓库子目录
- `severity-threshold`:摘要强调阈值,默认为 `medium`
- `fail-on-severity`:当存在等于或高于此严重性的发现时,使工作流失败
- `post-pr-comment`:启用或禁用置顶 PR 评论
- `extra-audit-instructions`:将额外的 markdown 指令附加到运行时提示
- `cost-profile`:`max`、`balanced` 或 `lean`;默认为 `balanced`
- `enable-tiny-auditor`:运行可选的最终关键损失扫描;默认为 `false`
- `base-sha`:可选的显式 base SHA,主要用于 `audit-mode: pr`
- `head-sha`:可选的显式 head SHA
- `pr-number`:可选的显式 pull request 编号,主要用于 `audit-mode: pr`
- `workflow-source-repository`:从何处检出辅助脚本的高级覆盖;默认为 `MikeHathaway/smart-contract-auditor`
- `workflow-source-ref`:从哪个引用检出辅助脚本的高级覆盖;默认为 `main`
Provider 默认值特意是不对称的:
- `provider: auto` 当 `OPENAI_API_KEY` 和 `VENICE_API_KEY` 都存在时优先选择 OpenAI
- OpenAI:如果 `model` 和 `effort` 为空,该 action 使用 Codex 默认值
- Venice:如果 `model` 为空,工作流使用 `openai-gpt-54`
- Venice:如果 `effort` 为空,工作流使用 `high`
- Venice:如果 `responses-api-endpoint` 为空,工作流使用 `https://api.venice.ai/api/v1/responses`
这保持了 OpenAI 行为更清晰,同时使 Venice 足够确定性以便与 `openai/codex-action` 一起使用,但对于完整的 Codex `workspace-write` 行为,Venice 仍应被视为尽力而为。
成本默认值特意是保守的:
- `cost-profile: balanced` 是默认值
- `enable-tiny-auditor: false` 是默认值
这保持了两个必需的核心技能到位,同时避免在每次运行时进行最昂贵的可选扫描。
## 工作流内部
该可复用工作流仍然暴露一个公共入口点,但最大的实现部分现在位于仓库本地辅助脚本中以便于维护:
- `scripts/run-preflight.sh`
- `scripts/validate-audit-outputs.sh`
- `scripts/upsert-pr-comment.cjs`
这使得 provider 选择、预检逻辑、回退产物生成和置顶评论行为更容易审查和更改,而无需进一步增加工作流 YAML。
## 分支快照模式
该可复用工作流现在支持一流的快照模式:
- `audit-mode: pr`
- 优先差异的 Pull Request 审查
- 可用时使用 PR 上下文
- PR 评论在这里很有意义
- `audit-mode: snapshot`
- 完整的检出分支审计
- 不假设 PR 上下文
- 最适合手动 `main` 或 release-branch 审计
在快照模式下,工作流将整个检出树视为范围内,而不是假装有有意义的 PR 差异。
在 [`.github/workflows/example-consumer-manual-snapshot.yml`](/home/mike/Projects-2026/smart-contract-auditor/.github/workflows/example-consumer-manual-snapshot.yml) 中有一个即拿即用的手动快照示例。
要审计特定的分支快照,请在 GitHub Actions "Run workflow" 分支选择器中选择该分支,或者使用 CLI 通过 `gh workflow run ... --ref ` 运行工作流。
## Venice 设置
要强制将 Venice 作为后备 Responses provider:
```
jobs:
audit:
uses: MikeHathaway/smart-contract-auditor/.github/workflows/codex-smart-contract-audit.yml@main
with:
provider: venice
audit-mode: pr
model: ""
effort: ""
secrets:
VENICE_API_KEY: ${{ secrets.VENICE_API_KEY }}
```
使用这些设置,工作流会自动解析这些 Venice 默认值:
- endpoint:`https://api.venice.ai/api/v1/responses`
- model:`openai-gpt-54`
- effort:`high`
如果你需要不同的 Venice 模型或端点,请显式传递 `model` 或 `responses-api-endpoint`。
如果配置了两个 provider secrets 并且你仍然想要 Venice,请显式设置 `provider: venice`。
工作流现在还假设 Venice 有时可能返回成功的 Responses 完成而不创建预期的仓库文件。为了处理这种情况,提示需要标记的最终消息回退块,并且工作流将在可能时从最终消息中恢复 `audit-report.md` 和 `audit-report.json`。
在 [`.github/workflows/example-consumer-venice.yml`](/home/mike/Projects-2026/smart-contract-auditor/.github/workflows/example-consumer-venice.yml) 中还有一个专门的复制粘贴 Venice 使用者工作流。
## 证据产物
此仓库现在保留的不仅仅是合并摘要。
上传的产物包括:
- `audit-report.md`
- `audit-report.json`
- `.codex-smart-contract-auditor/preflight/` 用于确定性预检证据
- `.context/outputs/` 用于原始 forefy 输出目录
这很重要,因为上游 forefy 框架期望持久的编号审计输出,并且当保留生成的摘要和图表而不是被转述时,Trail of Bits 工作流会明显更强。
## 报告包含的内容
`audit-report.md` 包含合并的人类可读报告,包含以下部分:
1. Executive Summary
2. Scope
3. PR / Diff Context or Snapshot Context
4. Blast Radius
5. Skills / Checks Run
6. Findings Table
7. Detailed Findings
8. Attack Paths / PoC Notes
9. Security Properties to Add
10. Tests / Verification Gaps
11. Blocked Checks
12. Recommended Next Actions
`audit-report.json` 包含一个确定性的机器可读摘要,适用于:
- 基于 Codex 的审查者工具
- 未来的 Claude 审查者集成
- 后处理管道
- 仪表盘和策略门控
JSON 包括:
- 严重性计数
- 审计模式
- 已更改和已审查的范围
- 运行的检查
- 带有源技能的发现
- 分类器状态和产物路径(如果可用)
- 要添加的安全属性
- 被阻止的检查
## 如何集成技能包
### Trail of Bits
此仓库在固定引用处安装 `trailofbits/skills`,并通过 `.agents/skills` 暴露选定的智能合约技能,包括:
- `secure-workflow-guide`
- `token-integration-analyzer`
- `entry-point-analyzer`
- `guidelines-advisor`
提示明确要求运行 `$secure-workflow-guide`,并明确要求合并报告涵盖其 5 步工作流:
- 已知问题扫描
- 特殊功能检查
- 目视检查
- 安全属性
- 手动审查区域
### forefy
此仓库在固定引用处安装 `forefy/.context` 并暴露这些仓库作用域技能:
- `smart-contract-audit`
- `foundry-poc`
- `tiny-auditor`
提示明确要求 `$smart-contract-audit` 并要求 forefy 风格的输出:
- 已分类的发现
- 多专家分析
- 分类器验证
- 漏洞路径推理
- 攻击路径 / 调用流分析
- 实用的现实 PoC 注释
- 修复指导
它还保留原始编号的 `.context/outputs/X/` 审计跟踪,而不是仅用顶级摘要替换它。
## 确定性辅助技能触发
辅助技能行为现在取决于运行时成本配置文件:
- `cost-profile: max`倾向于最大的辅助技能深度
- `cost-profile: balanced` 仅在辅助技能增加超出确定性预检产物的信号时才运行
- `cost-profile: lean` 最小化辅助技能的使用,除非它们实质性地提高发现质量
主要的辅助触发器是:
- 与代币相关的爆炸半径 -> 当它增加超出预检产物的信号时触发 `token-integration-analyzer`
- 已更改的外部、管理员、治理或升级表面 -> 当它增加超出预检产物的信号时触发 `entry-point-analyzer`
- 合理的高严重性漏洞加上 Foundry 可用性 -> `foundry-poc`
- 可选的最终可处理损失扫描 -> 仅当 `enable-tiny-auditor: true` 时触发 `tiny-auditor`
## 技能安装如何工作
`install-skills.sh` 克隆上游技能仓库,然后将选定的技能目录符号链接到调用者仓库的 `.agents/skills` 文件夹。
这很重要,因为 Codex 官方从工作树中的 `.agents/skills` 发现仓库作用域技能。
安装程序是:
- 幂等的
- 模块化的
- 易于扩展
- 固定到具体的上游引用
要稍后添加另一个技能包,只需更新:
- [`install-skills.sh`](/home/mike/Projects-2026/smart-contract-auditor/install-skills.sh)
- [`audit-prompt.md`](/home/mike/Projects-2026/smart-contract-auditor/audit-prompt.md)
## 置顶 PR 评论行为
当 `post-pr-comment` 为 `true` 时,工作流会保持一个由以下内容标识的置顶评论:
```
```
评论包括:
- 整体状态
- 严重性计数
- 被阻止的检查计数
- 产物名称
详细的 markdown 和 JSON 报告保留在工作流产物中,而不是刷屏 PR 线程。
## 安全说明
此工作流主要设计用于不受信任的 Pull Request,但相同的信任模型对于手动分支快照审计也很重要。
此处包含的安全默认设置:
- 使用者示例使用 `pull_request`,而不是 `pull_request_target`
- checkout 使用 `persist-credentials: false`
- 审计作业仅使用 `contents: read`
- PR 写入权限被隔离到评论作业
- Codex 使用 `safety-strategy: drop-sudo` 运行
- Codex 使用 `sandbox: workspace-write` 运行
- 不请求额外的仓库写入权限
- 在模型运行之前生成确定性预检产物
额外的面向严谨性的设置:
- 安装 `graphviz`,以便 Trail of Bits 视觉输出不太可能被阻止
- 当检测到 `foundry.toml` 仓库时,使用官方 `foundry-rs/foundry-toolchain` action 安装 Foundry
- 在模型启动之前运行尽力而为的预检 Slither 摘要
同样重要的是:
- 不要在未经清理的情况下将原始的不受信任的 PR 描述或 issue 正文输入到提示中
- 保持 provider API keys 作用于可复用工作流调用
- 请记住,在某些仓库中预期会出现被阻止的检查,特别是当 Slither 或更深入的静态分析无法在没有额外项目设置的情况下干净运行时
## 限制
- 此仓库在 v1 中**不**尝试并行多代理执行。
- 它故意避免使用未记录的 `openai/codex-action@v1` 输入。
- 智能合约仓库差异很大。某些检查仍会在编译器或依赖项布局上被阻止。发生这种情况时,工作流会报告阻止,而不是假装检查已运行。
- 对于 fork 的 PR,GitHub 经常扣留 secrets。在这种情况下,你仍然会获得产物,但报告将显示 Codex 执行被阻止。
- Venice 支持取决于 Venice 继续接受 Codex 兼容的 Responses API 载荷。工作流现在直接针对 Venice 的 `/api/v1/responses` 端点,但特定于 provider 的载荷差异仍可能影响行为。
- 如果你需要实质性地降低 token 使用量,最大的杠杆是 `cost-profile: lean` 并将 provider `effort` 从 `high` 降低到 `medium`。
## 兼容性
该仓库的构建使得输出可以在 Codex 之外重用:
- 提示主要是审查者无关的 markdown
- 工作流将编排与提示内容分离
- 安装程序独立于报告格式
- 最终 JSON 足够确定性,可用于未来的 Claude 或其他审查者工具
## 上游技能许可
此仓库**不**将第三方技能内容引入仓库树。
相反,它在运行时从上游源安装它们:
- Trail of Bits 技能保留其上游许可和历史
- forefy `.context` 保留其上游许可和历史
在固定或重新分发修改版本之前,请查看这些上游仓库。
标签:AI审计, Codex, Cutter, DevSecOps, EVM, Foundry, GitHub Actions, MITM代理, OpenAI, Petitpotam, POC验证, Pull Request, Slither, Trail of Bits, Venice, 上游代理, 云安全监控, 代码审查, 以太坊, 内存规避, 区块链, 智能合约, 消息认证码, 网络调试, 自动化, 自动笔记, 静态分析