cybrota/scharf

GitHub: cybrota/scharf

Scharf 是一个静态分析工具,用于识别和修复 GitHub Actions 中的供应链风险,通过将操作固定到特定提交 SHA 来增强安全性。

Stars: 15 | Forks: 0

# Scharf [![Go 报告卡](https://goreportcard.com/badge/github.com/cybrota/scharf)](https://goreportcard.com/report/github.com/cybrota/scharf) Scharf logo (light) 保护您的 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 固定, 上游代理, 云安全监控, 供应链攻击防护, 依赖安全, 工作流扫描, 数据投毒防御, 文档结构分析, 日志审计, 自动修复, 自动笔记, 静态分析