rebaze/scat
GitHub: rebaze/scat
一款 AI 原生的软件组合分析工具,通过单一命令完成 CycloneDX SBOM 生成、漏洞扫描和许可证合规检查,同时为人类提供可视化仪表板、为 AI 代理提供结构化输出。
Stars: 1 | Forks: 0
# scat
[](https://github.com/rebaze/scat/actions/workflows/ci.yaml)
[](https://github.com/rebaze/scat/actions/workflows/release.yaml)
[](https://github.com/rebaze/scat/releases/latest)
[](LICENSE)
[](go.mod)
[](https://scorecard.dev/viewer/?uri=github.com/rebaze/scat)
**软件组合分析工具 (Software Composition Analysis Tool)** —— 这正是 scat 所代表的含义。
一个命令回答三个问题:你的软件里有什么,存在哪些漏洞,以及许可证的义务是什么?专为两类受众构建——需要标准输出提供结构化数据的 AI 代理,以及想要可视化仪表板的人类。两者均是第一等级的体验。
## 面向机器
AI 代理?运行此命令:
```
scat --quiet -f markdown
```
完整的 SCA 报告 —— SBOM、漏洞、许可证 —— 以结构化 Markdown 格式在标准输出中显示。不写入任何文件,没有 TUI,只有纯粹的数据。对其进行管道操作、解析,或将其输入给你的下一步操作。
## 面向人类
```
scat
```
打开一个包含严重性条形图、风险热力图和许可证概览的 HTML 仪表板。仅生成单个文件,方便分享。


## 面向 AI 代理
安装 [Claude Code](https://claude.ai/code) 技能以让 AI 代理使用 scat:
```
mkdir -p ~/.claude/skills/scat
curl -fsSL https://raw.githubusercontent.com/rebaze/scat/main/skill/SKILL.md \
-o ~/.claude/skills/scat/SKILL.md
```
一旦安装,Claude 就会知道何时以及如何在你的项目上运行 scat。
## 功能
- **CycloneDX SBOM** — 行业标准的软件物料清单
- **漏洞扫描** — 将软件包与已知 CVE 进行匹配并进行严重性评分,结合 EPSS 利用概率和 CISA KEV (已知被利用的漏洞) 数据进行丰富
- **许可证合规** — 检测并评估开源许可证
- **HTML 仪表板** — 开箱即用的精美亮/暗模式报告,随时可以分享,包含严重性条形图、风险热力图,且适合打印的布局
- **单一二进制文件** — PATH 中无需外部工具;Syft、Grype 和许可证检查均作为 Go 库嵌入其中
## 安装
### Homebrew(推荐)
```
brew install rebaze/tap/scat
```
### Go install
```
go install github.com/rebaze/scat@latest
```
### 从源码构建
```
git clone https://github.com/rebaze/scat.git
cd scat
make build # injects version, commit, and build date via ldflags
```
## 验证发布版本
每个已发布的版本均通过 [Sigstore](https://www.sigstore.dev/) 签名,并附带由 [release workflow](.github/workflows/release.yaml) 使用 GitHub Artifact Attestations 生成的 [SLSA v1.0 Build Level 3](https://slsa.dev/spec/v1.0/levels#build-l3) 起源证明以及 CycloneDX SBOM 证明。
验证下载的压缩包是否来自此仓库的发布流程:
```
# 使用 GitHub CLI(推荐 — 无需安装额外工具)
gh attestation verify scat___.tar.gz --repo rebaze/scat
# 使用 cosign(首先下载证明捆绑包;归档是 blob,
# 而非 OCI 镜像,因此请使用 verify-blob-attestation)
gh attestation download scat___.tar.gz --repo rebaze/scat
# 下载的 .jsonl 包含两份证明(provenance + SBOM)— 每行
# 一份。通过检查每个捆绑包的 predicate type 来拆分它们。
jq -c 'select((.dsseEnvelope.payload | @base64d | fromjson | .predicateType) | startswith("https://slsa.dev/provenance"))' \
sha256:*.jsonl > bundle.provenance.json
jq -c 'select((.dsseEnvelope.payload | @base64d | fromjson | .predicateType) == "https://cyclonedx.org/bom")' \
sha256:*.jsonl > bundle.sbom.json
cosign verify-blob-attestation \
--bundle bundle.provenance.json \
--new-bundle-format \
--type slsaprovenance1 \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity-regexp "^https://github\.com/rebaze/scat/\.github/workflows/release\.yaml@refs/tags/" \
scat___.tar.gz
```
CycloneDX SBOM (`scat-v-source.cdx.json`) 的证明是针对发布压缩包作为主体(而非针对 SBOM 文件本身)进行的。要验证 SBOM 证明,请使用 CycloneDX 谓词类型将验证器指向某个发布**压缩包**:
```
# 使用 GitHub CLI
gh attestation verify scat___.tar.gz \
--repo rebaze/scat \
--predicate-type https://cyclonedx.org/bom
# 使用 cosign(重用上面提取的 bundle.sbom.json)
cosign verify-blob-attestation \
--bundle bundle.sbom.json \
--new-bundle-format \
--type cyclonedx \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity-regexp "^https://github\.com/rebaze/scat/\.github/workflows/release\.yaml@refs/tags/" \
scat___.tar.gz
```
## 命令行参考
```
scat
```
没有子命令。只需将 `scat` 指向一个目录或 PURL 文件即可。
### 标志
| 标志 | 缩写 | 默认值 | 描述 |
|------|-------|---------|-------------|
| `--output-dir` | `-o` | `.` | 输出文件的目录 |
| `--format` | `-f` | `html` | 输出格式:`html` (文件), `markdown` (标准输出) |
| `--verbose` | `-v` | `false` | 详细输出 |
| `--quiet` | `-q` | `false` | 隐藏非错误输出 |
| `--clear-cache` | | `false` | 在扫描前删除缓存的 Grype 漏洞数据库 |
| `--version` | | | 打印版本信息 |
## 输出
每次调用只产生**一个输出** —— 格式标志决定了输出的形式和目标:
| 格式 | 目标 | TUI 进度 | 创建的文件 |
|--------|-------------|--------------|---------------|
| `html` (默认) | `--output-dir` 中的 `-summary.html` | stdout | `-summary.html` |
| `markdown` | stdout | stderr | 无 |
`` 是被扫描文件夹的基本名称(例如 `/path/to/my-project` 对应 `my-project`)。
`--output-dir` 仅适用于 HTML 输出。对于 Markdown,请使用 shell 重定向 (`> file.md`) 来写入文件 —— 这比使用专用标志更简单也更符合组合原则。
当使用 `-f markdown` 时,TUI 进度条会被路由到 stderr,以便在终端中保持可见,同时 stdout 输出适合管道操作的纯净 Markdown。
### 示例
```
# 默认:HTML dashboard
scat myproject
# → 写入 ./myproject-summary.html,终端显示 TUI 进度
# HTML 到特定目录
scat -o /tmp myproject
# → 写入 /tmp/myproject-summary.html
# Markdown 到终端
scat -f markdown myproject
# → stderr 上的 TUI,stdout 上的 Markdown
# 通过管道传递给 LLM
scat -f markdown myproject | llm "summarize critical vulnerabilities"
# 将 Markdown 保存到文件
scat -f markdown myproject > report.md
# 安静模式(无 TUI)
scat -q myproject
scat -f markdown -q myproject
# 重新下载 vulnerability database
scat --clear-cache myproject
# 打印版本
scat --version
```
## 流水线
```
source folder
│
▼
scat → -summary.html (default)
scat -f markdown → stdout (pipe-friendly)
```
## 许可证
[Apache-2.0](LICENSE)
标签:AI代理, AI原生, CI/CD安全, CISA项目, Claude, CVE检测, CycloneDX, DevSecOps, EVTX分析, Go语言, Llama, LLM防护, LNA, OpenSSF, SBOM, WebSocket, 上游代理, 人工智能, 依赖分析, 可视化仪表板, 安全合规, 安全扫描, 报告生成器, 日志审计, 时序注入, 用户模式Hook绕过, 硬件无关, 程序破解, 网络代理, 许可证合规, 跌倒检测, 软件物料清单, 风险分析