WhyzperMe/forgeguard
GitHub: WhyzperMe/forgeguard
一款基于 Rust 的自主软件供应链漏洞扫描器,支持 Cargo 与 npm 生态的静态依赖分析、在线/离线公告查询、策略门禁与 SBOM 生成,适用于 CI/CD 管道中的防御性安全工程。
Stars: 0 | Forks: 0
# ForgeGuard
ForgeGuard 是一个基于 Rust 的、CLI 优先的软件供应链漏洞和风险扫描器。它专为防御性安全工程、CI/CD 门禁、SBOM 生成和安全审查工作流而设计。
ForgeGuard 目前支持静态的 Rust/Cargo 和 JavaScript 包元数据扫描。它会递归发现支持的 lockfile,跨生态系统标准化依赖项,在在线模式下查询公告情报,在离线模式下重用本地公告缓存,应用确定性的风险模型,评估本地策略,并为人类和自动化渲染报告。
## 状态
ForgeGuard 是一个早期但已具备生产级雏形的 v0.1 项目。首先实现了兼容 Cargo 和 npm 的 JavaScript lockfile 支持。PyPI、Go、Maven、RustSec 本地数据库集成、EPSS、CISA KEV、VEX 以及更丰富的 SBOM 支持仍是计划中的扩展点。
## 安全姿态
ForgeGuard 在扫描不受信任的仓库时故意保持保守。
默认情况下,Cargo 扫描器:
- 仅解析静态文件;
- 不运行 `cargo build`;
- 不执行 `build.rs`;
- 不运行包管理器安装脚本;
- 不评估项目源代码;
- 当启用网络公告查询时,仅向 OSV.dev 发送包生态系统、包名称和解析后的版本。
使用 `--offline` 或 `--no-network` 可完全禁用外部公告查询。
## 功能
- 有界递归仓库发现
- 静态 Cargo 项目发现
- `Cargo.lock` 解析
- 在可从静态清单推断的情况下,进行直接、构建、开发和传递性依赖分类
- 静态 `package-lock.json`、`pnpm-lock.yaml` 和 Yarn v1 `yarn.lock` 解析
- 明确报告对 Bun lockfile 的不支持
- 在 OSV 查询前过滤公共 crates.io 包
- 在 OSV 查询前过滤公共 npm registry
- OSV.dev 批量公告查询
- 用于离线扫描的本地 OSV 公告缓存
- 公告别名处理和发现去重
- 带有可解释原因的确定性风险评分
- 通过 `forgeguard.yml` 进行策略执行
- 终端、JSON、Markdown 和 SARIF 报告
- 最小化的 CycloneDX JSON SBOM 导出
- 离线/无网络模式
- 对 CI 友好的退出码
## 非目标
ForgeGuard 不是:
- 漏洞利用框架;
- EDR 规避工具;
- 网络扫描器;
- Web 漏洞扫描器;
- 恶意软件沙箱;
- 执行不受信任依赖的工具。
## 安装
从仓库根目录:
```
cargo build -p forgeguard --release
```
在开发期间运行 debug 构建:
```
cargo run -p forgeguard -- --help
```
## 快速开始
扫描一个 Cargo 项目或直接的 `Cargo.lock` 路径:
```
forgeguard scan .
forgeguard scan Cargo.lock
```
生成 JSON 输出:
```
forgeguard scan . --format json --out forgeguard-report.json
forgeguard scan . --format json --output forgeguard-report.json
```
生成 Markdown 输出:
```
forgeguard scan . --format markdown --out forgeguard-report.md
```
生成 SARIF 输出:
```
forgeguard scan . --format sarif --out forgeguard.sarif
```
在没有网络公告查询的情况下运行:
```
forgeguard scan . --offline
forgeguard scan . --no-network
forgeguard scan . --offline --strict --cache .forgeguard/osv-cache.json
forgeguard cache update .
forgeguard cache status --format json
forgeguard cache path
forgeguard policy check forgeguard-report.json --policy forgeguard.yml --json
```
生成最小化的 CycloneDX SBOM:
```
forgeguard sbom . --format cyclonedx-json --output bom.cdx.json
```
通过 ID 解释漏洞:
```
forgeguard explain RUSTSEC-2020-0071
```
## 退出码
| 退出码 | 含义 |
| ---: | --- |
| `0` | 命令完成;扫描策略通过或警告 |
| `1` | 扫描完成但策略失败 |
| `2` | 使用或配置错误,包括无效的策略文件 |
| `3` | 扫描/运行时错误,包括无法读取的目标或格式错误的 lockfile |
| `4` | 网络或公告源/缓存错误 |
| `5` | 内部错误 |
## 策略文件
ForgeGuard 会自动在扫描的项目或 lockfile 旁边查找 `forgeguard.yml`。您也可以显式传入一个:
```
forgeguard scan . --policy forgeguard.yml
```
示例策略:
```
fail_on:
severity: high
known_exploited: true
fix_available: false
allowlist:
- id: "RUSTSEC-0000-0000"
reason: "Temporary exception while upstream patch is validated"
expires: "2026-01-31"
licenses:
deny:
- AGPL-3.0
- GPL-3.0
```
允许列表条目必须包含原因。已过期的条目不会抑制发现。
## CI/CD 示例
```
name: Supply Chain Security
on:
pull_request:
push:
branches: [main]
permissions:
contents: read
jobs:
forgeguard:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
persist-credentials: false
- run: cargo run -p forgeguard -- scan . --policy forgeguard.yml --format markdown --out forgeguard-report.md
```
## 终端输出示例
```
ForgeGuard Scan Report
Target: examples/vulnerable-rust-app
Ecosystem: Cargo
Dependencies scanned: 2
Findings: 1
Policy: warning
Risk summary:
Critical: 0
High: 0
Medium: 0
Low: 1
Info: 0
```
## 支持的生态系统
| 生态系统 | 状态 |
| --- | --- |
| Cargo | 在 v0.1 中支持 |
| npm package-lock | 在 v0.1 中支持 |
| pnpm lockfile | 在 v0.1 中支持,保守的图重建 |
| Yarn v1 lockfile | 在 v0.1 中支持,保守的图重建 |
| Bun lockfile | 已检测;解析器尚未实现 |
| PyPI | 计划中 |
| Go modules | 计划中 |
| Maven | 计划中 |
| CycloneDX SBOM 导入 | 计划中 |
| SPDX | 计划中 |
## 隐私模型
在线模式发送的公告查询仅包含:
- 生态系统;
- 包名;
- 包版本。
ForgeGuard 不会将源代码、环境变量、密钥、完整清单或完整的 lockfile 上传到公告 API。离线/无网络模式仅执行本地静态分析,并且不调用公告服务。
## 架构
ForgeGuard 是一个具有严格 crate 边界的 Cargo workspace:
| Crate | 职责 |
| --- | --- |
| `forgeguard-core` | 领域模型、风险评分、扫描报告类型 |
| `forgeguard-scanner` | 有界的多生态系统 lockfile 发现 |
| `forgeguard-cargo` | 静态 Cargo 发现和 lockfile 解析 |
| `forgeguard-npm` | 静态 npm/pnpm/Yarn lockfile 解析 |
| `forgeguard-osv` | OSV.dev 客户端和公告映射 |
| `forgeguard-policy` | 策略加载、验证和评估 |
| `forgeguard-report` | 表格、JSON、Markdown 和 SARIF 渲染 |
| `forgeguard-cli` | CLI 编排和进程退出行为 |
详情请参阅 [`docs/architecture.md`](docs/architecture.md)。
## 威胁模型
请参阅 [`docs/threat-model.md`](docs/threat-model.md)。
## 开发
质量门禁:
```
cargo fmt --all -- --check
cargo clippy --workspace --all-targets --all-features --locked -- -D warnings
cargo test --workspace --all-features --locked
cargo build --workspace --all-features --locked
cargo doc --workspace --no-deps --locked
```
本地运行:
```
cargo run -p forgeguard -- scan examples/vulnerable-rust-app
```
## 路线图
- RustSec 本地公告数据库
- GitHub Advisory Database 扩充
- EPSS 评分
- CISA KEV 扩充
- VEX 支持
- 完整的 CycloneDX 导入/导出
- SPDX 支持
- 针对 pull request 的依赖差异扫描
- 支持 npm、PyPI、Go 和 Maven
- 签名的发布版本和来源元数据
标签:Rust, SBOM生成, 加密, 可视化界面, 文档安全, 文档结构分析, 漏洞扫描器, 网络流量审计, 通知系统