r-bedekar/chaingate

GitHub: r-bedekar/chaingate

ChainGate 是一个基于历史基线比对的无情报供应链安全门,用于捕捉包结构异常与零日风险。

Stars: 0 | Forks: 0

# ChainGate **保障供应链完整性的安全门,捕捉威胁情报遗漏的风险。** 每一种供应链安全工具都会问一个问题:*“这个包是否已知为恶意?”* ChainGate 问:*“这个包与昨天的版本是否不同?”* 无需威胁情报源。无需订阅。无需云端依赖。可自我托管。 ## 问题 2026 年 3 月 31 日,axios@1.14.1 被发布并隐藏了一个远程控制程序(RAT),每周下载量达 1 亿次,危险窗口长达 3 小时。npm 注册表元数据显示了四个危险信号——新的幽灵依赖、发布者邮箱变更、证明来源消失、发布方式从 OIDC 切换为 CLI 令牌。这些信息在安装时并未向开发者展示。 JFrog、Sonatype、Snyk 只能捕获**已知**威胁。它们依赖数据库中的 CVE 和签名中的恶意软件。在任何数据库更新之前的零日窗口期内,它们是“盲”的。 ChainGate 捕获**未知**威胁,通过识别结构异常——它记住每个包的历史形态,并在发生变化时提醒你。 ## 工作原理 ChainGate 位于开发者(或 CI 流水线)与包注册表之间。它为所见过的每个包版本记录一个基线配置文件——内容哈希、依赖结构、发布者身份、证明来源状态。后续每次安装都会与基线进行比较。 ``` Developer → ChainGate proxy → upstream registry ↓ Compare against baseline Apply deterministic gates ✅ ALLOW ⚠️ WARN 🚫 BLOCK ``` 无需威胁情报源。只需一条规则:“这个版本与我预期不同” → 警告或阻断。 ## 你所看到的 ``` $ npm install axios ✓ axios@1.14.0 — verified (hash match, 3 deps, OIDC provenance) $ npm install axios@1.14.1 🚫 BLOCKED: axios@1.14.1 ├── New dependency: plain-crypto-js (first published 18 hours ago) ├── Publisher email changed: gmail.com → protonmail.me ├── Provenance: NONE (previous 14 versions had OIDC attestation) └── Publish method: CLI token (previous versions via GitHub Actions) Run: chaingate allow axios@1.14.1 --reason "..." to override ``` ## 安全门 | 安全门 | 检查内容 | 默认行为 | |--------|----------|----------| | **内容哈希** | 哈希值是否与首次观察的一致? | BLOCK | | **依赖结构** | 依赖树是否发生意外变化? | WARN | | **发布者身份** | 发布者邮箱或身份是否变更? | WARN | | **证明来源连续性** | 发布方式是否变更(OIDC → CLI)? | WARN | | **发布时效** | 版本是否小于 N 小时? | WARN | | **作用域边界** | 幽灵依赖与安装脚本的绝对限制 | WARN | 内容哈希不匹配是默认的唯一硬性阻断项。其他均为警告。你可自行决定哪些情况需要升级。 ## 攻击覆盖范围 | 攻击类型 | ChainGate 如何捕捉 | |----------|-------------------| | **Axios**(幽灵依赖 + 发布者变更) | 四个安全门同时触发 | | **Trivy**(Git 标签被强制推送) | 内容哈希不匹配 | | **Notepad++**(通过服务器劫持替换二进制) | 内容哈希不匹配 | | **Shai-Hulud**(利用被盗令牌发布 500+ 包) | 多个包的发布者身份发生变更 | **真实局限:** 如果攻击者入侵 CI/CD 流水线,并使用相同结构和工作流程发布代码(仅修改代码内容),元数据仍会看起来“干净”。这种情况需要代码级分析工具(如 Socket、Snyk)。ChainGate 是补充方案,而非替代品。 ## 快速开始 需要 **Node.js 22+**。 ``` npm install -g chaingate chaingate init # downloads seed DB, starts proxy, patches .npmrc npm install axios # now routed through ChainGate chaingate status # see what was observed chaingate why axios@1.7.9 # explain the gate decision chaingate stop # restore .npmrc, stop proxy ``` ## 部署模式 **模式 1:独立代理** — 轻量级,适合个人开发者和小型团队。 **模式 2:集成层** — 适用于 JFrog Artifactory 或 Sonatype Nexus 的插件。你的现有仓库负责代理转发,ChainGate 提供智能检测。 ## 生态系统支持 | 生态系统 | 状态 | |----------|------| | npm | 🟢 活跃 | | PyPI | 🔵 计划中 | | Docker Hub | 🔵 计划中 | ## 架构 ``` ┌─────────────────────────────────────────┐ │ CHAINGATE PROXY │ │ │ │ ┌─────────────┐ ┌─────────────────┐ │ │ │ WITNESS │ │ GATES │ │ │ │ (Memory) │ │ (Det. Rules) │ │ │ │ │ │ │ │ │ │ Content hash │ │ Hash verify │ │ │ │ Pkg profiles │ │ Dep structure │ │ │ │ Merkle tree │ │ Publisher ID │ │ │ │ │ │ Provenance │ │ │ └──────┬───────┘ │ Release age │ │ │ │ │ Scope boundary │ │ │ │ └────────┬────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌──────────────────────────────────┐ │ │ │ DECISION ENGINE │ │ │ │ ALLOW / WARN / BLOCK │ │ │ └──────────────────────────────────┘ │ └─────────────────────────────────────────┘ ``` ## 独特之处 | | JFrog Curation | Sonatype Firewall | Socket | **ChainGate** | |---|---|---|---|---| | 检测方式 | 已知 CVE + 恶意软件库 | 专有 AI | 代码分析 | **历史基线** | | 零日窗口 | 盲区,直到数据库更新 | 部分覆盖 | 快速(6 分钟) | **即时响应** | | 是否依赖外部情报 | 是 | 是 | 是 | **否** | | 是否可自我托管 | 是(成本高) | 是(成本高) | 否 | **是(免费)** | | 是否开源 | 否 | 否 | 仅 CLI | **是** | ## 贡献 请参考 [CONTRIBUTING.md](CONTRIBUTING.md) 获取指南。我们欢迎为新的包注册表添加生态连接器。 ## 许可证 Apache 2.0 — 请参见 [LICENSE](LICENSE)。 *ChainGate 能在基于情报的工具遗漏时发挥作用——在数据库尚未更新的零日窗口期内。*
标签:axios, CI/CD安全, JSONLines, Llama, MITM代理, npm, npm审计, 代理网关, 供应链完整性门控, 供应链异常, 依赖结构分析, 包管理器安全, 历史版本对比, 发布者身份验证, 告警与阻断, 哈希校验, 基线比较, 威胁情报替代, 完整性校验, 异常检测, 无云端依赖, 无威胁情报, 无订阅, 确定性安全策略, 自定义脚本, 自托管, 证明来源验证, 软件供应链, 零信任