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审计, 代理网关, 供应链完整性门控, 供应链异常, 依赖结构分析, 包管理器安全, 历史版本对比, 发布者身份验证, 告警与阻断, 哈希校验, 基线比较, 威胁情报替代, 完整性校验, 异常检测, 无云端依赖, 无威胁情报, 无订阅, 确定性安全策略, 自定义脚本, 自托管, 证明来源验证, 软件供应链, 零信任