barestripehq/primer

GitHub: barestripehq/primer

Primer 是一款包管理器预安装安全拦截器,在依赖进入系统前基于 OSV 数据库进行漏洞扫描,帮助团队在本地和 CI 中阻断已知高危包。

Stars: 5 | Forks: 0

# primer 为包管理器提供预安装安全拦截器。在软件包进入你的系统之前,针对 [OSV 漏洞数据库](https://osv.dev/) 对其进行扫描——支持可选的本地 AI 摘要、git hook 集成以及 CI 模式。 ## 工作原理 primer 会在 `$PATH` 中你的包管理器之前放置轻量级的 shim。当你运行 `pip install requests` 时,该 shim 会拦截命令,查询 OSV,然后要么静默放行(结果安全),要么在执行前提示你。 ``` pip install pillow → primer shim intercepts → queries OSV → found 3 vulnerabilities (1 CRITICAL, 2 HIGH) pillow 9.0.0 — GHSA-56pw-mpj4-fxjw [CRITICAL] Summary: Heap buffer overflow in TIFF image parser Fixed in: 9.0.1 → [prompt] View full details? (y/N) → [prompt] Continue install anyway? (y/N) → exits 1 on "N" ``` ✓ requests: 发现 0 个漏洞 — 静默放行(在首次缓存查询之后)。 ## 支持的生态系统 | 生态系统 | 拦截的命令 | 清单 / Lockfile | |-----------|---------------------|---------------------| | Python | `pip`, `uv`, `poetry` | `requirements.txt`, `pyproject.toml`, `uv.lock`, `poetry.lock` | | Node.js | `npm`, `yarn`, `pnpm` | `package.json`, `package-lock.json`, `yarn.lock`, `pnpm-lock.yaml` | | Go | `go get`, `go mod` | `go.mod`, `go.sum` | | Rust | `cargo add`, `cargo build`, `cargo fetch`, `cargo check` | `Cargo.toml`, `Cargo.lock` | ## 安装 **macOS / Linux** ``` curl --proto '=https' --tlsv1.2 -fsSL https://github.com/barestripehq/primer/releases/latest/download/primer-installer.sh | sh primer init ``` `primer init` 会在 `~/.primer/bin` 中创建 shim,并将其添加到你的 shell 配置文件(zsh 对应 `.zshenv`,bash 对应 `.bashrc`,fish 对应 fish 函数)的顶部。重启你的 shell 或 `source` 该配置文件。 **Windows** 从 [最新发布版本](https://github.com/barestripehq/primer/releases/latest) 下载 MSI 安装程序,然后在一个新终端中运行: ``` primer init ``` `primer init` 会在 `%USERPROFILE%\.primer\bin` 中创建 `.cmd` 包装器,通过 `SETX` 更新用户 PATH,并注入到你的 PowerShell 7 配置文件中。打开一个新终端以使更改生效。 **从源码构建:** ``` cargo install --git https://github.com/barestripehq/primer primer init ``` ## 命令 ### 扫描 ``` # 手动扫描任意 package primer scan requests --ecosystem pypi primer scan express --ecosystem npm primer scan github.com/gin-gonic/gin --ecosystem go primer scan serde --ecosystem cargo # 固定 version primer scan pillow --ecosystem pypi --version 9.0.0 # 跳过提示(无论如何都继续) primer scan pillow --ecosystem pypi --force # 显示 cache 命中/未命中 primer scan requests --ecosystem pypi --verbose # 包含 AI 生成的摘要(需要 primer model add) primer scan pillow --ecosystem pypi --ai # 扫描 manifest 文件中声明的所有 package(不安装) primer scan --file requirements.txt primer scan --file package.json primer scan --file go.mod primer scan --file Cargo.toml # 直接扫描 lockfile — 解析每个 transitive dep 的确切固定 version primer scan --file package-lock.json primer scan --file yarn.lock primer scan --file Cargo.lock # 跳过 transitive dependencies(仅限直接 package) primer scan --file package.json --direct-only # 输出 SARIF 2.1.0 用于 GitHub Security 标签页上传 primer scan --file requirements.txt --format sarif primer scan --file package-lock.json --format sarif --output results.sarif ``` 当 OSV 提供修补版本时,每条发现结果都会显示该版本: ``` pillow 9.0.0 — GHSA-56pw-mpj4-fxjw [CRITICAL] Summary: Heap buffer overflow in TIFF image parser Fixed in: 9.0.1 ``` ### 传递依赖扫描 默认情况下,primer 会扫描整个依赖树——不仅是你指定的包,还包括它拉取的所有内容。 **显式安装**(`npm install express`、`cargo add serde`):primer 会首先扫描指定的包(安装前),然后在 PM 运行后对 lockfile 进行 diff 操作,并扫描任何新添加的传递依赖包。安装后的发现结果包含移除提示,因为该包已经在磁盘上了。 **纯还原**(`npm install`、`go mod download`):当启用了 `intercept-restore` 且清单旁边存在 lockfile 时,primer 会在 PM 运行之前加载它,以解析直接包和传递包的确切版本。标题中会显示划分情况: ``` primer: scanning package.json — 3 direct + 47 transitive packages ``` **选择退出** —— 当你需要低噪音的结果时,跳过传递扫描: ``` # 按命令 primer scan --file package.json --direct-only # 全局(写入 ~/.primer/config.toml) primer config set direct-only true ``` 传递扫描始终以状态行结束: ``` primer: scanning 4 new transitive packages … ✓ transitive scan complete — found 0 vulnerabilities. ``` ### 审计现有漏洞 shim 会拦截新的安装。要揭示项目中已有的漏洞,请直接扫描清单或 lockfile: ``` primer scan --file package-lock.json # full resolved tree (recommended) primer scan --file package.json # declared dependencies only primer scan --file requirements.txt primer scan --file Cargo.toml ``` 对于每个易受攻击的包,primer 会显示 CVE 详细信息和一条可直接运行的修复命令: ``` ⚠ lodash 4.17.15 (npm) — 6 vulnerabilities [HIGH] GHSA-35jh-r3h4-6jhm — Command Injection Fixed in: 4.17.21 Fix: npm install lodash@4.17.21 … ``` Primer 会打印修复命令,但不会修改你的清单——由你来运行它,而 shim 会在新版本进入时进行拦截控制。 ### 目录监视器 每当清单文件发生更改时自动扫描——对于长时间运行的开发会话非常有用: ``` primer watch # watch current directory primer watch --directory /project # watch a specific path primer watch --scan # also scan immediately on startup ``` 监视:`requirements.txt`、`pyproject.toml`、`package.json`、`go.mod`、`Cargo.toml`。防抖延迟为 500 毫秒。使用 `Ctrl+C` 退出。 ### 策略文件 `.primer/policy.toml` 会提交到仓库中,并在每台开发机器和 CI 中自动执行——无需任何标志。它与 `~/.primer/config.toml`(机器范围设置)是分开的。 ``` # .primer/policy.toml [policy] threshold = "high" # optional global override for this repo [[deny]] package = "event-stream" # hard block by name regardless of CVE status reason = "supply chain compromise" [[ignore]] cve = "CVE-2023-1234" package = "pillow" # optional: scope to one package expires = "2026-12-31" # YYYY-MM-DD; finding re-activates after this date reason = "Mitigated by WAF" [[override]] package = "requests" threshold = "critical" # per-package threshold ``` 评估顺序:`[[deny]]` → `[[ignore]]`(检查过期时间)→ `[[override]]` → `[policy].threshold`。 ``` primer policy list # show all rules and expiry status primer policy check # validate syntax without scanning ``` ### 严重性阈值 控制哪个严重级别触发提示或 CI 拦截: ``` primer config set prompt-threshold medium # block MEDIUM, HIGH, CRITICAL primer config set prompt-threshold critical # block CRITICAL only primer config set prompt-threshold high # default ``` ### SBOM 生成 为任何清单或 lockfile 生成软件物料清单 (SBOM): ``` primer sbom --file requirements.txt # CycloneDX JSON to stdout primer sbom --file package-lock.json # from lockfile (exact versions) primer sbom --file Cargo.toml --output sbom.json # write to file primer sbom --file package.json --format spdx # SPDX 2.3 JSON primer sbom --file go.mod --no-scan # inventory only, no OSV queries ``` ### AI 智能体集成 (MCP) `primer mcp` 通过 stdio 启动一个 [Model Context Protocol](https://modelcontextprotocol.io) 服务器,暴露出一个 `scan_package` 工具,任何支持 MCP 的智能体(Claude Code、Cursor、Cline 等)都可以在决定安装包之前调用它。 在你的项目根目录添加一个 `.mcp.json`(对于 Claude Code 则为 `~/.claude/mcp.json`): ``` { "mcpServers": { "primer": { "command": "primer", "args": ["mcp"] } } } ``` 然后该智能体可以调用: ``` scan_package("pillow", "PyPI", "9.0.0") → ⚠ pillow 9.0.0 (PyPI) — found 2 vulnerabilities: [HIGH] GHSA-xxxx-yyyy-zzzz — Buffer overflow in TIFF decoder (Fixed in: 9.1.0) [MEDIUM] GHSA-aaaa-bbbb-cccc — … ``` 该工具会返回结构化的 JSON(`vulnerabilities[]`、`summary.blocking`),以便智能体决定是否继续。OSV 缓存同样适用——重复查找是即时的。 ### 安装与卸载 ``` primer init # create shims, update PATH primer uninit # remove shims, strip PATH entry primer uninit --purge # also delete cache and model files primer doctor # check PATH order, shim health, cache state, model state primer migrate # move .primer-ignore / .primer-policy.toml into .primer/ ``` ### 白名单 将包添加到 `.primer/ignore`(或针对旧仓库的 `.primer-ignore`)以跳过扫描,而无需使用 `--force`: ``` primer allow add pillow primer allow add pillow --ecosystem pypi # scope to one ecosystem ``` ### 缓存 ``` primer cache clear # remove all cached OSV results ``` 结果会缓存在 `~/.primer/cache/` 中,TTL 为 24 小时。在网络失败时,将使用最近一次缓存的结果(错误时回退旧数据机制)。 ### AI 模型 ``` # 下载默认 model(约 80 MB,无需账号) primer model add # 导入本地 GGUF 文件 primer model add --from /path/to/model.gguf --tokenizer /path/to/tokenizer.json # 从 HuggingFace Hub 下载特定 model primer model add --repo --file # 列出已注册的 model(* = 激活) primer model list # 设置激活的推理目标 primer model set ~/.primer/models/smollm2.gguf # local candle inference primer model set ollama:llama3.2 # route to local Ollama instance # 移除 model primer model remove # interactive select primer model remove smollm2.gguf ollama:llama3.2 # remove by name (no prompt) primer model remove --all # remove all, clear config ``` 一旦配置了模型,在任意 `scan` 命令中传入 `--ai`,即可在决策提示之前获取一份通俗易懂的英文 CVE 摘要。 设置 `PRIMER_AI=0` 可完全禁用 AI(在 CI 流水线中非常有用)。 ### Git hook 阻止那些向清单中添加易受攻击包的提交: ``` # 在当前 repo 中安装 pre-commit hook primer hook install # 手动运行检查而不提交 primer hook check ``` 监视的清单:`requirements.txt`、`pyproject.toml`、`package.json`、`go.mod`、`Cargo.toml`。 ### 拦截纯还原命令 默认情况下,纯还原命令(不带包参数的 `npm install`、`go mod download` 等)会直接放行。启用拦截以在安装依赖项之前扫描清单: ``` primer config set intercept-restore true ``` 启用后,primer 会在放行之前,针对每个 PM 的“安装全部”形式扫描相关清单。如果存在 lockfile,primer 会加载它以包含确切锁定版本的传递包: | 命令 | 扫描的清单 | Lockfile(如存在) | |---------|-----------------|----------------------| | `npm install` / `pnpm install` / `yarn` | `package.json` | `package-lock.json`, `yarn.lock`, 或 `pnpm-lock.yaml` | | `pip install`(无包参数) / `uv sync` | `requirements.txt` → `pyproject.toml` | `uv.lock`, `poetry.lock` | | `poetry install` | `pyproject.toml` | `poetry.lock`, `uv.lock` | | `go mod download` | `go.mod` | `go.sum` | | `cargo build` / `cargo fetch` / `cargo check` | `Cargo.toml` | `Cargo.lock` | 默认禁用 —— 大型项目可能会有很多依赖项。缓存使得重复扫描瞬间完成。使用 `--direct-only`(或 `primer config set direct-only true`)以跳过传递包。 ## CI / 非交互模式 当设置了 `CI=true`(在 GitHub Actions、CircleCI 等平台上的标准做法)或 stdin 不是 TTY 时,primer 会自动切换到非交互模式: - 无提示 —— 将合并后的发现结果表打印到 stderr - 遇到严重和高危发现结果时拦截(退出代码 `1`) - 将所有发现结果写入工作目录下的 `primer-report.json` 中 使用 `PRIMER_CI_MODE=allow-all` 覆盖该设置以禁用拦截(仅用于审计的流水线)。 ### GitHub Actions 使用 `barestripehq/primer-action@v1` —— 它会安装 primer,扫描清单,将 SARIF 上传到 GitHub Security 选项卡,并仅需一步即可发布 PR 评论: ``` permissions: security-events: write # SARIF upload pull-requests: write # PR comments actions: read contents: read steps: - uses: actions/checkout@v6 - uses: barestripehq/primer-action@v1 with: file: package-lock.json ``` 有关所有输入和示例,请参阅 [集成文档](https://primer.barestripe.com/integrations/)。 ### 其他 CI 系统 (CircleCI, GitLab CI, Jenkins) 通过安装脚本安装 primer,并调用 `--format sarif` 来输出 SARIF 2.1.0: ``` - name: Install primer run: curl --proto '=https' --tlsv1.2 -fsSL https://github.com/barestripehq/primer/releases/latest/download/primer-installer.sh | sh - name: Scan dependencies run: primer scan --file package-lock.json --format sarif --output results.sarif ``` ## 诊断 ``` primer doctor ``` 报告内容: - `~/.primer/bin` 是否在 `$PATH` 中正确地排列在版本管理器(`nvm`、`pyenv`、`asdf`、`volta`)之前 - 每个 shim 及其真实二进制文件的解析路径 - 缓存条目数量和总大小 - `intercept-restore` 配置状态及启用提示 - 激活的 AI 模型路径及文件大小 ## 卸载 ``` primer uninit --purge ``` 移除 shim,从你的 shell 配置中剔除 `$PATH` 条目,并删除 `~/.primer/`(缓存、模型、配置)。 ## 许可证 MIT
标签:DevSecOps, LLM防护, 上游代理, 依赖扫描, 包管理器, 可视化界面, 实时告警, 开发安全, 模型提供商, 统一API, 通知系统