做开发这么多年,我们对 npm 的恐惧通常来自于 npm install 那个回车键敲下去的一瞬间——生怕拉下来一个带着挖矿脚本或者勒索病毒的恶意依赖,直接把生产环境给炸了。
01 不求“安装”,只求“托管”
传统的供应链攻击,大都是搞“李逵变李鬼”,比如把包名写错一个字母,坐等开发者手滑安装。
但这次发现的 27 个包,比如 onedrive-verification、secure-docs-app 这种名字,听起来就很“企业级”。然而,黑客压根没指望开发者去下载它们。
他们的玩法是这样的:
- 上传恶意包: 把包含钓鱼页面的 HTML 和 JS 代码打包上传到 npm。
- 白嫖 CDN: 利用 jsDelivr、unpkg 这些公共 CDN 服务。这些服务会自动为 npm 包提供全球分发链接。
- 构造钓鱼链: 黑客给受害者(通常是销售或商务人员)发邮件,链接直接指向 CDN 上的 HTML 文件。
为什么要这么做?
做过运维的兄弟都知道,传统的钓鱼网站域名很容易被封,IP 也很容易被拉黑。
但是,谁会去封杀unpkg.com 或者 jsdelivr.net 呢?
02 细节魔鬼:反爬虫与 AitM 攻击
如果只是托管个静态页面,那技术含量也太低了。让我觉得这帮黑客是“练家子”的,是他们在前端代码里埋下的反分析(Anti-Analysis)逻辑 。
为了防止安全厂商的扫描器和爬虫自动检测到钓鱼页面,他们在 JS 里做了极其猥琐的判断:
1. “蜜罐”表单字段(Honeypot Fields)
他们在页面里藏了一些对人类用户不可见 的表单字段。正常用户看不到自然不会填,但自动化爬虫通常会遍历 DOM 把所有输入框都填满。一旦后端发现这个隐藏字段有值,立马判定为机器人,终止攻击。
2. 活体检测
代码会监听客户端的事件。只有检测到真实的鼠标移动(Mouse movement) 或者触摸操作(Touch input) ,钓鱼脚本才会真正执行,跳转到凭证窃取页面。沙箱环境大概率会在这里挂掉。
3. AitM(中间人攻击)与 Evilginx
研究发现,这些包里的域名与著名的开源网络钓鱼工具包 Evilginx 存在关联。这意味着这不仅仅是一个简单的“高仿”登录页,而是一个 AitM 攻击。它能实时代理受害者和微软服务器之间的流量,甚至能够绕过普通的 MFA(多因素认证),直接截获 Session Cookie。
03 甚至还是“定点爆破”
这还不是最骚的。研究人员在分析源码时发现,代码里竟然硬编码了 25 个具体的电子邮件地址 !
这些目标主要分布在奥地利、德国、英国、美国等地的制造业、工业自动化和医疗行业。而且,针对的不是我们要这种搞 IT 的“苦逼”,而是客户经理、销售代表和业务拓展人员 。
为什么是销售?
因为销售人员通常需要频繁接收外部文件(发票、合同、图纸),警惕性相对较低。黑客可能是通过爬取大型国际展会(如 Interpack)的参展商名单,结合社工库,精准定位了这些“肥羊”。
04 这种“寄生”正在成为趋势
其实,利用包管理器做基础设施并不是第一次了。但现在的趋势是,恶意包越来越**“外科手术式”** 精准:
不再无脑破坏(加密勒索),而是定向窃取 Git 配置、CI 构建产物;甚至延迟执行,利用 setTimeout 躲过早期的静态分析。
最后:我们能做什么?
作为技术人员,这种攻击给我们敲响了警钟。虽然这次受害者主要是非技术人员,但作为企业的安全守门人,我们需要意识到:
- CDN 请求日志是盲区:检查一下公司的流量日志,有没有非开发部门的设备频繁请求
npm相关的 CDN 域名?这本身就很反常。 - 供应链信任需重估:既然 npm 可以被滥用,PyPI、NuGet 也是同理。
- MFA 不是万能药:面对 AitM 攻击,普通的短信验证码或 App 确认是不够的,有条件的企业应该考虑上 FIDO2 硬件密钥。
技术在进步,黑客也在进化。 以前我们防的是“安装”,现在还得防“访问”。各位老铁,守好你们的网关,这场仗是越来越难打了。
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)



