场景:2026年6月,某头部金融科技企业SOC监测到内网多台服务器异常外连,指向一个未知域名。经研判,攻击源竟来自一个被广泛使用的内部npm私有仓库——一场针对开发环节的供应链投毒攻击正在悄然收网。
攻击 / 事件时间线
初始访问:伪装与渗透
攻击方利用社工手段,获取了某离职开发人员的GitLab个人访问令牌。随后,他们向企业内部npm私有仓库推送了一个名为 @internal/logger-utils 的恶意包。该包版本号刻意设置为 2.1.9,与官方版本号相近,并包含了看似正常的日志格式化功能。恶意代码隐藏在 postinstall 脚本中,通过 child_process.exec 执行一段经过Base64编码的PowerShell命令,用于下载并执行C2载荷。整个包体积仅增加了3KB,并未触发任何代码审查告警。
GitLab TokennpmPowerShellBase64编码
提权与持久化:潜伏的守护进程
下载的C2载荷是一个经过混淆的Cobalt Strike Beacon。攻击者利用 Mimikatz 从一台构建服务器上抓取了域管理员凭据,并将Beacon注册为 Windows Defender Update Service 服务,实现持久化。同时,攻击者修改了系统日志策略,清除了 Security 和 PowerShell 的操作日志,以掩盖其入侵痕迹。
Cobalt StrikeMimikatz混淆器
横向移动与数据窃取:地毯式扫描
凭借域管理员权限,攻击者利用 PsExec 和 WMIC 在内网进行大规模横向移动。他们的目标并非核心数据库,而是直接锁定了Jira、Confluence以及GitLab服务器。攻击者编写了自动化脚本,批量搜索并下载包含“password”、“secret”、“jdbc”等关键字的配置文件,以及所有私有仓库的源代码。最终,攻击者将窃取的约12GB数据(包括源代码、数据库连接串、云服务密钥)分批次通过 HTTPS 加密流量上传至一个位于境外的VPS。
PsExecWMIC自动化脚本HTTPS加密
蓝队视角 · 发现与处置
SOC最初仅察觉到内网一台构建服务器存在异常外连,流量行为分析系统(NBAD)标记了该连接。蓝队通过 Sysmon 日志回溯,发现构建服务器在安装 @internal/logger-utils 后立即执行了可疑的PowerShell进程。随即,安全团队对npm包进行逆向分析,确认了 postinstall 脚本中的恶意载荷。通过关联分析,确认攻击入口为离职员工的GitLab令牌泄露。蓝队立即隔离受感染服务器,吊销令牌,并批量排查所有使用了该恶意包的开发环境。
涉及关键技术 / 工具
npm恶意包投毒(postinstall脚本)Cobalt Strike Beacon的隐蔽植入基于Sysmon的进程链溯源分析
防护经验总结
- 1. 严格管理GitLab/GitHub个人访问令牌,实施最小权限原则,并对离职人员令牌进行即时回收。
- 2. 在私有npm仓库中引入自动化扫描机制,对
postinstall、preinstall 等脚本进行静态分析,阻断可疑包发布。 - 3. 加强构建服务器的出站访问控制,仅允许白名单域名通过,并部署NBAD系统实时监控异常外连行为。
#供应链攻击#npm投毒#红蓝对抗#Cobalt Strike#Sysmon