NPM 钓鱼攻击后续技术分析报告
一、事件概述
1. 事件背景
2025 年 9 月 9 日,SEAL 及多家安全厂商披露了一起被称作"历史上最大规模的(失败)供应链攻击"事件。攻击者通过精心设计的钓鱼攻击,试图获取 NPM 发布者凭证并植入恶意代码。所幸,攻击者似乎浪费了其访问权限,仅获利约 1000 美元,同时暴露了其攻击模式和基础设施。
2. 影响范围
A. 潜在影响
- 数百万台计算机可能暴露于恶意代码
- NPM 生态系统的供应链安全受到威胁
- 区块链用户的账户安全面临风险
B. 实际影响
- 攻击基本失败,未造成大规模破坏
- 攻击者获利极有限(约 1000 美元)
- 攻击基础设施和模式被完全曝光
3. 严重程度
中等级别(潜在影响高,实际影响低)
二、事件时间线
1. 攻击基础设施准备(2025 年 6 月 - 8 月)
A. 域名注册时间线
- 2025-06-26:
walleting.services注册 - 2025-07-02:
2hy.xyz注册 - 2025-08-26:
npmjs.cam注册(注意 TLD 差异) - 2025-09-05:
npmjs.help注册(主要攻击域名)
B. 基础设施部署
攻击者使用不同的托管商和域名注册商,分散基础设施以提高存活率
2. 钓鱼攻击实施阶段
A. 针对 Hyperliquid(2025 年 8 月底)
- 使用
2hy.xyz和walleting.services组合 - 伪装成合法的 Hyperliquid 交易平台
- 试图窃取用户凭证并转移资金
B. 针对 NPM(2025 年 9 月初)
- 使用
npmjs.help进行钓鱼攻击 - 目标是获取 NPM 发布者凭证
- 试图添加攻击者控制的 API 密钥
3. 攻击暴露与分析(2025 年 9 月 9 日后)
A. 安全厂商披露
SEAL 和多家安全厂商发布分析报告
B. 基础设施追踪
通过追踪 npmjs.help 域名的痕迹数据,发现相关联的攻击基础设施
graph TD
subgraph 攻击时间线
A[2025-06-26<br/>walleting.services 注册] --> B[2025-07-02<br/>2hy.xyz 注册]
B --> C[2025-08-26<br/>npmjs.cam 注册]
C --> D[2025-08-27 至 09-01<br/>npmjs.cam 攻击活动]
D --> E[2025-09-05<br/>npmjs.help 注册]
E --> F[2025-09-09<br/>攻击被披露]
end三、问题分析
1. 直接原因
攻击者使用高度相似的混淆 JavaScript 函数和钓鱼基础设施,针对多个目标实施持久性钓鱼攻击
2. 根本原因分析
A. 为什么 NPM 成为攻击目标?
- NPM 注册表通过
npm view命令极易获取发布者邮箱 - 相比 PyPI、Cargo 等其他包管理器,NPM 暴露了更多用户信息
- 这为攻击者提供了精确的目标定位信号
B. 为什么攻击失败?
- 攻击者更专注于钓鱼而非恶意软件部署
- 缺乏恶意软件操作经验
- 攻击基础设施分散,缺乏协调
C. 攻击者的真实意图?
- 主要目标是凭证窃取而非恶意软件传播
- 专注于加密货币用户群体
- 可能同时运营多个未被发现的钓鱼活动
3. 深层反思
- 供应链安全需要更加严格的身份验证机制
- 包管理器应重新考虑用户信息的暴露策略
- 开发者安全意识培训至关重要
四、攻击技术分析
1. 钓鱼技术
A. iframe 加载技术
所有攻击都使用 iframe 加载合法网站内容,创造逼真的钓鱼页面
B. JavaScript 注入
通过恶意 JavaScript 代码注入,实现:
- 凭证窃取
- 2FA 令牌获取
- 自动化操作模拟
C. 混淆技术
使用相同的混淆服务对 JavaScript 代码进行混淆,使检测更加困难
2. 攻击基础设施关联分析
graph LR
subgraph NPM 攻击链
A1[npmjs.cam<br/>91.202.5.162] --> A2[npmjs.help<br/>相同基础设施]
end
subgraph Hyperliquid 攻击链
B1[2hy.xyz<br/>91.202.5.162] --> B2[walleting.services<br/>65.108.111.55]
end
A1 -.共享混淆服务.-> B1
A1 -.相同 IP.-> B1
C[攻击者控制] --> A1
C --> B1
style A1 fill:#ff9999
style A2 fill:#ff9999
style B1 fill:#ff9999
style B2 fill:#ff99993. Hyperliquid 钓鱼攻击详细流程
sequenceDiagram
participant U as 用户
participant P as 钓鱼站点<br/>2hy.xyz
participant I as 恶意脚本<br/>walleting.services
participant H as 合法站点<br/>Hyperliquid
U->>P: 输入凭证
P->>H: 通过 iframe 加载合法页面
H-->>P: 返回页面内容
P->>I: 注入恶意 JavaScript
I->>I: 检查 "Deposit" 文本
I->>I: 监控 URL 中的 'cotton' 参数
I->>H: 模拟点击和输入
Note over I,H: 设置钱包地址:<br/>0xbcc6...6649
I->>H: 触发事件处理
H-->>U: 显示转账页面4. 攻击脚本功能分析
A. npmjs.help 攻击脚本
- 窃取 2FA 访问令牌
- 添加攻击者控制的 API 密钥
- 允许恶意软件包发布
B. 2hy.xyz 攻击脚本
- 完全替换合法内容
- 检测"Deposit"文本元素
- 自动化模拟用户操作
- 设置攻击者钱包地址:
0xbcc605314a9434855ed7C7a6C3c03b89FC966649 - 使用 sleep 函数模拟人类行为
五、解决方案
1. 临时方案(已实施)
A. 域名查封
- 恶意域名已被识别和查封
- 相关托管服务已下线
B. 威胁情报共享
- 发布 IOC(入侵指标)清单
- 与安全社区共享分析结果
2. 永久方案
A. NPM 发布流程加固
- 定期清理不活跃的维护者账户
- 限制访问权限范围
- 使用公司控制账户进行发布
B. 域名白名单机制
- 仅接受来自
npmjs.com或npmjs.org的通知 - 警惕
npmjs.help、npmjs.cam等相似域名
C. 开发者安全培训
- 识别钓鱼攻击特征
- 验证域名真实性
- 警惕凭证请求
3. 预防措施
A. 包管理器层面
- 重新评估用户信息暴露策略
- 实施更严格的身份验证
- 提供匿名化选项
B. 企业层面
- 建立发布管道安全审查机制
- 使用公司控制账户进行关键操作
- 定期审计维护者列表
C. 个人层面
- 启用 2FA/MFA
- 使用专用邮箱用于开发活动
- 定期审查账户权限
六、经验总结
1. 做得好的地方
- 安全厂商快速响应和分析
- 攻击者模式被成功识别
- 威胁情报有效共享
2. 需要改进的地方
- NPM 注册表的信息暴露策略
- 开发者安全意识培训
- 包管理器的安全审查机制
3. 行业启示
- 供应链安全是持续挑战
- 攻击者会不断调整战术
- 需要多层次的防御策略
七、入侵指标(IOC)
1. 恶意域名
| 域名 | 注册时间 | IP 地址 |
|---|---|---|
| npmjs.cam | 2025-08-26 | 91.202.5.162 |
| 2hy.xyz | 2025-07-02 | 91.202.5.162 |
| walleting.services | 2025-06-26 | 65.108.111.55 |
| npmjs.help | 2025-09-05 | (已下线) |
2. 恶意钱包地址
0xbcc605314a9434855ed7C7a6C3c03b89FC966649
3. 攻击特征
- 使用相同的 JavaScript 混淆服务
- iframe 加载合法网站内容
- 针对加密货币用户群体
- 使用 sleep 函数模拟人类行为