2025年11月24日“Shai-Hulud”攻击事件复盘

这起事件的核心是,一个名为“Shai-Hulud 2.0”的恶意蠕虫通过 PostHog 的多个 JavaScript SDK 传播。攻击者利用了 GitHub 工作流中的一个安全漏洞,窃取了发布凭证,从而植入恶意代码。这些恶意包会扫描开发者的环境以窃取更多凭证,并进一步自我复制。PostHog 迅速采取了应对措施,删除了恶意包并修复了漏洞,同时建议用户立即升级并检查本地环境,公司也因此全面加强了其安全流程。

发生了什么?“Shai-Hulud”蠕虫攻击

2023年11月24日,PostHog 的多个 JavaScript SDK 包在 npm 上被发布了包含恶意代码的新版本。这个名为 “Shai-Hulud 2.0” 的蠕虫通过预安装脚本进行传播。

    • 扫描凭证: 脚本会扫描其所在的开发环境,利用开源工具 Trufflehog 搜索任何形式的凭证。
    • 泄露凭证: 将找到的凭证推送到一个新建的公开 GitHub 仓库,从而泄露出去。
    • 自我传播: 利用窃取到的 npm 凭证,发布更多包含恶意代码的包,以扩大感染范围。

PostHog 在发现问题后,迅速删除了所有恶意包并撤销了被盗用的令牌。

受影响的主要软件包和版本包括:

    • posthog-node 4.18.1, 5.13.3, 5.11.3
    • posthog-js 1.297.3
    • posthog-react-native 4.11.1
    • 以及 @posthog/agent, @posthog/cli 等其他几个包。

用户应该怎么做?

如果你正在使用 PostHog 的 JavaScript SDK,官方建议采取以下步骤来确保安全:

    • 检查本地文件: 在你的用户主目录或项目根目录中查找可疑文件。
    • 检查 npm 日志: 查看 npm 的日志记录,寻找是否有异常条目。
    • 清理依赖缓存: 删除所有已缓存的 npm 依赖项。
    • 固定依赖版本: 将所有相关依赖锁定到一个已知的安全版本,然后重新安装所有依赖项。

一个很好的预防措施是在 yarnpnpm 的配置中设置 minimumReleaseAge。将其设置为一个较长的时间(例如3天),可以确保你不会在第一时间被这类新发布的恶意包攻击。

攻击是如何发生的?GitHub 工作流的漏洞

这次攻击的根源是 PostHog 自身的一个安全漏洞,攻击者利用它作为了蠕虫传播的“零号病人”。

  1. 第一步:窃取机器人令牌

      • 11月18日,一名攻击者提交了一个恶意的拉取请求(Pull Request)。
      • 这个 PR 修改了一个用于处理外部贡献的工作流脚本,使其能将运行过程中的 GitHub 机器人访问令牌发送到攻击者控制的服务器。
      • 整个操作在1分钟内完成(打开 PR -> 运行工作流 -> 关闭 PR),难以察觉。
  2. 第二步:测试并窃取所有机密

      • 11月23日,攻击者使用窃取的令牌测试其有效性,并成功删除了一个工作流记录。
      • 随后,攻击者直接向仓库推送了一个独立的提交(detached commit)。这个提交修改了另一个工作流文件,使其能够窃取 CI/CD 环境中所有的机密信息,其中就包括 npm 发布令牌
  3. 第三步:发布恶意包

      • 在获得 npm 发布令牌大约12小时后,即 11月24日凌晨,攻击者正式发布了含有蠕虫的恶意软件包。

为什么会存在这个漏洞?一个危险的误解

这个安全漏洞源于对 GitHub Actions 中一个触发器 pull_request_target 的危险误解。团队原本以为它只会运行目标分支(如 master 分支)中已有的、受信任的代码。

这是一个危险的误解。pull_request_target 仅确保工作流本身是按目标分支定义的版本运行,但工作流中具体执行的代码则由 checkout 步骤决定。

导致漏洞产生的三个关键因素共同作用:

    • 触发器变更: 为了让自动化流程对外部贡献生效,工作流的触发器从 pull_request 改为了 pull_request_target
    • 执行本地脚本: 该工作流会执行仓库内的一个脚本文件。
    • 检出恶意代码: 为了让脚本正确工作,工作流被修改为检出 PR 提交的最新代码,而不是目标分支的稳定代码。

这三点结合起来,使得攻击者可以通过提交一个修改了内部脚本的 PR,在受信任的 CI 环境中执行任意代码,最终窃取了关键凭证。

后续措施与反思

这是 PostHog 经历过最严重的安全事件。公司坦承,这次攻击暴露了他们之前未曾预料到的攻击面。

  • 流程改进:
      • 加固发布流程: 转向更安全的“受信任发布者”模型。
      • 加强审查: 任何修改工作流文件的 PR 都需要安全团队成员的专门审查。
      • 升级工具: 切换到 pnpm 10 以禁用 preinstall/postinstall 脚本。
      • 重构凭证管理: 改进 GitHub 机密管理机制,以便在未来更快、更有效地响应类似事件。

PostHog 强调,作为一个数据公司,他们过去的重心始终是保护用户数据和云环境安全。现在,他们认识到必须更严肃地对待整个生态系统的广义安全问题,并已开始全面投入安全建设,包括公开招聘安全人才。