配了三年 GitHub Actions,今天才发现 runner 根本不是个临时容器——它已经是需要被保护的生产端点了
2025年3月,tj-actions/changed-files被篡改了版本标签,23000个仓库的runner内存里的secret全被打进了Actions日志。攻击者用的方法并不高级:先拿下action版本标签,再等runner跑起来,然后用一行curl把内存里的东西发出去。
事后的复盘报告写了十几篇,都在说OIDC上了没action SHA锁了没。几乎没人提一个更基础的问题:那个runner到底能访问哪些网络地址?
答案是:所有地址。没有任何限制。
runner一直是敢开的出口
GitHub Actions的安全模型在进来这一侧已经很完善了。OIDC令牌免去了存储长期云凭证的需要,GITHUB_TOKEN可以按最小权限scoping,action版本可以用SHA256精确锁定。这些控制管的是谁能触发这个workflow和跑什么代码,但从来没人管过跑起来的代码能打给谁。
runner就是一个普通的虚拟机,一旦代码在里面执行,它就可以访问互联网上的任意主机。OIDC能证明这个runner是你启动的,但不能证明它应该访问哪个外部地址。
两起真实攻击证明了这是真实存在的漏洞:
2025年3月tj-actions事件:攻击者篡改版本标签,恶意代码dump runner内存里所有secret、PAT、云凭证。23000个仓库中招。
2026年3月Trivy/TeamPCP事件:Aqua Security的Trivy扫描器被攻破,SSH密钥、AWS/GCP/Azure Token、Kubernetes Secrets、Docker配置全被抽走。攻击链蔓延到Checkmarx、LiteLLM和60+ npm包。10000+ CI/CD工作流受影响。
两起事件的根因完全相同:恶意代码进了runner之后,想打给谁就打给谁。
GitHub Native Egress Firewall:跑在VM外面的防火墙
GitHub在2026年3月发布了完整的安全路线图,其中最关键的一件就是Native Egress Firewall。它的架构和之前所有安全措施的根本区别在于:它在runner虚拟机外部运行。
之前社区最好的方案是StepSecurity Harden-Runner,跑在runner内部、在进程层面拦截网络调用。拿到root权限后理论上可以绕过它。
GitHub的方案是跑在网络基础设施层面。防火墙在runner VM和互联网之间,对所有出站DNS查询和HTTP/HTTPS请求做L7检查。runner里的代码拿到root也接触不到防火墙——它不在VM里面。
启用方式就是改一行runner标签:
jobs build runs-on ubuntu-24.04-firewall steps uses actions/checkout@v4 run npm ci && npm test
没有action要装,没有secret要配,没有workflow结构要改。ubuntu-24.04-firewall镜像是标准Ubuntu 24.04加了一层网络基础设施级别的监控。技术预览阶段是纯审计模式:记录所有出站请求并关联到对应的workflow run、job、step,但不做拦截。性能代价约15-20% job运行时增加。
TLS检查:ephemeral certificate per run
L7过滤要按域名做allowlist,光看IP不够用。防火墙在出口边界终止TLS、检查、重新加密发到目标。每个workflow run用一个临时证书,run结束立即销毁。没有持久解密能力——这是企业合规最在意的地方,解密能力是ephemeral的,policy才是持久资产。
三件套:各打断攻击链的一个节点
GitHub 2026安全路线图实际上是一套纵深防御,三件工具各针对攻击链的一个环节:
Lockfile依赖锁定:把action及其所有传递依赖锁定到SHA256哈希,hash不匹配则job不跑。这一环阻止篡改版本标签拉取恶意代码这条上游路径。
Scoped Secrets范围化凭证:把secret绑定到特定执行上下文(分支、环境、workflow身份、可信reusable workflow)。即使某一步被突破,爆炸半径也只限于这一步实际授权的范围。
Egress Firewall出口防火墙:即使恶意代码跑了进来、找到了secret,也无法把它传出去。出口被封堵了。
Lockfile阻止坏代码运行。Scoped secrets限制代码能找到的东西。Egress firewall阻止代码把找到的东西送出去。三件套各自针对攻击链的不同节点,合在一起才是完整的防御。
现在该做什么
技术预览阶段纯审计,enforcement模式(allowlist+阻断)公开预览预计Q3-Q4 2026。这意味着现在注册的用户会积累真实流量数据——你的CI/CD实际连接了哪些域名、哪些IP范围、哪些HTTP方法。等enforcement来的时候,直接切换。
不注册的人面临冷启动:在enforcement模式下,未在allowlist的目标全部阻断,需要一次性把整个CI/CD依赖的所有外部地址全部摸清楚。
三行YAML,一个runner标签。这是目前CI/CD安全里性价比最高的动作。别等。
评论区
登录后可评论。