piiiico/proof-of-commitment

GitHub: piiiico/proof-of-commitment

一个面向 npm、PyPI、Cargo、Go 模块和 GitHub 仓库的供应链行为风险评估工具,通过发布者深度、维护一致性等行为信号在攻击发生前标记高危依赖。

Stars: 2 | Forks: 0

# Proof of Commitment [![Commitment 得分](https://poc-backend.amdal-dev.workers.dev/badge/npm/proof-of-commitment)](https://getcommit.dev/audit?packages=proof-of-commitment) 一个 MCP 服务器和 Web 工具,用于对 npm 包、PyPI 包、Rust crate、Go 模块和 GitHub 仓库进行**行为承诺度**评分——这些信号比 star、README 或下载数更难造假。 ## 供应链问题 在每周下载量超过 1000 万的 91 个 npm 包中,有 26 个包只有**单一 npm 发布者**。它们合计占据了每周超过 30 亿次的下载量。`npm audit` 无法揭示这一点。star 数也不能。 一个典型的 Node.js 项目中,目前有四个包处于 CRITICAL(危险)状态: - **chalk** — 每周 4.13 亿次下载,**1 名 npm 发布者** - **zod** — 每周 1.63 亿次下载,**1 名 npm 发布者**(GitHub 上有 30+ 名贡献者) - **lodash** — 每周 1.45 亿次下载,**1 名 npm 发布者** - **axios** — 每周 9900 万次下载,**1 名 npm 发布者**(2026 年 3 月 30 日曾遭受攻击) 它们甚至不会出现在你的 `package.json` 中——但它们几乎存在于每个项目中: - **minimatch** — 每周 5.62 亿次下载,**1 名 npm 发布者** - **glob** — 每周 3.33 亿次下载,**1 名 npm 发布者** - **cross-spawn** — 每周 1.9 亿次下载,**1 名 npm 发布者** 行为信号可以揭示这一点。star 和 README 则不能。 ## 立即体验 **终端(零安装):** ``` npx proof-of-commitment axios zod chalk # 扫描你自己的项目: npx proof-of-commitment --file package.json # 通过 lock file 扫描所有 transitive dependencies(找出隐藏的 CRITICAL packages): npx proof-of-commitment --file package-lock.json # npm npx proof-of-commitment --file yarn.lock # yarn npx proof-of-commitment --file pnpm-lock.yaml # pnpm # pnpm monorepo — 扫描所有 workspace packages,进行去重: npx proof-of-commitment --file pnpm-workspace.yaml # pnpm workspaces # 用于 CI/CD pipelines 的 JSON 输出(如果发现 CRITICAL 则以退出码 1 退出): npx proof-of-commitment --file package-lock.json --json | jq '.criticalCount' # 也支持 PyPI: npx proof-of-commitment --pypi litellm langchain requests # 通过 CLI 使用 Cargo (Rust): npx proof-of-commitment --cargo serde tokio reqwest # 通过 CLI 使用 Go modules(需要完整的 module 路径): npx proof-of-commitment --golang github.com/gin-gonic/gin golang.org/x/net # 或直接扫描 go.mod / go.sum 文件: npx proof-of-commitment --file go.mod npx proof-of-commitment --file go.sum # full transitive set ``` **Web 演示(无需安装):** [getcommit.dev/audit](https://getcommit.dev/audit) — 粘贴你的包,几秒钟内查看风险评分。 **MCP 服务器(零安装):** ``` { "mcpServers": { "proof-of-commitment": { "type": "streamable-http", "url": "https://poc-backend.amdal-dev.workers.dev/mcp" } } } ``` 添加到 Claude Desktop、Cursor、Windsurf 或任何兼容 MCP 的 AI 工具中。然后提问: ## GitHub Action 只需 30 秒即可将供应链审计添加到任何 CI 流水线中——自动从 `package.json` 或 `requirements.txt` 检测包,**将结果作为 PR 评论发布**,写入 GitHub Step Summary,并在发现 CRITICAL 包时选择性地让流水线失败。 使用位于 [piiiico/commit-action](https://github.com/piiiico/commit-action) 的专用 action: ``` # .github/workflows/supply-chain.yml name: Supply Chain Audit on: pull_request: paths: ['package.json', 'package-lock.json', 'bun.lock'] jobs: audit: runs-on: ubuntu-latest permissions: pull-requests: write steps: - uses: actions/checkout@v4 - uses: piiiico/commit-action@v1 with: fail-on-critical: true # blocks merges on CRITICAL packages comment-on-pr: true # posts results as a PR comment ``` 当设置 `comment-on-pr: true`(默认值)时,该 action 会自动将审计表作为评论发布在 Pull Request 上——并在重新运行时**更新同一条评论**,从而避免产生评论垃圾信息。审查者无需离开 PR 即可查看风险表。 **输入参数:** | Input | Default | Description | |-------|---------|-------------| | `packages` | _(自动)_ | 逗号分隔的包名(如果未设置,将从 `package.json`/`requirements.txt` 中自动检测) | | `packages-file` | _(自动)_ | `package.json` 或 `requirements.txt` 的路径(默认:在工作区根目录中自动检测) | | `fail-on-critical` | `true` | 如果发现 CRITICAL 包,则使工作流失败 | | `max-packages` | `20` | 自动检测时审计的最大包数量 | | `include-dev-dependencies` | `false` | 包含 `package.json` 中的 `devDependencies` | | `comment-on-pr` | `true` | 将审计结果作为 PR 评论发布(需要 `pull-requests: write` 权限) | | `api-key` | _(无)_ | [Commit Pro](https://getcommit.dev/pricing) API key — 启用批量请求和每月 1 万次请求额度 | | `api-url` | _(生产环境)_ | 覆盖 API 端点(适用于自托管场景) | **输出:** `has-critical`、`critical-count`、`audit-summary`(Markdown 表格,同时写入 Step Summary)。 **免费版 vs 专业版:** 没有 API key 时,包会逐个接受审计(带有延迟以遵守速率限制)。使用 Pro API key 时,所有包将在单次批量请求中完成审计——速度更快,且月度限额更高。 PR 评论 / Step Summary 输出示例: ``` | Package | Risk | Score | Publishers | Downloads/wk | Age | |---------|-------------|-------|------------|--------------|-------| | chalk | 🔴 CRITICAL | 75 | 1 | 380M | 12.7y | | zod | 🔴 CRITICAL | 83 | 1 | 133M | 6.1y | | axios | 🔴 CRITICAL | 89 | 1 | 93M | 11.6y | ``` ## README 徽章 将 Commit Trust 徽章添加到你维护或依赖的任何 npm 包上: ``` ![Commit Trust](https://poc-backend.amdal-dev.workers.dev/badge/YOUR-PACKAGE) ``` 示例: | Package | Badge URL | |---------|-----------| | chalk | `![Commit Trust](https://poc-backend.amdal-dev.workers.dev/badge/chalk)` | | react | `![Commit Trust](https://poc-backend.amdal-dev.workers.dev/badge/react)` | | express | `![Commit Trust](https://poc-backend.amdal-dev.workers.dev/badge/express)` | | @babel/core | `![Commit Trust](https://poc-backend.amdal-dev.workers.dev/badge/@babel/core)` | 评级:🟢 OK (75+) · 🟠 WARNING (40–74) · 🔴 CRITICAL (<40 或每周下载量超过 1000 万的单一 npm 发布者) 徽章缓存 1 小时。无需 API key。 同时支持 PyPI、Cargo、Go 模块以及完整的特定生态系统格式: ``` ![commit score](https://poc-backend.amdal-dev.workers.dev/api/badge/npm/YOUR-PACKAGE) ![commit score](https://poc-backend.amdal-dev.workers.dev/api/badge/pypi/YOUR-PACKAGE) ![commit score](https://poc-backend.amdal-dev.workers.dev/api/badge/cargo/YOUR-CRATE) ![commit score](https://poc-backend.amdal-dev.workers.dev/api/badge/golang/github.com/owner/repo) ``` ## REST API 无需 API key。无需安装。 ``` curl https://poc-backend.amdal-dev.workers.dev/api/audit \ -X POST \ -H "Content-Type: application/json" \ -d '{"packages": ["axios", "zod", "chalk", "lodash", "express"]}' ``` ``` { "count": 5, "results": [ { "name": "chalk", "ecosystem": "npm", "score": 75, "maintainers": 1, "weeklyDownloads": 398397580, "ageYears": 12.7, "trend": "stable", "riskFlags": ["CRITICAL"], "scorecardScore": 3.6, // null if no GitHub repo "hasDangerousWorkflow": false // null if no Scorecard data }, ... ] } ``` ## 9 个 MCP 工具 | Tool | Description | |------|-------------| | `audit_dependencies` | 批量风险审计,支持最多 20 个 npm/PyPI/Cargo/Go 包 | | `lookup_npm_package` | 单个 npm 包行为分析 | | `lookup_pypi_package` | 单个 PyPI 包行为分析 | | `lookup_cargo_crate` | 单个 Rust crate 行为分析 (crates.io) | | `lookup_go_module` | 单个 Go 模块行为分析 (proxy.golang.org + GitHub) | | `lookup_github_repo` | GitHub 仓库承诺度得分(生命周期、提交频率、贡献者深度) | | `lookup_business` | 挪威企业注册信息——运营年限、员工数量、财务数据 | | `lookup_business_by_org` | 同上,通过组织编号查询 | | `query_commitment` | 浏览器扩展行为数据(唯一验证访客数、回访率) | ## 评分标准 每个包都会在以下维度获得 0-100 的评分: - **Longevity(生命周期)** — 该包存在了多久?被遗弃的包可能会被恶意重新激活用于攻击。 - **Publisher depth(发布者深度)** — 单一 npm 发布者加上数百万的每周下载量 = 正是 LiteLLM 曾利用的攻击面。(发布者 = 拥有 npm 发布权限的人,与 GitHub 贡献者不同。) - **Release consistency(发布一致性)** — 定期发布表明有持续维护。长期未更新 = 漏洞积累。 - **Download trend(下载趋势)** — 增长中的包会吸引更多关注(以及攻击)。稳定 = 更低的关注度。 - **OpenSSF Scorecard** — 流程安全性(代码审查执行、分支保护、CI/CD 安全性)。与行为信号区分开来。高 Scorecard 得分 ≠ 免受凭证盗窃攻击。 **风险标记:** - `CRITICAL` — 单一 npm 发布者 + 每周下载量 >1000 万(典型的 LiteLLM/axios 攻击特征) - `HIGH` — 包龄 <1 年且被快速广泛采用 - `WARN` — 12 个月以上无新发布版本 ## 真实数据点 ``` # 你了解的 packages: chalk — score 75, 1 publisher, 413M/week ⚑ CRITICAL zod — score 86, 1 publisher, 163M/week ⚑ CRITICAL (30+ GitHub contributors) lodash — score 81, 1 publisher, 145M/week ⚑ CRITICAL axios — score 86, 1 publisher, 99M/week ⚑ CRITICAL (attacked Mar 30 2026) express — score 90, 5 publishers, 95M/week # 可能不在你的 package.json 中,但肯定在你的 lock file 中的 packages: minimatch — score 78, 1 publisher, 562M/week ⚑ CRITICAL glob — score 80, 1 publisher, 333M/week ⚑ CRITICAL cross-spawn — score 72, 1 publisher, 190M/week ⚑ CRITICAL # post-attack: litellm — score 74, 1 publisher ⚑ CRITICAL (supply chain attack Mar 2026) # Rust crates(v1.3.0 新增): serde — score 78, 1 owner, 13M/week ⚑ CRITICAL (dtolnay sole owner) tokio — score 89, 2 owners, 10M/week reqwest — score 85, 1 owner, 8M/week ⚑ HIGH ``` ## 为什么选择行为信号 LiteLLM 攻击(2026 年 3 月)和 axios 攻击(2026 年 3 月 30 日)遵循相同的模式:凭证被盗 → 推送恶意包 → 9700 万+ 台机器被暴露。这两个包在这些攻击发生*之前*,就已被这些指标评为 CRITICAL。 声明性信号(star、README 质量、CI 徽章)无法捕捉到这种风险。但行为承诺度可以。 ## 技术栈 | Layer | Technology | |-------|-----------| | Backend | Cloudflare Workers + D1 | | MCP | Model Context Protocol SDK | | Data | npm registry, PyPI, crates.io, proxy.golang.org, deps.dev, GitHub API, Brønnøysund (NO) | | Landing | Astro + Cloudflare Pages | ## 路线图 计划中,非承诺。本项目仍处于早期阶段——欢迎在这些方向上的任何贡献。 | Feature | Status | Notes | |---------|--------|-------| | **Cargo (Rust) registry 支持** | ✅ 已上线 | MCP 工具、REST API、徽章端点 — `ecosystem: "cargo"` | | **Go 模块支持** | ✅ 已上线 | proxy.golang.org + deps.dev + GitHub 首要评分 — `ecosystem: "golang"` | | **分数细分可视化** | 计划中 | 用于在 getcommit.dev/audit 上展示 5 个维度的图表组件 | | **CLI 的 `--json` 标志** | ✅ 已上线 | `npx proof-of-commitment --file package-lock.json --json \| jq '.criticalCount'` | | **pnpm workspace monorepo 支持** | ✅ 已上线 | `--file pnpm-workspace.yaml` 或从 `pnpm-lock.yaml` 自动检测 | | **历史分数追踪** | 计划中 | 趋势图表——这个包的风险是否随时间在增加? | | **组织级仪表盘** | 计划中 | GitHub 组织内所有仓库的聚合风险视图 | 请参阅[待解决的问题](https://github.com/piiiico/proof-of-commitment/issues),了解你今天就可以帮忙的事项。 ## 更广阔的愿景 供应链审计是第一个工具。其底层基元是一个**承诺图**(commitment graph)——这是一种跨任何领域取代基于内容信任的行为信号。 当内容可以随意伪造时(评论、star、README),承诺度就成了真正的信号。一个在 12 年内发布了 847 个版本的发布者,其承诺度与一个在 2023 年只发布过一次的人是完全不同的。 同样的逻辑也适用于网站、企业和 AI 代理。两大银行卡网络已独立指出了这一空白:Mastercard Verifiable Intent §9.2 明确将行为信任列为“未涵盖”。Visa TAP 识别了代理,却没有回答是否应信任它们。 Proof of Commitment 正是他们所指向的信任层。 → [getcommit.dev](https://getcommit.dev) ## 本地运行 ``` bun install bun run dev:backend # local server with SQLite bun run test:e2e # E2E test with mock World ID ``` 部署: ``` bun run deploy # deploys to Cloudflare Workers ```
标签:API安全, API安全, DevSecOps, GNU通用公共许可证, Go Modules, JSON输出, JSON输出, LNA, MCP服务器, Node.js, npm安全, PyPI安全, Rust Crates, 上游代理, 依赖安全, 包管理器, 单维护者风险, 可见性评估, 数据集, 程序员工具, 统一API, 网络测绘, 自动化攻击, 零安装, 项目健康度