React Query Codegen npm包投毒事件
2026 年 8 月 28 日,GitHub 用户 p00paboot 利用 @7nohe/openapi-react-query-codegen 发布工作流缺少身份校验的漏洞,通过在恶意 Pull Request 下评论 npm publish 触发 GitHub Actions。该工作流随后检出攻击者控制的 PR 代码,并借助作业的 id-token: write 权限,通过 npm Trusted Publishing 发布恶意软件包
- 发布
- 阅读
- 10 分钟 · 2,715 字
- 状态
- 首次发布
@7nohe/openapi-react‑query‑codegen 是一款用于根据 OpenAPI 规范自动生成 React‑Query 客户端请求代码与 TS 类型的 npm 工具包,周下载量约 15 万次。2026 年 8 月 28 日,攻击者利用该项目 GitHub Actions 发布工作流缺少身份校验漏洞,在 PR 评论输入 npm publish 触发发布流水线,借助 npm Trusted Publishing 发布 10 个恶意版本。
恶意包通过 binding.gyp、preinstall 生命周期脚本在 npm 依赖安装阶段触发恶意载荷,跨 Windows/Linux/macOS 平台下载 Bun 运行时执行恶意代码。该恶意载荷具备本地与云环境凭据采集、凭据有效性校验、加密窃取外传、软件包二次投毒、开发工具持久化驻留、SSH 横向传播能力,可窃取 GitHub npm PyPI 云厂商 K8s SSH Docker 各类凭据,威胁开发者终端、CI/CD Runner、云主机与集群环境,被窃取的包发布权限还会造成供应链风险持续扩散。 受影响软件包版本:
@7nohe/openapi-react‑query‑codegen@0.5.4; @7nohe/openapi-react‑query‑codegen@0.5.5; @7nohe/openapi-react‑query‑codegen@1.6.3; @7nohe/openapi-react‑query‑codegen@1.6.4; @7nohe/openapi-react‑query‑codegen@2.2.1; @7nohe/openapi-react‑query‑codegen@2.2.2; @7nohe/openapi-react‑query‑codegen@3.0.3; @7nohe/openapi-react‑query‑codegen@3.0.4; @7nohe/openapi-react‑query‑codegen@0.0.0‑365d4eb738d3146583431948d3ba6e27a32556be; @7nohe/openapi-react‑query‑codegen@0.0.0‑ec7876d6c917dad516ba69bbfafc948b834bf0ab; 恶意特征文件:
3FWCvzduYZg.js、binding.gyp、updater.py;
临时目录前缀:/tmp/trinnyyyy‑;
外联特征:访问release‑assets.githubusercontent.com;
文件MD5:1d3b239c549ca3f49fc2d2559361eccb;
排查方法:
1、优先核验依赖与版本:检查 package-lock.json、yarn.lock、pnpm-lock.yaml、npm-shrinkwrap.json、SBOM、依赖缓存和制品记录中是否出现 @7nohe/openapi-react-query-codegen 的受影响版本 0.5.4、0.5.5、1.6.3、1.6.4、2.2.1、2.2.2、3.0.3、3.0.4,以及带提交后缀的 365d4eb738d3146583431948d3ba6e27a32556be 和 ec7876d6c917dad516ba69bbfafc948b834bf0ab,命中即可判定环境曾解析或安装受影响制品。
2、核验安装触发入口:检查已安装包目录、npm 缓存解包目录和构建工作区中的 package.json,确认是否存在 preinstall 或 install 字段调用 node 3FWCvzduYZg.js,或同目录下是否出现 3FWCvzduYZg.js、binding.gyp、updater.py 等文件,命中即表示安装阶段可能已实际触发。
3、核验主机落地痕迹:检查开发机、CI runner 或构建容器的进程创建日志、终端遥测和临时目录,确认是否存在 /tmp/trinnyyyy- 前缀目录、/tmp/trinnyyyy-doj0LR/bun、临时 updater.py,或与 node 3FWCvzduYZg.js 相邻时间出现的 Bun 执行记录,命中即可判定载荷已进入分阶段执行。
4、核验外联行为:检查 DNS、代理、网关、NDR 或 CI/CD 出网审计中 npm install、pnpm install 或 Node 进程对应时间窗口的连接记录,若命中安装期间访问 release-assets.githubusercontent.com 且与受影响版本安装过程重合,可确认存在后续载荷下载迹象。
5、核验凭据访问迹象:检查 GitHub、npm、云平台、代码仓库、SSH 和 Docker registry 的账号审计日志及 CI/CD secrets 使用记录,若在受影响安装时间后命中异常 token 调用、仓库访问、发布操作或凭据读取行为,即表示该安装过程可能已接触可用凭据。
处置建议:
1、立即阻断受影响制品与安装阶段外联,在私有 npm 代理、制品仓库、构建基线和出网策略中禁用 0.5.4、0.5.5、1.6.3、1.6.4、2.2.1、2.2.2、3.0.3、3.0.4 及已知异常预发布版本。 2、将相关发布线固定到已知干净版本 0.5.3、1.6.2、2.2.0 或 3.0.2,并从干净开发机或 CI runner 重新拉取依赖后重建镜像、制品和发布包,验证条件为 lockfile、SBOM、制品元数据和运行环境中不再出现 3FWCvzduYZg.js、binding.gyp 或受影响版本记录。
3、删除受影响主机、Runner、制品缓存和构建工作目录中的 npm 缓存、node_modules、历史构建产物,以及 /tmp/trinnyyyy-、/tmp/trinnyyyy-*/bun、updater.py 等临时文件后再执行重建,验证条件为文件系统与缓存中不再命中上述路径、文件名。
4、对已安装或执行受影响版本的开发机、CI/CD runner 和相关云环境,按暴露面轮换 CI/CD secrets、云平台凭据、代码托管凭据、包仓库凭据、SSH 凭据和 Docker registry 凭据,同时失效活动会话并收敛发布、仓库和部署权限,验证条件为旧凭据全部失效,且后续发布、拉取和部署仅由最小权限新凭据完成。
5、审计仓库 workflow、GitHub Actions OIDC 发布配置、组织级与仓库级 secrets、registry 发布记录和异常构建产物,清除未授权发布路径后落实版本固定、摘要或签名校验、发布审批、构建链路出网白名单和安装阶段异常执行监控,验证条件为后续发布仅能经授权工作流完成,且依赖安装阶段不再出现未批准脚本执行或异常外联。
修订记录
首次发布。