奇安信威胁情报中心 09月18日
NPM 组件再遭投毒,近 40 个开源项目受影响
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

近期,NPM 生态系统再次发生严重的组件投毒事件,两名知名开发者维护的近 40 个开源组件被植入恶意代码。攻击者通过窃取开发者账户凭证,在 popular 组件如 ngx-bootstrap 中植入混淆的 bundle.js 文件,该文件能在安装时静默窃取系统信息、环境变量及各类 token 密钥。此次攻击手法复杂,巧妙利用了 TruffleHog 等合法工具,并通过 GitHub 仓库进行数据外传。事件紧随另一大规模 NPM 投毒事件,凸显了 NPM 生态系统面临的持续安全威胁。

🔑 **账户凭证窃取与恶意代码植入**:攻击者通过未知手段获取了 valorkin 和 scttcper 两名开发者的 NPM 账户凭证,并利用这些权限向他们维护的近 40 个热门开源组件(包括 ngx-bootstrap、ng2-file-upload 等)发布了包含恶意代码的新版本。这些组件历史总下载量过亿,影响范围广泛。

🕵️ **复杂攻击链与隐蔽技术**:本次攻击采用多阶段攻击链,包括账户凭证窃取、恶意代码植入、通过 `postinstall` 钩子触发执行、信息收集以及通过 GitHub 仓库进行数据外传。攻击者利用约 3MB 的高度混淆 JavaScript 代码(bundle.js)来逃避检测,并巧妙地利用合法工具 TruffleHog 来扫描和窃取受害者系统中的敏感信息,包括各类 token 和密钥,这种“借刀杀人”的方式极具隐蔽性。

🌐 **GitHub 数据外传与生态系统风险**:攻击者设计了一种创新的数据外传机制,将窃取的数据进行双重 base64 编码后,利用受害者系统的 Git 凭证创建新的 GitHub 仓库并推送数据,再通过 webhook 通知攻击者。这种方式绕过了传统的网络连接检测,充分利用了开发者常用的 GitHub 服务作为数据通道。此次事件与近期其他 NPM 投毒事件(如 qix 事件)在时间和攻击模式上的相似性,表明 NPM 生态系统正面临着持续且日益复杂的供应链安全威胁。

🛡️ **防御与应对措施**:为应对此类攻击,建议开发者立即检查并更新受影响组件,启用双因素认证,定期轮换凭证,并使用锁文件固定依赖版本。企业应建立私有 NPM 仓库进行安全审查,实施供应链安全监控,制定应急响应计划,并进行开发环境隔离。同时,开源社区也需加强包管理系统的安全机制建设。

原创 威胁情报中心 2025-09-17 15:15 北京

9月15日,一起严重的NPM组件投毒事件,影响了两位知名开发者维护的近40个开源组件。这次攻击针对开发者valorkin和scttcper的账户进行了凭证窃取,并在他们维护的热门组件中植入了恶意代码。

事件概述

2025 年 9 月 15 日,一起严重的 NPM 组件投毒事件,影响了两位知名开发者维护的近 40 个开源组件。这次攻击针对开发者 valorkin(维护 86 个开源项目)和 scttcper(维护 54 个开源项目)的账户进行了凭证窃取,并在他们维护的热门组件中植入了恶意代码。受影响的组件包括 ngx-bootstrap、ng2-file-upload 和@ctrl/tinycolor 等,这些组件的历史总下载量超过亿次,影响范围极其广泛。

攻击者在组件源码中直接植入混淆恶意文件 bundle.js,其主要功能是在组件安装过程中静默窃取受害者系统平台信息、环境变量数据以及主流业务(包括 NPM、Github、AWS 及 GCP 等)的 token 密钥。这次攻击发生在另一起大规模 NPM 投毒事件(针对开发者 qix 的钓鱼攻击)仅一周之后,表明 NPM 生态系统正面临持续的安全威胁。

技术细节分析

攻击链分析

本次攻击采用了一种复杂而隐蔽的多阶段攻击链,从恶意代码植入到数据窃取外传,形成了一个完整的攻击闭环:

账户凭证窃取阶段:攻击者首先通过未知手段窃取了 valorkin 和 scttcper 两位开发者的 NPM 账户凭证。

恶意代码植入阶段:攻击者利用被盗账户向热门组件发布了包含恶意代码的新版本,如 ngx-bootstrap 的 20.0.6 版本。

