salmanabdurrahman/pi-security-review

GitHub: salmanabdurrahman/pi-security-review

一个基于 Pi 扩展的本地优先 AI 代码安全审查工具,通过 Git diff 范围构建上下文并调用 LLM 模型分析 HIGH/MEDIUM 级别安全发现,生成结构化报告。

Stars: 0 | Forks: 0

# pi-security-review 针对 Pi 的高信噪比安全审查包。它根据本地 Git diffs 构建有边界的审查上下文,通过 Pi 的活动 model/provider 排队发送与 provider 无关的 prompt,捕获结构化结果,在交互式/工具流程中应用确定性的误报过滤器,并可选择发布受控的 GitHub PR 评论。 本包针对 Pi 包生态系统调整了来自 [`anthropics/claude-code-security-review`](https://github.com/anthropics/claude-code-security-review) 的安全审查理念:Pi 命令、Pi LLM 工具、Pi model/provider 生命周期、有限的本地报告、与 provider 无关的 prompt 以及明确的写入批准。 该包以本地优先、无遥测为原则,专为交互式 Pi 审查以及无头 CI 产物/最终报告工作流而设计。 ## 目录 - [概述](#overview) - [包边界](#package-boundary) - [核心能力](#core-capabilities) - [命令面](#command-surface) - [LLM 工具](#llm-tools) - [文档导航](#documentation-map) - [技术栈](#tech-stack) - [快速开始](#getting-started) - [配置](#configuration) - [审查工作流](#review-workflow) - [自定义指令](#custom-instructions) - [报告](#reports) - [CI/CD](#cicd) - [隐私与安全](#privacy-and-security) - [开发工作流](#development-workflow) - [测试与验证](#testing-and-verification) - [项目结构](#project-structure) - [发布说明](#publishing-notes) - [贡献指南](#contribution-guide) ## 概述 `pi-security-review` 帮助 Pi 将安全审查重点放在修改的代码上,而不是阅读整个代码库。它解析本地、暂存、分支或显式的 diff 范围;过滤掉生成的/供应商的/类似密钥的路径;构建有边界的 prompt;仅向活动的 Pi model 询问 HIGH/MEDIUM 结果;然后将规范化的 Markdown 和 JSON 报告存储在 `.pi/security-review/` 下。 本代码库负责: - Pi 扩展入口点和包清单。 - 代码库本地 config schema、默认值、验证和创建。 - Git repo 发现、工作树状态、GitHub remote 检测以及安全的 diff 范围解析。 - 包含明确漏洞利用路径和不回显密钥规则的安全 prompt 生成。 - 来自有限的代码库相对文件或内联文本的可选自定义扫描/过滤指令。 - Marker 解析器、规范化的结果模型、确定性的误报过滤器、Markdown 报告渲染以及有效的 SARIF 2.1.0 导出。 - 通过 Pi `message_end` hook 捕获最新报告以及报告面板重放。 - 带有明确批准关卡和安全 marker 更新的 GitHub PR 评论预览/发布集成。 - 无头 CI 上下文生成、外部最终报告摄取、失败关卡、复合 GitHub Action 以及 CI 文档。 - 用于状态、diff 分析、上下文构建、过滤、渲染和 GitHub 评论预览/发布的有限 LLM 辅助工具。 ## 包边界 该包负责安全审查上下文生成和报告处理。它不负责 model provider 凭据、漏洞修复、部署策略或通用的 SAST 替代。 | 领域 | 职责 | | ---------------- | ------------------------------------------------------------------------------ | | Pi extension | 命令、工具、prompt 排队、状态 UI、最新报告面板 | | 审查核心 | Diff 范围、上下文边界、prompt 合约、marker 解析器、报告渲染器 | | 过滤 | 确定性的置信度/严重性阈值和严格的误报排除 | | 集成 | 可选的 code-review-graph 上下文、GitHub PR 评论、CI 产物 | | 安全 | 无遥测、无源码编辑、默认无网络写入、密钥脱敏 | | 发布工作流 | 构建输出、包审计、npm pack dry-run、公开文档 | ## 核心能力 | 能力 | 状态 | | --------------------------- | ------------------------------------------------------------------------------- | | Repo 状态 | 通过 `/security-review-status` 实现 | | 配置创建 | 通过 `/security-review-config --create` 实现 | | Diff 范围审查 | 通过 `/security-review` 结合当前、分支和显式 refs 实现 | | Model 覆盖 | 当 Pi host 暴露 model registry 时,通过 `--model provider/model` 实现 | | 自定义扫描/过滤指令 | 通过安全的文件 flags 和内联文本 flags 实现 | | 报告捕获 | 通过在 assistant 响应结束时进行结构化 marker 解析实现 | | 最新报告面板 | 通过 `/security-review-panel` 实现 | | 确定性过滤器 | 针对置信度、严重性以及已知的低信号结果类别实现 | | SARIF 渲染 | 通过 `security_review_render_report` 结合 `format: "sarif"` 实现 | | GitHub PR 评论 | 默认 dry-run;发布需要明确批准 | | 内联 PR 评论 | 尽力而为,根据已更改的 PR 行进行验证;当映射失败时回退为摘要 | | CI 产物模式 | 已实现;默认不调用 model 且不对 GitHub 进行写入 | | 外部最终报告模式 | 已实现,带有针对 HIGH/MEDIUM 结果的失败关卡 | | 复合 GitHub Action | 通过根目录的 `action.yml` 实现 | ## 命令面 ``` /security-review-status /security-review-config [--create] /security-review [--base ] [--head ] [--from ] [--to ] [--model ] [--scan-instructions-file ] [--filter-instructions-file ] [--scan-instructions-text ] [--filter-instructions-text ] [focus paths...] /security-review-panel /security-review-comment [--dry-run] [--pr ] [--yes] [--update-existing] [--inline] /security-review-ci-help ``` ### 命令详情 **`/security-review-status`** — 显示 repo 根目录、config 状态、最新报告、活动 model、配置的 model profiles、GitHub remote、尽力而为的 `gh` 认证状态以及默认的网络写入姿态。在 Git repo 之外运行时不会崩溃。 **`/security-review-config`** — 显示 repo 本地的 config 状态。添加 `--create` 以在缺失时写入带有默认值的 `.pi/security-review.json`。 **`/security-review`** — 为当前或显式的 diff 范围构建有边界的上下文,并通过 Pi 排队发送安全 prompt。该 prompt 仅要求提供由所提供的更改引入或暴露的具体 HIGH/MEDIUM 漏洞。 示例: ``` /security-review /security-review --base origin/main --head HEAD /security-review --from v0.1.0 --to HEAD src/auth src/api /security-review --model openai/gpt-5.1-codex /security-review --scan-instructions-file .github/security-scan.txt ``` **`/security-review-panel`** — 在可用时在编辑器中打开 `.pi/security-review/latest-report.md`,或显示回退通知文本。格式错误的报告 JSON 警告将被展示,而不是导致崩溃。 **`/security-review-comment`** — 默认将最新报告预览为 GitHub PR 评论。发布需要 `--yes`。现有的 marker 评论可以通过 `--update-existing` 更新;可选的 `--inline` 评论仅针对经过验证的已更改 PR 行进行,并在映射失败时回退为摘要。 ``` /security-review-comment --dry-run --pr 123 /security-review-comment --pr 123 --yes --update-existing /security-review-comment --pr 123 --yes --inline ``` **`/security-review-ci-help`** — 打印简短的 CI 指南。 ## LLM 工具 ``` security_review_stats security_review_analyze_diff security_review_build_context security_review_model_profiles security_review_filter_findings security_review_render_report security_review_github_comment ``` 工具输出在到达 model 之前被限制在 Pi 风格的限额内:50 KB 或 2,000 行。 | 工具 | 目的 | | --------------------------------- | ------------------------------------------------------ | | `security_review_stats` | 显示 repo/config/latest-report/model/GitHub 状态 | | `security_review_analyze_diff` | 解析审查范围并返回有限的 diff 元数据 | | `security_review_build_context` | 构建与 provider 无关的安全审查上下文 payload | | `security_review_model_profiles` | 检查配置的 role/model 元数据 | | `security_review_filter_findings` | 规范化并确定性地过滤 model 发现 | | `security_review_render_report` | 渲染 Markdown、JSON 或有效的 SARIF 2.1.0 JSON | | `security_review_github_comment` | 预览或发布受控的 GitHub PR 评论 | 默认情况下,修改工具的行为是安全的。除非同时设置了 `post: true` 和 `approve: true`,否则 `security_review_github_comment` 仅进行预览。 ## 文档导航 请按此阅读顺序进行审查、CI 设置或发布交接: 1. `docs/PRIVACY_SECURITY.md` — 本地优先行为、model 边界、密钥处理、GitHub 写入以及 prompt injection 警告。 2. `docs/PROMPT_CONTRACT.md` — 审查范围、所需的发现格式、JSON marker、解析器兼容性和渲染合约。 3. `docs/CI_GITHUB_ACTIONS.md` — 仅产物的 CI、外部最终报告模式、复合 action 用法、PR 评论和 fork 安全性。 4. `docs/RELEASE.md` — 维护者关卡、包内容、受信任的发布、回滚路径和发布检查清单。 ## 技术栈 | 领域 | 选择 | | ------------------- | -------------------------------------------------------------------------- | | Runtime 目标 | 通过 TypeScript 加载器实现 Pi extension runtime | | 开发 runtime | Bun | | 语言 | TypeScript | | 格式化/linter | Biome | | Schema 验证 | 用于工具参数 schemas 的 TypeBox;用于 repo config 的本地 config 验证器 | | 测试运行器 | `bun test` | | GitHub 集成 | 运行时使用 `gh` CLI/GitHub token 进行批准的评论 | | 发布目标 | 带有 Pi manifest 和复合 GitHub Action 元数据的 npm 包 | ## 快速开始 安装已发布的包: ``` pi install npm:pi-security-review /reload /security-review-status ``` 运行首次本地审查: ``` /security-review-config --create /security-review /security-review-panel /security-review-comment --dry-run ``` 本地包冒烟测试: ``` bun install bun run build pi install . /reload /security-review-status /security-review-config --create /security-review ``` 在测试构建输出而未安装包时的直接扩展冒烟测试: ``` pi install ./dist/index.ts /reload ``` 由包创建或使用的 repo 本地文件: ``` .pi/security-review.json .pi/security-review/latest-report.md .pi/security-review/latest-report.json .pi/security-review/ci-context.json .pi/security-review/ci-report.md ``` ## 配置 默认 config 路径: ``` .pi/security-review.json ``` 使用 `/security-review-config --create` 创建它。 关键选项: | 选项 | 目的 | | -------------------------------------- | ------------------------------------------------------------------------ | | `enabled` | 为 repo 启用或禁用包 | | `include` / `exclude` | 控制符合条件的路径 | | `excludeDocumentation` | 默认排除文档以减少低信号发现 | | `excludeTestsByDefault` | 除非明确指定,否则默认排除测试 | | `maxDiffBytes` | 限制捕获的 diff 文本 | | `maxContextChars` | 限制 prompt/context 大小 | | `maxFiles` | 限制文件数量 | | `maxCommits` | 限制 commit 元数据 | | `confidenceThreshold` | 丢弃低于置信度阈值的发现,默认为 `0.8` | | `severityThreshold` | 仅保留 `medium`+ 或 `high` | | `enableHardExclusions` | 启用确定性的误报类别 | | `enableModelFiltering` | 为基于 model 的过滤器运行器保留;确定性过滤器仍会运行 | | `modelProfiles` | 默认/审计者/过滤器/报告者的 role 元数据 | | `agentPipeline` | 活动 role pipeline 元数据,默认为 `auditor` | | `customSecurityScanInstructions` | config 中可选的 repo 相对扫描指令文件路径 | | `falsePositiveFilteringInstructions` | config 中可选的 repo 相对过滤指令文件路径 | | `github.commentByDefault` | 安全默认值保持为 false | | `github.updateExistingComment` | 批准后更新 marker 评论 | | `github.commentMarker` | PR 评论 marker,默认为 `` | | `ci.failOnHigh` / `ci.failOnMedium` | CI 策略默认值;CLI flags 可控制最终报告 | | `optionalIntegrations.codeReviewGraph` | 可用时包含尽力而为的 CRG 上下文 | 最小示例: ``` { "enabled": true, "severityThreshold": "medium", "confidenceThreshold": 0.8, "github": { "commentByDefault": false, "updateExistingComment": true, "commentMarker": "" } } ``` ## 审查工作流 1. 解析 Git repo 和 config。 2. 从显式 refs/paths 或当前工作树解析 diff 范围。 3. 应用 include/exclude 和类似密钥的路径过滤器。 4. 在需要时构建带有截断警告的有边界上下文。 5. 添加可选的自定义扫描/过滤指令。 6. 可用时添加可选的 code-review-graph 上下文。 7. 通过 Pi 活动 model/provider 排队发送与 provider 无关的 prompt。 8. 在 `message_end` 时捕获 assistant 输出 marker。 9. 在交互式捕获期间规范化、脱敏并确定性地过滤发现。 10. 将最新的 Markdown 和 JSON 报告写入 `.pi/security-review/` 下。 11. 在明确批准后,可选择预览/发布 GitHub PR 评论。 ## 自定义指令 对于持久的组织策略,推荐使用文件模式: ``` /security-review --scan-instructions-file .github/security-scan.txt --filter-instructions-file .github/security-filter.txt ``` 内联模式适用于一次性的审查重点: ``` /security-review --scan-instructions-text "Check tenant boundary bypasses" ``` 指令文件安全防护: - 仅限 repo 相路径。 - 最大文件大小 64 KiB。 - 拒绝绝对路径和 `..` 目录遍历。 - 拒绝类似密钥的路径,包括 `.env`、token/credential/private-key 名称以及 key/cert 文件。 - Config 字段引用 repo 相对的指令文件。 - CLI/工具的 `*-instructions-text` 字段用于内联的一次性指令。 - 自定义扫描指令扩展了默认的安全类别。 - 自定义过滤指令调整误报标准,但不会禁用确定性的硬过滤器。 旧版别名 `--scan-instructions` 和 `--filter-instructions` 仍可作为带有警告的内联文本使用。 ## 报告 首选的 assistant 输出以一个 marker 块结尾: ``` { "findings": [], "excludedFindings": [], "analysisSummary": { "filesReviewed": 0, "highSeverity": 0, "mediumSeverity": 0, "lowSeverity": 0, "reviewCompleted": true, "diffTruncated": false, "contextTruncated": false } } ``` 解析器还尽力接受原始 JSON、围栏 JSON、带有空格的 marker 变体以及参考风格的 snake_case 字段,如 `exploit_scenario`、`analysis_summary` 和 `files_reviewed`。 存储的输出: ``` .pi/security-review/latest-report.md .pi/security-review/latest-report.json ``` 报告处理安全防护: - 格式错误/不完整的输出会记录可操作的警告,而不是崩溃。 - 常见的类似密钥的值会在本地写入或 GitHub 评论渲染之前被脱敏。 - 交互式 `message_end` 捕获和 `security_review_filter_findings` 在存储/渲染之前运行确定性过滤器。 - CI 外部最终报告模式会对受信任的 model 输出进行规范化和脱敏;如果 CI runner 需要确定性的重新过滤,请单独运行 `security_review_filter_findings`。 - 过滤元数据记录了运行确定性过滤器时保留/排除的计数和阶段。 - 除非由 runner 实现,否则 model 端的过滤角色目前会被推迟。 ## CI/CD 仅产物模式构建有边界的上下文和 prompt。它不调用 model,也不是最终的安全结果: ``` bun run security-review:ci -- --base origin/main --head HEAD ``` 外部最终报告模式读取 model 生成的 marker 输出并应用失败关卡: ``` bun run security-review:ci -- \ --base origin/main \ --head HEAD \ --final-report artifacts/final-security-report.md \ --fail-on-high \ --fail-on-medium ``` PR 评论模式需要最终报告和明确的批准: ``` bun run security-review:ci -- \ --base origin/main \ --head HEAD \ --final-report artifacts/final-security-report.md \ --pr 123 \ --comment \ --yes ``` 复合 action 默认为仅产物模式,并且没有供应商 API key 输入: ``` - uses: owner/pi-security-review@v0.1.0 with: base: origin/${{ github.base_ref }} head: HEAD ``` 有关完整的工作流模板、权限、最终报告模式、评论和 fork 安全性,请参阅 `docs/CI_GITHUB_ACTIONS.md`。 ## 隐私与安全 `pi-security-review` 是本地优先的。 - 无遥测。 - 无源码编辑或 autofix 行为。 - 默认无 GitHub 评论或网络写入。 - 本包不存储 provider API key。 - Runtime 辅助工具使用固定的 argv 数组,而不是 shell 插值。 - 类似密钥的路径和值在存储或评论之前会被过滤/脱敏。 - 报告/config 存储在 `.pi/` 下,并从包输出中排除。 - Model prompt 仅在用户运行审查后通过 Pi 的活动 provider/model 生命周期发送。 - AI 审查并未针对来自修改的代码/文档/评论/自定义指令的 prompt injection 进行强化。 对于不受信任的 fork,请使用仅产物模式。在对外部贡献进行基于 model 的审查或具有写入权限的工作流之前,需要获得维护者的批准。请参阅 `docs/PRIVACY_SECURITY.md`。 ## 开发工作流 安装依赖项: ``` bun install ``` 运行本地检查: ``` bun run check ``` 构建包输出: ``` bun run build ``` 运行 npm 包 dry-run: ``` bun run pack:dry-run ``` 在发布前运行包审计: ``` bun run prepublish:audit ``` ## 测试与验证 交接前的快速验证: ``` bun run typecheck bun run lint bun test ./test bun run build bun run smoke:security-review bun run pack:dry-run ``` 发布验证还应包括: ``` bun run security-review:ci -- --base HEAD --head HEAD bun run prepublish:audit pi install . /reload /security-review-status /security-review-config --create /security-review /security-review-panel /security-review-comment --dry-run ``` ## 项目结构 ``` . |-- action.yml |-- docs/ | |-- CI_GITHUB_ACTIONS.md | |-- PRIVACY_SECURITY.md | |-- PROMPT_CONTRACT.md | `-- RELEASE.md |-- scripts/ | |-- audit-npm-package.ts | |-- build-package.ts | |-- security-review-ci.ts | `-- smoke-security-review.ts |-- src/ | |-- config/ | |-- git/ | |-- github/ | |-- security/ | |-- store/ | |-- tools/ | |-- util/ | `-- extension.ts |-- test/ |-- index.ts |-- package.json `-- README.md ``` ## 发布说明 发布路径: 1. 完成 `docs/RELEASE.md` 中的维护者发布检查清单。 2. 运行 `bun run check`。 3. 运行 `bun run smoke:security-review`。 4. 运行 `bun run security-review:ci -- --base HEAD --head HEAD`。 5. 运行 `bun run prepublish:audit`。 6. 运行 `bun run pack:dry-run`。 7. 仅在维护者批准后创建并推送发布 tag。 8. 配置后,让 GitHub Actions 通过 npm trusted publishing/OIDC 进行发布。 Pi manifest 在 `package.json` 中声明: ``` { "pi": { "extensions": ["./dist/index.ts"] } } ``` npm 包白名单包括 runtime `dist`、`scripts/security-review-ci.ts`、`action.yml`、精选的公开文档、README、license 和包元数据。 ## 贡献指南 在更改行为之前: - 保持更改最小,并与单一的安全审查能力相关联。 - 为行为更改添加或更新测试。 - 保持文档与实际的命令/工具 flags 和默认安全行为一致。 - 保留无遥测、默认无网络写入和无源码编辑的保证。 - 不要削弱密钥/路径过滤或 prompt injection 警告。 - 在交接之前运行相关的验证,并记录跳过的检查。
标签:DevSecOps, Git工具, 上游代理, 云安全监控, 人工智能, 暗色界面, 用户模式Hook绕过, 自动化攻击, 静态分析