tehreet/pinpoint
GitHub: tehreet/pinpoint
监控 GitHub Actions 版本标签的 commit SHA 变化,在标签被恶意重定向时提前预警的供应链安全检测工具。
Stars: 0 | Forks: 0
# pinpoint
**在恶意代码到达你的 runner 之前,检测 GitHub Actions 标签重定向攻击。**
pinpoint 监控 GitHub Action 版本标签背后的 commit SHA,并在它们发生变化的瞬间发出警报。它是填补“某人强制推送了 75 个标签”与“你的 CI/CD 流水线执行了凭据窃取程序”之间缺失的那一层安全防护。
## 为什么开发这个工具
2026 年 3 月 19 日,威胁行为者通过强制推送 76 个版本标签中的 75 个,将其指向包含凭据窃取程序的恶意 commit,从而入侵了 Aqua Security 的 `trivy-action`。恶意代码在真正的扫描器运行*之前*静默执行,因此工作流看起来正常运行完成了。GitHub 上有超过 10,000 个工作流文件引用了 trivy-action。
检测来自于 EDR 传感器捕获到 CI/CD runner 上异常的脚本执行 —— **这是在恶意代码已经在执行之后。** 标签重定向本身在数小时内未被检测到。
pinpoint 能在几分钟内捕获标签变动,在任何 runner 执行任何操作之前。
这不是第一次发生这种情况。`tj-actions/changed-files` 入侵事件(2025 年 3 月)使用了相同的技术。这也不会是最后一次。
### 问题所在
GitHub Actions 使用 **可变的 git 标签** 作为版本引用。当你编写:
```
uses: aquasecurity/trivy-action@0.24.0
```
你相信标签 `0.24.0` 仍然指向它昨天指向的同一个 commit。任何拥有写入权限的人都可以静默地重定向它:
```
git tag -f 0.24.0
git push -f origin refs/tags/0.24.0
```
在该时刻之后运行的每个工作流都会执行攻击者控制的代码,并拥有你流水线 secrets、凭据和基础设施的完全访问权限。
### 解决方案
记录每个标签指向的 commit SHA。定期检查。如果有任何变化,发出警报。
## 快速开始
### 安装
```
# 从源码
go install github.com/tehreet/pinpoint/cmd/pinpoint@latest
# 或克隆并构建
git clone https://github.com/tehreet/pinpoint.git
cd pinpoint
go build ./cmd/pinpoint/
```
### 发现你正在使用什么
将 pinpoint 指向你的工作流目录,查看你依赖哪些 actions 以及哪些容易受到标签重定向攻击:
```
pinpoint discover --workflows .github/workflows/
```
输出:
```
Discovered 14 action references across 8 repos
SHA-pinned: 3 (safe from tag repointing)
Tag-based: 11 (vulnerable to tag repointing)
actions/checkout — monitoring tags: v4
actions/setup-go — monitoring tags: v5
aquasecurity/trivy-action — monitoring tags: 0.24.0, 0.35.0
docker/build-push-action — monitoring tags: v5
```
生成配置文件:
```
pinpoint discover --workflows .github/workflows/ --config > .pinpoint.yml
```
### 扫描(一次性)
```
export GITHUB_TOKEN=ghp_your_token_here
pinpoint scan --config .pinpoint.yml
```
干净输出:
```
✓ All 11 tracked tags verified. No repointing detected.
```
如果标签已被重定向:
```
[CRITICAL] TAG_REPOINTED
Action: aquasecurity/trivy-action
Tag: 0.24.0
Before: e0198fd3c332
After: a1b2c3d4e5f6
Signals:
• MASS_REPOINT: 75 tags repointed in same scan cycle
• OFF_BRANCH: new commit is not a descendant of previous commit
• SEMVER_REPOINT: exact version tag should never be moved
• SIZE_ANOMALY: entry point size changed +516% (2855 → 17592 bytes)
⚠ SELF-HOSTED RUNNERS: Assume persistent compromise. Rotate all credentials.
```
检测到时退出代码为 2 —— 将其作为关卡插入 CI 中。
### 监控(持续)
```
pinpoint watch --config .pinpoint.yml --interval 5m
```
按间隔轮询,使用 ETag 条件请求(未更改的仓库不消耗 API 速率限制),通过 stdout、Slack 或 webhook 警报。
## 配置
```
# .pinpoint.yml
actions:
# Monitor specific tags
- repo: aquasecurity/trivy-action
tags: ["0.35.0"]
self_hosted_runners: true # Elevates alert severity
# Monitor ALL tags on a repo
- repo: actions/checkout
tags: ["*"]
alerts:
min_severity: medium # low | medium | critical
stdout: true
slack_webhook: https://hooks.slack.com/services/T.../B.../xxx
webhook_url: https://your-pagerduty-or-opsgenie-endpoint
store:
path: .pinpoint-state.json
```
## 风险评分
并非所有的标签移动都是恶意的。维护者通常会向前移动主要版本标签。pinpoint 对每个事件进行评分:
| 信号 | 严重程度 | 示例 |
|--------|----------|---------|
| 批量重定向(>5 个标签) | 严重 | Trivy:一次 75 个标签 |
| Commit 不在默认分支上 | 严重 | 孤立/偏离的 commit |
| 入口点大小变化 >50% | 严重 | 2.8KB → 17.6KB |
| 精确 semver 标签移动 | 高 | `v1.2.3` 绝不应移动 |
| 倒签 commit(>30 天) | 高 | 伪造的 `GIT_AUTHOR_DATE` |
| 无相应 Release | 中 | 标签存在但没有 Release |
| 标记了自托管 runner | 中 | 影响范围扩大 |
| 主要版本标签前进 | 低 | `v1` → 后代(常规操作) |
## 自托管 runner
如果你用 `self_hosted_runners: true` 标记一个 action,pinpoint 会提升警报严重程度并添加具体的响应指导。
自托管 runner 是持久化的,通常权限过高,并且经常在多个工作流之间共享。自托管 runner 上被入侵的 action 不仅仅是泄露 secret —— 它是一个潜在的持久化据点。Trivy 攻击者在开发者机器的 `~/.config/sysmon.py` 处投放了一个基于 systemd 的后门,该后门轮询一个基于区块链的 C2。在自托管 runner 上,payload 从 50 多个文件系统路径收集凭据,包括 SSH 密钥、云提供商凭据、Kubernetes token 和 Terraform 状态。
像 CrowdStrike Falcon 这样的 EDR 工具在运行时捕获此类行为 —— 在代码执行之后。pinpoint 在代码到达你的 runner 之前捕获标签重定向。
## 工作原理
1. **轮询** — 通过 GitHub 的 git refs API 获取所有标签引用,带 ETag 缓存。未更改的仓库返回 `304 Not Modified` 且不消耗速率限制。
2. **解引用** — 通过标签对象将带注释的标签解析为底层的 commit SHA。轻量级标签直接解析。
3. **比较** — 根据存储的状态检查每个受监控标签的当前 commit SHA。
4. **丰富** — 发生变化时:检查新 commit 是否是旧 commit 的后代,检索 commit 作者/日期元数据,比较入口点文件大小,并检查是否有相应的 GitHub Release。
5. **评分** — 应用风险启发式规则生成严重性评级。
6. **警报** — 发送到 stdout、Slack 或通用 webhook。退出代码 2 用于 CI 集成。
状态通过原子写入持久化为 JSON 文件。每个标签变化都附加到历史数组中以便取证审查。
## API 速率限制
pinpoint 使用批量 `matching-refs` 端点(每个仓库 1 次 API 调用,而不是每个标签)以及 ETag 条件请求。以 5 分钟间隔监控 100 个仓库大约使用 1,200 次调用/小时,完全在 GitHub 5,000 次/小时的认证限制之内。
未经认证的请求限制为 60 次/小时,不推荐使用。在任何实际使用中请设置 `GITHUB_TOKEN`。
## 这个工具不做的事
pinpoint 是一个**检测**工具,而不是预防工具。它告诉你标签何时移动了。它不会:
- 将你的 actions 固定到 SHA(为此请使用 [StepSecurity secure-repo](https://github.com/step-security/secure-repo) 或 Dependabot)
- 监控 runner 上的运行时行为(为此请使用 [StepSecurity Harden-Runner](https://github.com/step-security/harden-runner) 或 CrowdStrike)
- 扫描 action 源代码中的恶意软件(为此请使用 [Socket.dev](https://socket.dev))
pinpoint 填补了预防(SHA 固定)和运行时检测(EDR)之间的空白。它是纵深防御策略中的第 2 层。
## 背景
本项目的开发源于对 2026 年 3 月 Trivy 供应链入侵事件的第一手经验。有关攻击、威胁模型以及现有工具差距的详细技术分析,请参阅:
- [Wiz: Trivy Compromised by "TeamPCP"](https://www.wiz.io/blog/trivy-compromised-teampcp-supply-chain-attack)
- [CrowdStrike: From Scanner to Stealer](https://www.crowdstrike.com/en-us/blog/from-scanner-to-stealer-inside-the-trivy-action-supply-chain-compromise/)
- [Socket: Trivy Under Attack Again](https://socket.dev/blog/trivy-under-attack-again-github-actions-compromise)
- [StepSecurity: Trivy Compromised a Second Time](https://www.stepsecurity.io/blog/trivy-compromised-a-second-time---malicious-v0-69-4-release)
- [Aqua Security: Trivy Security Incident 2026-03-19](https://github.com/aquasecurity/trivy/discussions/10425)
## 许可证
Copyright (C) 2026 CoreWeave, Inc.
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the [GNU General Public License](LICENSE) for more details.
标签:AMSI绕过, CI/CD 安全, DevSecOps, EVTX分析, GitHub Actions, Git 安全, Go, Homebrew安装, Ruby工具, StruQ, 上游代理, 云安全监控, 凭证窃取防护, 威胁检测, 安全助手, 完整性监控, 恶意代码防护, 指令劫持, 数据投毒防御, 文档安全, 日志审计, 标签篡改检测, 版本控制安全, 网络安全, 自动笔记, 软件开发工具包, 隐私保护, 静态分析