sairintechnologycom/pkgsafe
GitHub: sairintechnologycom/pkgsafe
一款面向 AI 编程代理与开发者的本地优先供应链防火墙,在安装前校验软件包的安全风险并输出拦截决策。
Stars: 0 | Forks: 0
# PkgSafe
**面向 AI 编程代理——及其开发者——的供应链防火墙。**
编程代理现在会自行运行 `npm install` 和 `pip install`,并且
“slopsquatting”(攻击者提前注册了 LLM 幻觉产生的包名)是一种真实的攻击手段。PkgSafe 会在安装包*之前*对其进行检查——对照 OSV 安全通告、生命周期脚本分析、域名抢注启发式检测以及你的策略——并返回明确的 **allow / warn / block** 决定。它在本地运行并使用 **MCP** 协议,因此你的代理必须先询问 PkgSafe。
## 快速开始
安装——单一静态二进制文件,无 CGo,无运行时依赖:
```
curl -fsSL https://raw.githubusercontent.com/sairintechnologycom/pkgsafe/main/scripts/install-remote.sh | bash
```
安装程序会下载适合你 OS/架构 的已签名发行版,并验证其 SHA-256 校验和。想手动安装或进行完整的签名验证?请参阅下方的[安装](#install)。
在安装前扫描包:
```
pkgsafe scan-npm-package axios
```
捕获运行可疑安装钩子的包:
```
$ pkgsafe scan-local-npm ./testdata/npm/postinstall-curl --mode block
Decision: BLOCK
Package: npm/postinstall-curl-example@1.0.0
Risk Score: 65/100
Reasons:
- [medium +20] lifecycle_script_present: Package defines a postinstall script
- [high +30] network_command_in_lifecycle: Lifecycle script uses curl
Recommended Action: Do not install this package.
```
保护 AI 代理——在 Claude Code 或 Cursor 中将 PkgSafe 添加为 MCP 服务器:
```
{
"mcpServers": {
"pkgsafe": { "command": "pkgsafe", "args": ["mcp", "serve"] }
}
}
```
代理现在必须在安装任何内容之前调用 `validate_package_install`:
`BLOCK` 表示禁止安装,`WARN` 表示先询问人类。
## 安装
PkgSafe 是一个单一的静态二进制文件(无 CGo)。npm 和 PyPI 包及 lockfile 扫描属于 GA 生产范围;Go 和 Cargo 仍处于预览覆盖阶段,尚未达到 GA 同等水平。
安装已发布的发行版:
```
VERSION=1.6.0
OS=linux
ARCH=amd64
curl -LO "https://github.com/sairintechnologycom/pkgsafe/releases/download/v${VERSION}/pkgsafe_${VERSION}_${OS}_${ARCH}.tar.gz"
tar -xzf "pkgsafe_${VERSION}_${OS}_${ARCH}.tar.gz"
sudo mv pkgsafe /usr/local/bin/
pkgsafe version
pkgsafe doctor
```
有关 macOS arm64、macOS amd64、Linux amd64 和 Windows zip 的示例,请参阅 [docs/install.md](docs/install.md)。
发行版压缩包会附带 `checksums.txt`、cosign 签名、GitHub Artifact Attestations 以及每个压缩包的 SBOM。在信任二进制文件之前,请先进行验证:
```
curl -LO "https://github.com/sairintechnologycom/pkgsafe/releases/download/v${VERSION}/checksums.txt"
curl -LO "https://github.com/sairintechnologycom/pkgsafe/releases/download/v${VERSION}/checksums.txt.sig"
curl -LO "https://github.com/sairintechnologycom/pkgsafe/releases/download/v${VERSION}/checksums.txt.pem"
sha256sum -c checksums.txt
cosign verify-blob \
--certificate checksums.txt.pem --signature checksums.txt.sig \
--certificate-identity-regexp 'https://github.com/.*/pkgsafe/.*' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
checksums.txt
gh attestation verify "pkgsafe_${VERSION}_${OS}_${ARCH}.tar.gz" --repo sairintechnologycom/pkgsafe
```
完整的发行版检查记录在
[docs/release-verification.md](docs/release-verification.md) 中。
**从源码构建**(Go 1.25+):
```
go install github.com/sairintechnologycom/pkgsafe/cmd/pkgsafe@latest
# 或者,从 clone 中运行,并在其中内置 version metadata:
make build && ./dist/pkgsafe version
```
## 命令
```
pkgsafe scan-local-npm ./testdata/npm/safe-package
pkgsafe scan-npm-package axios
pkgsafe scan-npm-package lodash --json
pkgsafe scan-npm-package some-package --version 1.2.3
pkgsafe scan-npm-package axios --policy ./default-policy.yaml
pkgsafe scan-npm-package axios --mode audit
pkgsafe scan-npm-package axios --mode warn
pkgsafe scan-npm-package axios --mode block
pkgsafe scan-lockfile ./package-lock.json
pkgsafe explain axios
pkgsafe npm-install axios --mode warn
pkgsafe mcp serve
```
`scan-npm-package` 会从 npm registry 获取元数据,在未提供版本时解析 `latest`,将选定的 tarball 下载到本地缓存中,在存在时验证 npm 的完整性/shasum 元数据,安全地提取 `package/package.json`,并复用 npm 静态分析器。
## 决定
PkgSafe 会返回以下结果之一:
- `allow`:低风险
- `warn`:有可疑信号,建议开发者确认
- `block`:严重行为,例如访问凭证路径、已知恶意软件或有强烈的数据外泄迹象
## 策略与模式
省略 `--policy` 时,PkgSafe 会使用内置的默认策略。你可以通过 YAML 策略调整阈值、受信任和被阻止的 npm 包、受保护的凭证路径以及每条规则的评分:
```
pkgsafe scan-npm-package axios --policy ./default-policy.yaml
pkgsafe scan-local-npm ./testdata/npm/postinstall-curl --policy ./default-policy.yaml --mode audit
```
模式用于控制执行措辞,但不会隐藏底层的风险判定:
- `audit`:报告决定,但从不强制阻止
- `warn`:默认模式;对可疑包发出警告,并阻止严重发现
- `block`:严格模式;达到或超过阻止阈值的包不应被安装
人类可读的输出示例:
```
Decision: WARN
Mode: WARN
Enforcement: User review recommended
Package: npm/example-package@1.2.3
Risk Score: 62/100
Reasons:
- [medium +20] lifecycle_script_present: Package defines a postinstall script
- [high +30] network_command_in_lifecycle: Lifecycle script uses curl
Recommended Action:
Review package before installing.
```
## 构建
```
make test
make build
make package
```
构建产物将写入 `dist/`。
## MCP 工具
启动兼容 MCP 的 stdio 服务器:
```
pkgsafe mcp serve
```
PkgSafe 使用标准 MCP:`initialize`,然后通过 `tools/list` 发现工具,接着通过 `tools/call` 调用其中一个。包安全工具通过 `tools/call` 暴露(而不是作为顶级的 JSON-RPC 方法)。
示例:询问 PkgSafe AI 代理是否应该安装某个包:
```
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"validate_package_install","arguments":{"ecosystem":"npm","name":"axios","requested_by":"ai_agent"}}}
```
可用的 MCP 工具包括 `validate_package_install`、
`validate_install_command`(验证完整的 `npm install …` / `pip install …` 字符串)、`suggest_safe_alternative`(针对有风险、未知或幻觉产生的包名)、`explain_package_risk`、`score_lockfile` 以及治理/审计报告。运行 `tools/list` 可获取完整的、自描述的 schema。
CLI JSON 输出使用稳定的扫描契约:
```
{
"ecosystem": "npm",
"package": "example-package",
"version": "1.2.3",
"mode": "warn",
"decision": "warn",
"risk_score": 62,
"thresholds": {
"allow_max_score": 29,
"warn_max_score": 69,
"block_min_score": 70
},
"reasons": [
{
"rule_id": "lifecycle_script_present",
"severity": "medium",
"score": 20,
"message": "Package defines a postinstall script"
}
],
"recommended_action": "Review package before installing."
}
```
## 能力矩阵
PkgSafe GA 版本涵盖了 npm 和 PyPI。不同生态系统和覆盖面的成熟度有所差异:
| 生态系统 | 元数据 + OSV | Lockfile 解析 | 产物/内容分析 |
|-----------|:--:|:--:|:--:|
| **npm** | 生产就绪的 GA v1 范围 | ✅ `package-lock.json` | ✅ tarball + 生命周期启发式检测 |
| **PyPI** | GA(pip 平级的解析、大型产物上限、真实仓库验证) | ✅ `requirements.txt`(包含 `--hash`)、`pyproject.toml`、`poetry.lock`、`uv.lock`、`Pipfile`、`Pipfile.lock` 并带有清单去重(conda 为占位实现) | ⚠️ wheel + sdist 静态分析(RECORD、字节码、构建后端);无行为分析 |
| **Go** | 预览版 | ✅ `go.mod`/`go.sum` | ❌ 仅元数据 |
| **Cargo** | 预览版 | ✅ `Cargo.lock` | ❌ 仅元数据 |
覆盖面:CLI、REST API、MCP stdio 服务器、GitHub Action、策略引擎、离线情报包以及本地证据包。
## 运维说明
**本地优先,但参考数据需要网络。** OSV 安全通告数据在线获取并缓存在本地 SQLite DB 中。`pkgsafe update-db --ecosystem all`
会执行真正的 OSV 批量同步,以便你随后可以进行离线扫描;在某个包被同步/缓存之前,对其进行 `--offline` 扫描将会失败或发出警告,而不是静默放行。OSV 查询**采用失败封闭原则** —— 网络/速率限制错误会显式暴露 `vulnerability_data_unavailable` 状态,而不是将包评为无风险。
对于物理隔离环境,可以通过 `pkgsafe db export-bundle`、`pkgsafe db verify-bundle` 和
`pkgsafe db import-bundle` 导出、验证并导入已签名的安全通告包;请参阅
[docs/offline-intelligence-bundle.md](docs/offline-intelligence-bundle.md)。
**行为分析默认禁用,必须显式请求才能使用。**
仅在可丢弃的环境中使用 `--behavior heuristic`:它会在宿主机上运行生命周期脚本,且**没有 OS 隔离**;检测基于模式/金丝雀机制,并且不强制执行 `network_mode`。`--behavior isolated` 通过 bubblewrap 在 Linux user/mount/pid/ipc/uts/network namespace 中运行生命周期脚本,且**默认禁用网络(强制执行)**;它需要 `bwrap` 和非特权用户 namespace,否则会报告不可用,并且绝对不会回退到宿主机执行。隔离减少了宿主机的暴露风险,但仍会共享宿主机内核。请勿将启发式模式称为沙箱或容器化。请参阅
[docs/behavior-analysis.md](docs/behavior-analysis.md)。
**真实的仓库验证是 GA 发布的关卡。** 使用
`pkgsafe test benchmark --repo-list benchmarks/real-repos.json --json` 以及
`pkgsafe report beta-evidence --repo-list benchmarks/real-repos.json` 或
`pkgsafe report ga-evidence --repo-list benchmarks/real-repos.json --output pkgsafe-ga-evidence.zip`
来构建证据。当真实仓库验证、发行版签名、出处、SBOM 或校验和验证低于阈值时,生产就绪报告会明确指出 GA 阻碍项。
**REST API 默认仅限回环接口且无需身份验证。** 它绑定到 localhost,旨在用于本地工具。目前没有 TLS、请求速率限制或正文大小上限——在服务加固里程碑达成之前,**请勿在非回环接口上暴露它**。即使在 localhost 上,也要设置 bearer token(`--token`)以实现深度防御。
**依赖项。** 纯 Go 编写,无 CGo 构建。使用少量经过审查的外部模块(例如 `modernc.org/sqlite`、`gopkg.in/yaml.v3`);详见 `go.mod`。
标签:AI代码助手, DevSecOps, EVTX分析, Go, MCP, Ruby工具, 上游代理, 依赖安全, 域名收集, 搜索语句(dork), 日志审计