ABSatVPS/nsap-ci

GitHub: ABSatVPS/nsap-ci

NSAP-CI 是一个基于 Docker 的 GitHub Action,在 CI 中对 Solidity 智能合约进行基于源码的多层安全扫描,并按严重性阈值自动阻断高危 PR。

Stars: 0 | Forks: 0

# NSAP-CI NSAP-CI 是一个基于 Docker 的 GitHub Action,用于基于源码的 Solidity 安全扫描。 它在 CI 中运行 NSAP 快速扫描,输出 SARIF/Markdown/JSON 报告,计算 SHA-256 执行哈希值,并在验证后的漏洞发现达到或超过配置的严重性阈值时,使拉取请求(pull request)失败。 NSAP-CI 不能替代人工审计员。它是一个可重现的审计前关卡,旨在在易受攻击的代码进入 `main` 分支之前捕获基于源码的问题。 ## 它的功能 - 在 GitHub Actions 中扫描 Solidity 源码 - 从代码中提取基于源码的事实 - 运行快速扫描验证层 0–2 - 输出用于 GitHub 代码扫描的 SARIF 2.1.0 - 生成 Markdown 和 JSON 报告 - 计算 SHA-256 执行哈希值 - 根据可配置的严重性阈值使 CI 失败 ## 快速安装 添加到您的 `.github/workflows/security.yml`: ``` name: NSAP Security Gate on: pull_request: branches: [main] jobs: nsap: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Run NSAP-CI uses: ./ with: source-dir: contracts fail-on: high - name: Upload SARIF if: always() uses: github/codeql-action/upload-sarif@v3 with: sarif_file: nsap-reports/nsap-results.sarif ``` ## 60 秒演示 该仓库包含两个冒烟测试固件: | 固件 | 预期结果 | |---|---| | `VulnerableBank.sol` | 2 个发现,SARIF 有效,退出代码 1 | | `CleanToken.sol` | 0 个发现,SARIF 有效,退出代码 0 | | `UncheckedArithmetic.sol` | 发现漏洞,SARIF 有效,退出代码 >= 0 | | `AccessControl.sol` | 0 个发现,SARIF 有效,退出代码 0 | 存在漏洞的固件演示了 `tx.origin` 和访问控制相关的发现。 无漏洞固件演示了通过扫描的情况。 有关包含确切命令的完整演练,请参阅 [DEMO.md](DEMO.md)。 ## 示例输出 ``` [Layer 0] Extracting semantic facts from source... [Gate 0] Validated [Layer 1] Checking invariants... [Layer 2] Scanning for known vulnerability patterns... [Promotion] Validated findings: 2 SARIF saved to nsap-reports/nsap-results.sarif Execution hash: sha256: [FAIL] Finding NSAP-001 severity high meets or exceeds fail-on threshold high exit: 1 ``` ## 它不包含的功能 NSAP-CI MVP 不是: - 专业智能合约审计的替代品, - 托管的 SaaS 平台, - AI/LLM 审计员, - 完整的形式化验证系统, - 深度的符号执行流水线, - v0.1 版本中的 PoC 生成产品, - 对已扫描合约安全性的保证。 ## MVP 范围 当前的 MVP 仅运行 NSAP 快速扫描: | 层级 | 状态 | |---|---| | 第 0 层:Rust tree-sitter 事实提取 | 已启用 | | 关卡 0:结构验证 | 已启用 | | 第 1 层:不变量检查 | 已启用 | | 第 2 层:基于源码的模式匹配 | 已启用 | | 第 1b 层:Z3 SMT | 未来路径 | | 第 1.5 层:Mythril | 未来路径 | | 第 2.5 层:Slither | 未来路径 | | 第 3 层:Julia BigInt 算术 | 未来路径 | | 第 4 层:PoC 生成 | 未来路径 | ## 路线图 计划的未来路径工作: - Marketplace 发布 - 深度扫描模式 - 可选的 Z3/Mythril/Slither/Julia 集成 - PoC 生成与验证 - 面向认证的报告 - 额外的智能合约语言支持 ## 验证状态 | 检查项 | 状态 | |---|---| | 存在漏洞的合约 + `fail-on=high` 退出代码为 1 | 通过 | | 存在漏洞的合约 + `fail-on=critical` 退出代码为 0 | 通过 | | 无漏洞合约 + `fail-on=high` 退出代码为 0 | 通过 | | 空目录退出代码为 1 | 通过 | | SARIF 2.1.0 验证 | 通过 | | 发现的问题基于源码 | 通过 | | 存在 SHA-256 执行哈希值 | 通过 | | MVP 演示验证通过 | 通过 | | 无私有路径泄露 | 通过 | | 深度扫描标记为超出范围 | 通过 | ## 工作原理 ``` Solidity source → Layer 0: Rust tree-sitter semantic fact extraction → Gate 0: Structural validation → Layer 1: Invariant verification (8 curated rules) → Layer 2: Source-grounded pattern matching → Finding promotion (co-location based confidence) → SARIF 2.1.0 + Markdown + JSON reports → SHA-256 execution hash → Severity threshold decision → exit code ``` ## 输出文件 全部写入工作区的 `nsap-reports/` 目录: | 文件 | 格式 | 用途 | |------|--------|---------| | `nsap-results.sarif` | SARIF 2.1.0 | 上传至 GitHub 代码扫描 | | `audit_report.md` | Markdown | 包含证明轨迹的易读摘要 | | `audit_report.json` | JSON | 完整的机器可读报告 | ## 严重性阈值 | `--fail-on` | 当发现的严重性为...时 CI 失败 | |---|---| | `critical` | `critical` | | `high` | `high` 或 `critical` | | `medium` | `medium`、`high` 或 `critical` | | `low` | `low`、`medium`、`high` 或 `critical` | ## 执行哈希 每次运行都会输出一个根据报告 payload 确定性计算的 SHA-256 哈希值。相同的输入(仓库 commit + 容器摘要 + 工具链版本)会产生相同的哈希值。 ## 支持的语言 - **Solidity** (>=0.8.0,已测试至 0.8.28) ## 环境要求 - **Docker** — 用于 GitHub Action 容器执行 - **Solidity** — >=0.8.0 ## 许可证 MIT
标签:GitHub Actions, SARIF, Solidity, 区块链安全, 可视化界面, 智能合约审计, 自动笔记, 请求拦截, 错误基检测, 静态代码分析