5月19日凌晨不少开发者的构建流水线还在静默运转一场针对npm生态的精准打击却已悄然完成。攻击者成功拿下了atool这一维护者账户的访问权限随后向数十个广受欢迎的JavaScript包推送了带毒版本。从数据可视化图表库到React组件封装器恶意代码顺着正常的版本更新流入了全球数百万开发者的本地环境与CI/CD节点。这次事件被安全研究团队Socket.dev命名为Mini Shai-Hulud攻击浪潮。之所以用浪潮来形容是因为其波及面实在过于惊人仅在5月19日当天就有323个不同的npm包、累计639个版本被确认植入后门。而这还只是整个攻击活动的冰山一角——若把视野扩大到PyPI与Composer注册表被污染的独立包总数达到502个涉及版本超过一千个。其中npm生态受伤最重498个包、1048个版本沦陷。能在如此短的时间内跨平台、大批量地完成投毒背后显然不是临时起意的脚本小子而是一个资源充裕、组织严密的威胁团伙。热门库首当其冲下游风险正在扩散在这批被劫持的软件包中echarts-for-react格外引人注目。这个为React开发者封装ECharts能力的库每周下载量稳定在110万次左右。攻击者显然深谙npm的依赖传播逻辑只要向一个高流量的上游包注入恶意代码就能借助语义化版本自动更新机制让毒素迅速渗透到无数子项目与生产构建中。更令人警惕的是此次攻击并非只盯着antv核心包下手。timeago.js、size-sensor、canvas-nest.js这些看似与数据可视化毫无关联的工具库同样未能幸免。这种广撒网重点突破的混合策略使得任何依赖这些包的组织都面临真实的下游风险——哪怕你只更新了一个不起眼的辅助库也可能把后门带进代码仓库。六分钟窗口恶意版本如何逃过肉眼审查Socket.dev的内部审查揭示了一个令人不安的事实大多数带毒版本在发布后的六到十二分钟内就被系统标记为恶意软件。这个时间窗口看似短暂但对于配置了自动依赖更新的CI/CD环境来说已经足够触发一次完整的构建与部署循环。攻击者正是利用了现代软件开发快与自动化的特点把合法的开源基础设施变成了武器。那么这些被注入的代码究竟做了什么每一个被感染的包都被植入了一个根目录下的index.js文件。这个文件会静默修改package.json在安装阶段通过Bun运行时触发preinstall钩子从而执行经过深度混淆的有效载荷。恶意代码使用了大型字符串数组与自定义解密器来隐藏敏感字符串肉眼几乎无法直接识别其真实意图。多层加密与定向窃密这不是普通的挖矿脚本一旦preinstall钩子被触发恶意程序便开始在本地环境中地毯式搜索高价值凭证。它的目标清单几乎涵盖了现代云原生开发的所有核心资产GitHub个人访问令牌、AWS访问密钥与会话令牌、Kubernetes服务账户配置、SSH私钥、HashiCorp Vault令牌、Docker认证文件以及各类数据库连接字符串。更棘手的是恶意载荷还针对不同CI/CD平台编写了专门的处理逻辑。无论你是用GitHub Actions、GitLab CI、Jenkins、CircleCI还是AWS CodeBuild它都能精准定位并提取环境变量中埋藏的机密信息。窃密数据的传输链路同样经过精心设计。收集到的信息会先被序列化再经gzip压缩随后使用AES-256-GCM算法加密密钥则通过RSA-OAEP封装。最终所有数据被发往由攻击者控制的C2服务器。这种多层加密组合让网络流量日志分析几乎无法直接还原被盗内容极大增加了事后取证的难度。GitHub沦为备用C2近两千个仓库的沙丘暗号如果恶意程序在受害者环境中找到了可用的GitHub令牌它会立即启动第二套数据外泄方案。攻击者会在受害者本人名下悄悄创建一个新的私有仓库然后将窃取到的结构化数据以特定路径提交进去。这种手法的高明之处在于它把GitHub这一可信平台本身变成了数据中转站传统的域名黑名单与流量拦截策略对此几乎束手无策。安全研究人员通过反向搜索攻击活动的特征标记在GitHub上发现了大约1900个由该团伙创建的仓库。这些仓库的命名充满了对科幻作品《沙丘》的致敬sayyadina-stillsuit-852、fremen-fedaykin-225、atreides-ornithopter-112……仓库描述中则隐藏着反向书写的活动标识niagA oG eW ereH :duluH-iahS解码后正是Shai-Hulud: Here We Go Again。这种带有鲜明文化符号的命名体系既成了追踪线索也暗示着攻击者对自身隐蔽性的傲慢自信。蠕虫式自我传播账户劫持的连锁反应Shai-Hulud的可怕之处不仅在于窃密更在于它具备类似蠕虫的自我复制能力。当恶意代码在某台开发机或构建节点上运行后它会主动验证窃取的npm凭证是否有效。一旦确认便枚举该账户拥有发布权限的所有包向其中注入相同的恶意代码然后重新发布新版本。这意味着攻击可以在不同维护者账户之间自动跳跃无需攻击者手动干预形成指数级扩散的连锁反应。对于企业安全团队而言这种机制带来了双重压力即便你确认自己的项目没有直接依赖antv相关包也无法保证团队内部某个开发者的个人npm账户不会成为下一轮传播的跳板。紧急排查与防御建议面对已经发生的污染开发者和企业安全团队需要立刻行动起来。首要任务是审计近期所有涉及antv及相关npm命名空间的依赖更新确认是否安装了5月19日前后发布的可疑版本。其次任何在近期执行过npm install或CI构建的环境中传递过的密钥、令牌与凭证都应当被视为可能泄露并立即启动轮换流程。CI/CD流水线的日志同样值得仔细翻查。如果在构建记录中发现了意料之外的GitHub仓库创建行为或者出现了指向t.m-kosche.com域名的出站连接就应高度警觉。该域名及其443端口上的/api/public/otel/v1/traces端点是此次攻击活动已知的主要数据外泄通道。此外载荷中还引用了Sigstore的Fulcio与Rekor端点这可能意味着攻击者在尝试利用软件签名基础设施进行进一步操作。对于长期防御组织应当重新审视自动依赖更新的策略。把版本号锁死、启用依赖审查工具、为CI/CD环境实施最小权限原则都是降低此类供应链攻击面有效手段。开源生态的便利不应以牺牲安全可视性为代价——毕竟当攻击者把合法平台变成武器时最后一道防线往往就是开发者对每一次版本变更的审慎态度。
npm遭遇大规模供应链投毒:@antv生态被植入Shai-Hulud后门,全球开发者需紧急排查
5月19日凌晨不少开发者的构建流水线还在静默运转一场针对npm生态的精准打击却已悄然完成。攻击者成功拿下了atool这一维护者账户的访问权限随后向数十个广受欢迎的JavaScript包推送了带毒版本。从数据可视化图表库到React组件封装器恶意代码顺着正常的版本更新流入了全球数百万开发者的本地环境与CI/CD节点。这次事件被安全研究团队Socket.dev命名为Mini Shai-Hulud攻击浪潮。之所以用浪潮来形容是因为其波及面实在过于惊人仅在5月19日当天就有323个不同的npm包、累计639个版本被确认植入后门。而这还只是整个攻击活动的冰山一角——若把视野扩大到PyPI与Composer注册表被污染的独立包总数达到502个涉及版本超过一千个。其中npm生态受伤最重498个包、1048个版本沦陷。能在如此短的时间内跨平台、大批量地完成投毒背后显然不是临时起意的脚本小子而是一个资源充裕、组织严密的威胁团伙。热门库首当其冲下游风险正在扩散在这批被劫持的软件包中echarts-for-react格外引人注目。这个为React开发者封装ECharts能力的库每周下载量稳定在110万次左右。攻击者显然深谙npm的依赖传播逻辑只要向一个高流量的上游包注入恶意代码就能借助语义化版本自动更新机制让毒素迅速渗透到无数子项目与生产构建中。更令人警惕的是此次攻击并非只盯着antv核心包下手。timeago.js、size-sensor、canvas-nest.js这些看似与数据可视化毫无关联的工具库同样未能幸免。这种广撒网重点突破的混合策略使得任何依赖这些包的组织都面临真实的下游风险——哪怕你只更新了一个不起眼的辅助库也可能把后门带进代码仓库。六分钟窗口恶意版本如何逃过肉眼审查Socket.dev的内部审查揭示了一个令人不安的事实大多数带毒版本在发布后的六到十二分钟内就被系统标记为恶意软件。这个时间窗口看似短暂但对于配置了自动依赖更新的CI/CD环境来说已经足够触发一次完整的构建与部署循环。攻击者正是利用了现代软件开发快与自动化的特点把合法的开源基础设施变成了武器。那么这些被注入的代码究竟做了什么每一个被感染的包都被植入了一个根目录下的index.js文件。这个文件会静默修改package.json在安装阶段通过Bun运行时触发preinstall钩子从而执行经过深度混淆的有效载荷。恶意代码使用了大型字符串数组与自定义解密器来隐藏敏感字符串肉眼几乎无法直接识别其真实意图。多层加密与定向窃密这不是普通的挖矿脚本一旦preinstall钩子被触发恶意程序便开始在本地环境中地毯式搜索高价值凭证。它的目标清单几乎涵盖了现代云原生开发的所有核心资产GitHub个人访问令牌、AWS访问密钥与会话令牌、Kubernetes服务账户配置、SSH私钥、HashiCorp Vault令牌、Docker认证文件以及各类数据库连接字符串。更棘手的是恶意载荷还针对不同CI/CD平台编写了专门的处理逻辑。无论你是用GitHub Actions、GitLab CI、Jenkins、CircleCI还是AWS CodeBuild它都能精准定位并提取环境变量中埋藏的机密信息。窃密数据的传输链路同样经过精心设计。收集到的信息会先被序列化再经gzip压缩随后使用AES-256-GCM算法加密密钥则通过RSA-OAEP封装。最终所有数据被发往由攻击者控制的C2服务器。这种多层加密组合让网络流量日志分析几乎无法直接还原被盗内容极大增加了事后取证的难度。GitHub沦为备用C2近两千个仓库的沙丘暗号如果恶意程序在受害者环境中找到了可用的GitHub令牌它会立即启动第二套数据外泄方案。攻击者会在受害者本人名下悄悄创建一个新的私有仓库然后将窃取到的结构化数据以特定路径提交进去。这种手法的高明之处在于它把GitHub这一可信平台本身变成了数据中转站传统的域名黑名单与流量拦截策略对此几乎束手无策。安全研究人员通过反向搜索攻击活动的特征标记在GitHub上发现了大约1900个由该团伙创建的仓库。这些仓库的命名充满了对科幻作品《沙丘》的致敬sayyadina-stillsuit-852、fremen-fedaykin-225、atreides-ornithopter-112……仓库描述中则隐藏着反向书写的活动标识niagA oG eW ereH :duluH-iahS解码后正是Shai-Hulud: Here We Go Again。这种带有鲜明文化符号的命名体系既成了追踪线索也暗示着攻击者对自身隐蔽性的傲慢自信。蠕虫式自我传播账户劫持的连锁反应Shai-Hulud的可怕之处不仅在于窃密更在于它具备类似蠕虫的自我复制能力。当恶意代码在某台开发机或构建节点上运行后它会主动验证窃取的npm凭证是否有效。一旦确认便枚举该账户拥有发布权限的所有包向其中注入相同的恶意代码然后重新发布新版本。这意味着攻击可以在不同维护者账户之间自动跳跃无需攻击者手动干预形成指数级扩散的连锁反应。对于企业安全团队而言这种机制带来了双重压力即便你确认自己的项目没有直接依赖antv相关包也无法保证团队内部某个开发者的个人npm账户不会成为下一轮传播的跳板。紧急排查与防御建议面对已经发生的污染开发者和企业安全团队需要立刻行动起来。首要任务是审计近期所有涉及antv及相关npm命名空间的依赖更新确认是否安装了5月19日前后发布的可疑版本。其次任何在近期执行过npm install或CI构建的环境中传递过的密钥、令牌与凭证都应当被视为可能泄露并立即启动轮换流程。CI/CD流水线的日志同样值得仔细翻查。如果在构建记录中发现了意料之外的GitHub仓库创建行为或者出现了指向t.m-kosche.com域名的出站连接就应高度警觉。该域名及其443端口上的/api/public/otel/v1/traces端点是此次攻击活动已知的主要数据外泄通道。此外载荷中还引用了Sigstore的Fulcio与Rekor端点这可能意味着攻击者在尝试利用软件签名基础设施进行进一步操作。对于长期防御组织应当重新审视自动依赖更新的策略。把版本号锁死、启用依赖审查工具、为CI/CD环境实施最小权限原则都是降低此类供应链攻击面有效手段。开源生态的便利不应以牺牲安全可视性为代价——毕竟当攻击者把合法平台变成武器时最后一道防线往往就是开发者对每一次版本变更的审慎态度。