新型NPM包利用QR码获取Cookie的恶意软件
字数 2515 2025-10-14 00:33:59
教学文档:新型恶意NPM包“fezbox”攻击链深度分析
文档概述
本文档旨在深度剖析一种新型的网络攻击手法。该手法结合了恶意开源软件包(NPM)、QR码隐写术 和反向字符串混淆 等技术,实现了对用户Cookie等敏感信息的窃取。攻击样本为名为“fezbox”的NPM包。本文将从攻击流程、技术细节、创新点及防御建议四个方面进行详尽阐述。
一、 攻击流程总览
整个攻击链是一个多阶段(Multi-stage)过程,环环相扣,旨在规避安全检测。
- 投毒阶段:攻击者将恶意包“fezbox”发布到官方NPM仓库,并伪装成实用的工具库。
- 分发与感染:用户(开发者)在不知情的情况下下载并安装了该恶意包(累计下载327次)。当包含该包的应用程序运行时,恶意代码被激活。
- 环境检测:恶意代码首先检测自身是否运行在开发环境中。这是一种反分析、反沙箱的规避技术。
- 载荷获取:如果不在开发环境,代码会从一个经过混淆的URL下载一张包含高密度QR码的JPG图片。
- 载荷解析与执行:恶意包内置了解析功能,能够从QR码中提取出第二阶段的、经过混淆的恶意JavaScript代码。
- 数据窃取与外传:第二阶段的代码窃取用户的Cookie、用户名和密码,并通过HTTPS POST请求将数据发送到攻击者控制的服务器(C2)。
二、 关键技术细节分解
1. 恶意包与初始载荷
- 载体: NPM包
fezbox,版本1.3.0。 - 恶意代码位置: 位于包内的
dist/fezbox.cjs文件中。 - 代码混淆: 初始代码经过压缩,但格式化后可读性增强,表明攻击者并未使用高强度加密,重点在于后续的隐蔽性。
2. 环境检测规避技术
- 目的: 避免在安全研究人员、沙箱或测试环境中暴露恶意行为。
- 实现: 代码中包含条件判断语句,检查
process.env.NODE_ENV等环境变量。只有当应用运行在生产环境时,恶意载荷才会在延迟120秒后触发,增加了被发现和分析的难度。
3. 字符串反向混淆
- 目的: 绕过基于正则表达式或静态分析的自动化安全扫描工具。这些工具通常会查找以
http://或https://开头的明显恶意URL。 - 实例: 代码中存储的字符串
"ffe7cdb1b812207f702f07671c18c25b/v676757112qerutca/egami/moc.yraniduolc.ser//:sptth"反转后才是真实的URL:- 反转后URL:
hxxps://res[.]cloudinary[.]com/dhuenbqsq/image/upload/v1755767716/b52c81c176720f07f702218b1bdc7eff_h7f6pn.jpg
- 反转后URL:
- 同样技术用于关键字: 在第二阶段代码中,关键字如
password被反向存储为drowssap,以躲避简单的字符串匹配。
4. QR码作为隐写术载体
- 传统隐写术: 将信息隐藏于图片的像素数据、文件元数据等不易察觉的位置。
- 本攻击的创新:
- 高密度QR码: 攻击者专门生成了一个数据承载量远超普通二维码的高密度QR码,普通手机摄像头难以识别,旨在仅供机器(恶意代码)解析,而非人类。
- 隐蔽通信信道: 从网络流量角度看,受感染设备只是向一个合法的图片托管服务(如Cloudinary)发起了一个普通的图片下载请求。这种流量极易被误判为正常业务流量,从而绕过网络代理和防火墙的检测。
5. 第二阶段载荷与数据窃取
- 功能: 从QR码中解析出的JavaScript代码专门用于窃取浏览器环境中的敏感数据。
- 窃取目标:
document.cookie: 获取会话Cookie,可能直接导致账户劫持。username和password: 尝试窃取表单中的用户名和密码字段。
- 数据外传:
- C2服务器:
https://my-nest-app-production[.]up[.]railway[.]app/users - 条件触发: 仅在成功窃取到用户名和密码后,才通过HTTPS POST请求发送数据。否则静默退出,减少不必要的网络活动以降低暴露风险。
- C2服务器:
三、 攻击的创新点与演变趋势
- 自动化QR码滥用: 与传统需要人工扫描二维码的社会工程学攻击不同,此攻击实现了设备到QR码再到C2的全程自动化通信,无需用户交互,效率更高,更隐蔽。
- 供应链攻击的精细化: 攻击目标直接指向软件供应链(NPM)。利用开源生态的信任,通过一个看似正常的依赖包作为攻击起点。
- 隐蔽通信模式: 将C2指令隐藏在QR码中,并通过图片CDN进行传输,为传统的C2通信提供了一种新的、难以被察觉的伪装形式。
四、 防御与缓解建议
针对开发人员与组织:
-
软件供应链安全:
- 依赖项审计: 在引入任何第三方库前,使用自动化工具(如Socket, Snyk, npm audit)对包进行安全扫描,分析其行为模式(网络访问、文件操作等)。
- 最小权限原则: 定期审查
package.json,移除不必要的依赖。 - 依赖锁定: 使用
package-lock.json或yarn.lock锁定依赖版本,防止恶意更新被自动引入。
-
运行时保护:
- 安全监控: 在生产环境中部署安全监控方案,检测异常的出站网络连接(尤其是向未知域名或图片CDN发送敏感数据的请求)。
- 代码审查: 对关键应用的第三方依赖代码进行定期或抽样审查。
-
纵深防御:
- 网络层过滤: 虽然HTTPS流量内容不可见,但防火墙或代理可以基于目标域名进行过滤和告警。
- 保持更新: 及时更新所有软件和依赖,以便在恶意包被曝光后能及时从项目中移除。
总结
“fezbox”恶意包事件清晰地展示了现代网络攻击的复杂性和隐蔽性。攻击者正不断融合多种技术(供应链攻击、混淆、隐写术)来绕过传统防御措施。防御方必须采取一种多层次、纵深防御的安全策略,尤其要重视软件供应链的安全管理,才能有效应对此类高级威胁。