触发执行阶段:攻击者在 package.json 中添加了 postinstall 钩子,使得当用户安装这些组件时,自动执行混淆后的 bundle.js 文件。

信息收集阶段:恶意代码会收集受害者的系统平台信息、环境变量数据以及各类敏感 token。

数据窃取外传阶段:将收集到的信息通过创建 GitHub 仓库的方式外传,并通过 webhook 通知攻击者。

混淆恶意代码植入

攻击者在 ngx-bootstrap 20.0.6 版本的 package.json 文件中添加了 postinstall 指令,这是一种常见的供应链攻击技术。当用户通过 npm install 安装该组件时,会自动执行 bundle.js 文件:

{
  "scripts": {
    "postinstall": "node bundle.js"
  }
}

bundle.js 文件包含约 3MB 的高度混淆 JavaScript 代码,这种大体积混淆代码的使用有两个目的:一是逃避安全检测,二是增加分析难度。与 2021 年 11 月 4 日 NPM 仓库中的 coa、rc 软件包被攻击者劫持的事件类似,本次攻击也使用了混淆的 JavaScript 脚本来隐藏恶意行为。不同的是,本次攻击的混淆技术更为先进,bundle.js 文件大小达到约 3MB,远超实际功能所需的代码量。

技术创新点:TruffleHog 工具的恶意利用

本次攻击的一个技术亮点是巧妙利用了一个合法的开源安全工具——TruffleHog。恶意代码会根据受害者的平台环境(如操作系统类型、处理器架构)从 GitHub 上下载对应版本的 TruffleHog 二进制文件,并在受害者系统上执行。

TruffleHog 是一个专门用于搜索高熵字符串和已知模式 token 凭证的工具,攻击者利用它来扫描受害者系统中的敏感信息,包括:

系统平台信息(操作系统、架构等)

环境变量数据

NPM、GitHub、AWS、GCP 等服务的 token 和密钥

这种"借刀杀人"的方式非常隐蔽,因为 TruffleHog 本身是一个合法的安全工具,不会被杀毒软件或安全监控系统标记为恶意程序。TruffleHog 能够识别和解决整个技术堆栈中暴露的机密信息,除了扫描普通文件外,还可以解码数十种编码,包括 base64、zip 文件、docx 文件等,并扫描它们以查找机密信息。

数据外传机制创新

攻击者设计了一个巧妙的数据外传机制,通过以下步骤将窃取的数据传回:

将窃取的敏感数据进行双重 base64 编码,增加检测难度

利用受害者系统上的 Git 凭证创建一个新的 GitHub 仓库

将编码后的数据推送到该仓库中

