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-node4.18.1, 5.13.3, 5.11.3posthog-js1.297.3posthog-react-native4.11.1- 以及
@posthog/agent,@posthog/cli等其他几个包。
用户应该怎么做?
如果你正在使用 PostHog 的 JavaScript SDK,官方建议采取以下步骤来确保安全:
- 检查本地文件: 在你的用户主目录或项目根目录中查找可疑文件。
- 检查 npm 日志: 查看 npm 的日志记录,寻找是否有异常条目。
- 清理依赖缓存: 删除所有已缓存的 npm 依赖项。
- 固定依赖版本: 将所有相关依赖锁定到一个已知的安全版本,然后重新安装所有依赖项。
一个很好的预防措施是在
yarn或pnpm的配置中设置minimumReleaseAge。将其设置为一个较长的时间(例如3天),可以确保你不会在第一时间被这类新发布的恶意包攻击。
攻击是如何发生的?GitHub 工作流的漏洞
这次攻击的根源是 PostHog 自身的一个安全漏洞,攻击者利用它作为了蠕虫传播的“零号病人”。
第一步:窃取机器人令牌
- 11月18日,一名攻击者提交了一个恶意的拉取请求(Pull Request)。
- 这个 PR 修改了一个用于处理外部贡献的工作流脚本,使其能将运行过程中的 GitHub 机器人访问令牌发送到攻击者控制的服务器。
- 整个操作在1分钟内完成(打开 PR -> 运行工作流 -> 关闭 PR),难以察觉。
第二步:测试并窃取所有机密
- 11月23日,攻击者使用窃取的令牌测试其有效性,并成功删除了一个工作流记录。
- 随后,攻击者直接向仓库推送了一个独立的提交(detached commit)。这个提交修改了另一个工作流文件,使其能够窃取 CI/CD 环境中所有的机密信息,其中就包括 npm 发布令牌。
第三步:发布恶意包
- 在获得 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 强调,作为一个数据公司,他们过去的重心始终是保护用户数据和云环境安全。现在,他们认识到必须更严肃地对待整个生态系统的广义安全问题,并已开始全面投入安全建设,包括公开招聘安全人才。