场景:2026年5月,某中型金融科技公司,其内部npm私有仓库被植入恶意包,CI/CD流水线被控制,攻击者通过供应链侧投毒窃取密钥与数据库凭证。
攻击 / 事件时间线
初始投毒
攻击者以伪装成高频使用的日志库@log4js-node/log4js,上传至公开npm仓库。该包在安装后(postinstall hook)从C2服务器下载第二阶段载荷,并伪装成合法的依赖更新,混淆开发者视线。
npmpostinstall hookbase64编码载荷
横向渗透
该公司开发人员误将该恶意包引入内部项目并提交至私有仓库。CI/CD流水线自动拉取依赖并执行构建,恶意代码在构建环境中激活,通过环境变量窃取AWS_ACCESS_KEY_ID等敏感凭证,并利用curl外传至攻击者控制的服务器。
CI/CD Pipeline (Jenkins)环境变量curl
数据窃取
攻击者利用窃取的凭证通过kubectl连接K8s集群,发现未加密的ConfigMap中存储的数据库连接串。随后,攻击者直接从生产数据库导出包含用户手机号、身份证号等敏感信息的表,数据量约1.2GB,并打包加密后外传。
kubectlConfigMappg_dump
痕迹清除
攻击者删除CI/CD构建日志中与其IP相关的访问记录,并卸载了被植入的恶意npm包,试图掩盖入侵痕迹。同时,通过搭建SOCKS5代理隧道,抹除C2服务器的直接连接记录。
SOCKS5代理日志删除命令
蓝队视角 · 发现与处置
蓝队通过部署在CI/CD环境的Falco规则,检测到构建节点出现异常的高频外连(至陌生海外IP)。安全运营人员立即阻断出站流量,并冻结该构建节点。通过分析Jenkins构建日志与恶意包的依赖树,确认了投毒点。随后回溯Git历史,定位到首次引入恶意包的commit,并清除私有仓库中所有受污染的包版本。同时,轮换所有在构建过程中被使用的密钥。
涉及关键技术 / 工具
npm供应链投毒(Typosquatting)CI/CD流水线凭证窃取Falco运行时安全检测依赖树反查
防护经验总结
- 严格限制CI/CD节点的出站策略,仅允许连接白名单内的外部仓库(如官方npm源),禁止直接外连公网。
- 对私有仓库引入的第三方包进行自动安全扫描(如使用Snyk或npm audit),并强制所有依赖更新需经过安全审批。
- 实施最小权限原则:CI/CD使用的服务账号仅授予运行时所需的最小权限,严禁使用具有集群管理员角色的token。
#供应链攻击#npm投毒#CI/CD安全#数据泄露#红蓝对抗