通过 webhook(https://webhook.site/bb8ca5f6-4175-45d2-b042-fc9ebb8170b7)通知攻击者

这种方法的巧妙之处在于,它不需要建立明显的恶意网络连接,而是利用了开发者日常使用的 GitHub 服务作为数据外传通道,大大降低了被检测的风险。传统的数据外传通常依赖于直接连接到攻击者控制的服务器,这种连接容易被网络安全设备检测和阻止。而本次攻击通过 GitHub 这一开发者经常使用的合法服务进行数据外传,使得恶意流量与正常开发活动难以区分。

失陷指标(IoCs)与影响范围

失陷指标 (IoCs)

受影响的 NPM 包

ngx-bootstrap:

18.1.4

19.0.3

19.0.4

20.0.3

20.0.4

20.0.5

20.0.6

ng2-file-upload:

7.0.2

7.0.3

8.0.1

8.0.2

8.0.3

9.0.1

@ctrl/tinycolor:

4.1.1

4.1.2

其他受影响的@ctrl 前缀包:

@ctrl/deluge@7.2.2

@ctrl/golang-template@1.4.3

@ctrl/magnet-link@4.0.4

@ctrl/ngx-codemirror@7.0.2

@ctrl/ngx-csv@6.0.2

@ctrl/ngx-emoji-mart@9.2.2

@ctrl/ngx-rightclick@4.0.2

@ctrl/qbittorrent@9.7.2

@ctrl/react-adsense@2.0.2

@ctrl/shared-torrent@6.3.2

@ctrl/torrent-file@4.1.2

@ctrl/transmission@7.3.1

@ctrl/ts-base32@4.0.2

其他受影响的包:

angulartics2@14.1.2

encounter-playground@0.0.5

json-rules-engine-simplified@0.2.4

json-rules-engine-simplified@0.2.1

koa2-swagger-ui@5.11.2

@nativescript-community/gesturehandler@2.0.35

@nativescript-community/sentry 4.6.43

@nativescript-community/text@1.6.13

@nativescript-community/ui-collectionview@6.0.6

@nativescript-community/ui-drawer@0.1.30

@nativescript-community/ui-image@4.5.6

@nativescript-community/ui-material-bottomsheet@7.2.72

@nativescript-community/ui-material-core@7.2.76

@nativescript-community/ui-material-core-tabs@7.2.76

ngx-color@10.0.2

ngx-toastr@19.0.2

ngx-trend@8.0.1

react-complaint-image@0.0.35

react-jsonschema-form-conditionals@0.3.21

react-jsonschema-form-extras@1.0.4

rxnt-authentication@0.0.6

rxnt-healthchecks-nestjs@1.0.5

rxnt-kue@1.0.7

swc-plugin-component-annotate@1.9.2

ts-gaussian@3.0.6

恶意文件指标

恶意文件:bundle.js(约 3MB 大小的混淆 JavaScript 代码)

触发机制:package.json 中的 postinstall 脚本

数据外传 URL:https://webhook.site/bb8ca5f6-4175-45d2-b042-fc9ebb8170b7

影响范围分析

直接影响

本次攻击影响了近 40 个开源组件,这些组件的历史总下载量超过亿次。其中最受欢迎的组件 ngx-bootstrap 是 Angular 应用中最流行的 Bootstrap 组件库之一,被大量企业级应用所使用。

受影响的开发者可分为两类:

组件维护者:valorkin 和 scttcper 两位开发者的账户凭证被盗,他们维护的所有项目都面临潜在风险。

组件使用者:使用了受影响版本组件的开发者,其系统中的敏感信息和 token 可能已被窃取。

间接影响

供应链级联效应:由于 NPM 的依赖链特性,一个被感染的基础组件可能会影响数千个下游项目。

凭证滥用风险:攻击者获取的 GitHub、AWS、GCP 等服务的 token 和密钥可能被用于进一步的攻击,形成更大范围的安全事件。

长期安全隐患:即使组件被更新到安全版本,已被窃取的凭证仍然有效,除非用户主动更换。

与 qix 事件的对比分析与归因

qix 事件概述

2025 年 9 月 8 日,即 valorkin 和 scttcper 账户被入侵的一周前,另一位知名开发者 Josh Junon(用户名 qix)的 NPM 账户遭到入侵,导致多个高下载量包(如 debug、chalk 和 supports-color 等)被植入恶意代码。这些受影响的 NPM 包每周总下载量超过 26 亿次。攻击者通过网络钓鱼攻击入侵了 qix 的账户,使用了伪装成合法 npmjs.com 域名的钓鱼网站,威胁称如果维护者不点击链接更新其双重认证,账户将被锁定。恶意代码作为基于浏览器的拦截器被注入到 index.js 文件中,能够劫持网络流量和应用程序 API,监控加密货币地址和交易,并将这些交易重定向到攻击者控制的钱包地址。

两起事件的相似之处

时间接近性:两起事件相隔仅一周时间(9 月 8 日和 9 月 15 日),表明可能是同一攻击者或攻击组织的连续行动。

攻击目标选择:两起事件都针对了维护多个高下载量 NPM 包的知名开发者,表明攻击者有意识地选择影响范围最大的目标。

账户入侵方式:虽然没有公开资料明确说明 valorkin 和 scttcper 的账户是如何被入侵的,但考虑到时间接近性和攻击模式相似性,很可能也是通过类似 qix 事件中使用的钓鱼邮件方式。

供应链攻击模式:两起事件都属于典型的供应链攻击,通过入侵上游开发者账户,向其维护的组件中植入恶意代码,从而影响下游用户。

两起事件的差异

恶意代码功能:qix 事件中的恶意代码主要针对加密货币交易进行监控和劫持,而 valorkin/scttcper 事件中的恶意代码则专注于窃取系统信息和各类服务的 token。

技术复杂度:valorkin/scttcper 事件中使用的技术明显更为复杂,包括利用 TruffleHog 工具、通过 GitHub 仓库进行数据外传等创新手法,而 qix 事件中的恶意代码相对简单。

影响范围:qix 事件影响的组件每周下载量达 26 亿次,而 valorkin/scttcper 事件影响的组件历史总下载量为亿级,虽然规模较小但技术复杂度更高。

归因分析

基于两起事件的相似性和差异性分析,我们可以提出以下归因假设:

同一攻击者或组织:时间接近性和攻击模式相似性强烈暗示这两起事件可能是由同一攻击者或攻击组织实施的。攻击者可能在成功入侵 qix 账户后,立即转向其他高价值目标。

技术能力提升:从 qix 事件到 valorkin/scttcper 事件,恶意代码的技术复杂度明显提升,这可能表明攻击者在不断完善其攻击技术,或者后一次攻击由组织中技术能力更强的成员负责。

目标演变:从针对加密货币交易的监控劫持,到系统信息和 token 的窃取,表明攻击者的目标可能从直接经济利益转向了更深层次的供应链渗透和长期控制。

组织化行动:两起事件的连续性和针对性表明,这很可能是一次有组织、有计划的大规模供应链攻击行动,而非独立的随机事件。

近期 NPM 投毒事件时间轴

近年来,NPM 生态系统遭受了多次重大供应链攻击。以下是从 2021 年至 2025 年的主要 NPM 投毒事件时间轴:

2021 年 10 月 23 日:ua-parser-js 投毒事件

流行的 npm 库 ua-parser-js 被攻击者劫持,其中注入了恶意代码。该恶意代码会窃取 chrome/Firefox/Opera 等浏览器的密码、键盘记录等信息。

2021 年 11 月 4 日:coa 和 rc 投毒事件

流行的 npm 库 coa 和 rc 被攻击者劫持,更新了多个恶意版本。coa 是一个 Node.js 项目的命令行选项解析器,每周下载量约 900 万次,被 GitHub 上近 500 万个开源仓库使用。rc 也是一个流行的配置加载库。这些恶意版本使用了与 ua-parser-js 类似的攻击手法,在受感染的机器上安装了恶意 DLL 文件。

2021 年 12 月 23 日:radar-cms 投毒事件

攻击者在 NPM 官方仓库上传了 radar-cms 恶意包,该包代码和主页完全复制 TypeChain 正常包,可能是为了绕过信誉检查。该恶意包在 package.json 中的 postinstall 字段添加了一段恶意命令,功能是在安装 radar-cms 包时,窃取 kubeconfig 文件,kerberos 凭据,/etc/passwd,/etc/hosts 等敏感文件。

2022 年 1 月:colors 和 faker 库"自毁"事件

两个备受 Node.js 开发者欢迎的 npm 包"colors"和"faker"被其作者故意破坏。作者在这两个软件包中添加了一个无限循环,导致依赖这些包的项目崩溃,以此抗议大公司不为开源社区做贡献的情况。colors 库每周的下载量超过 2000 万次,有近 19000 个项目使用;faker 每周下载量超过 280 万次,有超过 2500 个项目使用。

2022 年 10 月:npm 定时攻击漏洞

安全研究人员发现了一种 npm 定时攻击,它会泄露私有软件包的名称,使攻击者能够基于此公开发布恶意克隆软件包,以欺骗开发者使用它们。该攻击利用在开发者搜索私有软件包时与库中的软件包相匹配时返回"404 Not Found"错误的微小时间差。

2025 年 3 月 25 日:country-currency-map 投毒事件

全球知名薪酬数据统计平台 PayScale 旗下开源 NPM 组件 country-currency-map 遭受供应链投毒攻击。该版本组件代码被投毒者植入混淆的恶意代码,一旦安装该组件则会静默触发执行恶意代码,其主要功能是启动定时器,每隔 5 分钟将受害者系统的环境变量数据发送到投毒者服务器。

2025 年 6 月 6 日:Gluestack 软件包供应链攻击

17 个受欢迎的 Gluestack '@react-native-aria'软件包在 NPM 上受到损害,攻击者在其中植入了充当远程访问木马(RAT)的恶意代码。这些软件包每周下载量超过 100 万次。恶意代码被添加到 index.js 文件的末尾,会连接到攻击者的命令和控制服务器,并执行各种命令,如更改目录、上传文件等。

2025 年 7 月 19 日:"is"库及其他软件包投毒事件

轻量级 JavaScript 实用工具库"is"遭到投毒攻击,每周下载量超过 220 万次。项目维护者 John Harband 收到了一封伪装成 NPMJS 官方的电子邮件,点击链接后被重定向至钓鱼网站,导致账户凭证泄露。攻击者随后修改软件包并植入后门,建立了基于 WebSocket 的通信通道以实现远程代码执行。其他项目如 eslint-config-prettier、synckit、@pkgr/core、napi-postinstall 和 got-fetch 同样遭到入侵。

2025 年 9 月 8 日:史上最大规模 NPM 投毒事件(qix 事件)

攻击者通过网络钓鱼攻击,入侵了 NPM 包维护者 Josh Junon(qix)的账户,并在多个高下载量的 NPM 包中注入了恶意软件。这些受影响的 NPM 包每周总下载量超过 26 亿次,包括极为流行的包如 debug、chalk 和 supports-color 等。

2025 年 9 月 15 日:valorkin 和 scttcper 账户投毒事件(本次事件)

攻击者窃取了开发者 valorkin 和 scttcper 的 NPM 账户凭证,在他们维护的热门组件中植入了恶意代码。受影响的组件包括 ngx-bootstrap、ng2-file-upload 和@ctrl/tinycolor 等,总计涉及近 40 个开源组件项目。

防御建议

针对此类供应链攻击,建议采取以下防御措施:

 对开发者的建议

立即检查并更新受影响组件:使用 npm list ngx-bootstrap 或 npm list -g ngx-bootstrap 检查是否安装了受影响版本,如有则立即回滚到安全版本。

启用双因素认证:为 NPM、GitHub 等账户启用双因素认证,降低账户被盗风险。

定期轮换凭证:定期更换开发环境中使用的各类 token 和密钥,限制潜在泄露的影响范围。

使用锁文件固定依赖版本:使用 package-lock.json 或 yarn.lock 锁定依赖版本,避免自动更新到可能被投毒的新版本。

对企业的建议

建立私有 NPM 仓库:使用 Nexus、Artifactory 等工具建立企业私有 NPM 仓库,对外部包进行安全审查后再引入。

实施供应链安全监控:部署如 OpenSCA-cli 等工具,对项目依赖进行持续安全监控。

制定应急响应计划:针对供应链攻击制定专门的应急响应流程,包括检测、隔离、修复和恢复等步骤。

进行开发环境隔离:将开发环境与生产环境严格隔离,限制开发环境中的凭证权限范围。

等待更新期:考虑在新版本发布后等待约两周时间再进行开源软件包的更新,因为在这段时间内,软件包劫持攻击通常会被察觉到,恶意版本会被移除或修复。

结论与展望

2025 年 9 月 15 日的 NPM 投毒事件是一起技术复杂、影响广泛的供应链攻击。攻击者通过窃取知名开发者账户凭证,在热门组件中植入恶意代码,利用 TruffleHog 等合法工具窃取敏感信息,并通过 GitHub 仓库进行数据外传。这次攻击与 9 月 8 日的 qix 事件在时间和攻击模式上的相似性,强烈暗示可能是同一攻击者或攻击组织所为。

从 2021 年至今,NPM 生态系统已经遭受了多次供应链攻击,攻击手法也在不断演进:从早期的简单恶意代码注入,到如今利用合法工具进行信息窃取的复杂攻击。这一趋势表明,随着开源组件在现代软件开发中的广泛应用,供应链安全已成为不容忽视的关键问题。

特别值得注意的是,近期攻击的技术复杂度和隐蔽性明显提升,攻击者不再满足于简单的破坏性行为,而是转向了精心策划的信息窃取和深层次供应链渗透。这种趋势对开发者和企业提出了更高的安全要求。

未来,我们可能会看到更多针对开源生态系统的供应链攻击,特别是那些下载量大、影响范围广的热门组件。开发者和企业需要提高警惕,采取多层次的防御措施,共同维护开源生态系统的安全。同时,开源社区也需要加强对包管理系统的安全机制建设,如强制双因素认证、改进包发布验证流程等,以减少此类攻击的可能性。

点击阅读原文ALPHA 8.3

即刻助力威胁研判

阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

NPM 组件投毒 供应链攻击 开源安全 ngx-bootstrap 安全漏洞 凭证窃取 NPM component poisoning supply chain attack open source security security vulnerability credential theft
相关文章