cybrota/scharf
GitHub: cybrota/scharf
Scharf 是一个静态分析工具,用于识别和修复 GitHub Actions 中的供应链风险,通过将操作固定到特定提交 SHA 来增强安全性。
Stars: 15 | Forks: 0
# Scharf
[](https://goreportcard.com/report/github.com/cybrota/scharf)
保护您的 CI/CD 管道免受第三方 GitHub Actions 供应链攻击。
Scharf 会扫描您的工作流,识别可变操作引用,并将其替换为不可变的提交 SHA。它还能生成全面的 CSV 或 JSON 跨仓库报告,并让您无需离开终端即可检查可用的标签和 SHA。
## 为什么使用 Scharf?
通过将每个第三方操作固定到特定的提交 SHA,Scharf 能防止意外或恶意的更改潜入您的 CI/CD 流程。通过消除与依赖漂移和可变标签相关的风险,这确保了稳定且安全的开发生命周期。
## 关键特性
* **自动修复工作流**:在您的工作流文件中检测可变操作标签并更新为对应的 SHA。
* **快速 SHA 查找**:直接从 CLI 获取任何 GitHub Action 的最新提交 SHA。
* **可操作的报告**:生成 JSON 或 CSV 报告,突出显示一个或多个仓库中的不安全引用。
* **自定义范围**:在审核或查找操作时,选择仅扫描当前 HEAD 或包含所有分支。
## 支持的平台
* Linux
* Mac OSX
## 安装方式
**选项 1**:通过 Homebrew 快速安装(需已安装 Homebrew)
```
# 添加 brew formula
brew tap cybrota/cybrota
# 安装 scharf
brew install scharf
```
**选项 2**:下载预编译二进制文件
访问发布页面并下载适用于您操作系统的二进制文件:
https://github.com/cybrota/scharf/releases
**选项 3**:通过脚本安装
此脚本会自动安装最新版本(需要 curl)。
## 使用示例
### 1. 自动修复可变操作
指向一个 Git 仓库,运行:
```
# 自动修复本地仓库
scharf autofix git_repo
```
注意:默认情况下,如果未传递仓库路径,审核会查看当前目录(.)。
Scharf 会重写您的工作流文件,例如,将:
```
actions/github-script@v7 ➔ actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
```
替换为固定格式。
包含 `--dry-run` 参数可在不修改文件的情况下预览更改:
```
scharf autofix git_repo --dry-run
```
### 2. 审核单个仓库
扫描当前仓库中的可变引用:
```
# 审计本地仓库
scharf audit git_repo
# 审计远程仓库。这会自动将远程仓库克隆到 /tmp 目录,使用 scharf-* 前缀
scharf audit https_or_git_url
```
输出会列出每个不安全的标签、其文件位置以及您应固定的 SHA。您可以传递 `--raise-error` 标志以返回非零错误代码。
### 3. 跨多个仓库查找
将 Scharf 指向一个包含克隆仓库的目录以扫描多个项目:
```
scharf find --root /path/to/workspace --out csv
```
添加 `--head-only` 标志可将扫描限制在每个仓库的当前 HEAD,或省略该标志以包含所有分支。
### 4. 列出可用的标签和 SHA
如果您需要在固定之前探索版本,请运行:
```
scharf list owner/repo
# 示例:scharf list tj-actions/changed-files
```
此命令将打印一个包含标签及其对应提交 SHA 的表格。
### 5. 查找特定的 SHA
当您知道一个标签并想要其对应的 SHA 时,使用:
```
scharf lookup owner/repo@version
# 示例:scharf lookup actions/checkout@v4
```
### 6. 升级单个已固定的 Action SHA
要从一个固定版本迁移到下一个可用版本:
```
scharf upgrade owner/repo@version
# 示例:scharf upgrade actions/checkout@v4
```
如果您的输入已经是 SHA,请提供当前版本上下文:
```
scharf upgrade owner/repo@ --from-version v4
```
控制冷却警告(默认为 24 小时):
```
scharf upgrade actions/checkout@v4 --cooldown-hours 24
```
在不应用更改的情况下预览输出:
```
scharf upgrade actions/checkout@v4 --dry-run
```
### 7. 升级所有 Scharf 格式的固定 SHA
要升级工作流中所有现有的 Scharf 管理的固定引用:
```
scharf upgrade-all-sha .
```
预览所有计划的升级:
```
scharf upgrade-all-sha . --cooldown-hours 24 --dry-run
```
**说明**:
- 此命令仅升级 Scharf 格式的引用:`owner/repo@ # `
- 可变引用(如 `@v4`、`@main`)不会被此命令更改;请使用 `scharf autofix` 来处理它们。
## CI 集成
将 Scharf 嵌入您的 GitHub Actions 工作流中,以自动强制执行安全引用:
更多详情请参见此仓库:
[https://github.com/cybrota/scharf-action](https://github.com/cybrota/scharf-action)
```
jobs:
my-job:
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
- name: Audit GitHub actions
uses: cybrota/scharf-action@c0d0eb13ca383e5a3ec947d754f61c9e61fab5ba
with:
raise-error: true
```
## 可变标签的风险
可变标签(例如 @v1 或 @main)允许操作作者在不更改您的工作流的情况下推送新代码。如果标签被入侵,您的 CI 可能会运行恶意代码。Scharf 通过始终固定到特定、经过审计的提交来消除此漏洞。
## Scharf 待办事项
请查看 GitHub 上的 Issues 选项卡。
## 延伸阅读:
第三方 tj-actions/changed-files 供应链攻击:
- https://www.cisa.gov/news-events/alerts/2025/03/18/supply-chain-compromise-third-party-github-action-cve-2025-30066
在 GitHub Actions 中运行的是谁的代码?
- https://alexwlchan.net/2025/github-actions-audit/
GitHub CVE:tj-actions changed-files 直至 45.0.7 版本允许远程攻击者通过读取操作日志发现秘密
* https://github.com/advisories/ghsa-mrrh-fwg8-r2c3
标签:CI/CD 安全, CI/CD 管道加固, CLI 工具, CSV 报告, DevSecOps, EVTX分析, GitHub Actions, Go 语言, JSON 报告, SHA 固定, 上游代理, 云安全监控, 供应链攻击防护, 依赖安全, 工作流扫描, 数据投毒防御, 文档结构分析, 日志审计, 自动修复, 自动笔记, 静态分析