joyfill npm包被植入区块链RAT,导入即触发。攻击者通过Tron、BSC等区块链链上交易下发恶意载荷,规避静态检测。恶意代码主动跳过CI和沙箱环境,定向攻击开发者机器,窃取浏览器数据、Git凭证、系统凭据等敏感信息。
网络安全领域深耕几十年,每日分享当下最新网络安全事件,喜欢的朋友可以点点关注~
又一起 npm 供应链投毒。这次不是 lifecycle hook,不是 postinstall 脚本,而是直接在包入口被 Node.js 加载时触发——只要 require() 或 import 这两个包,恶意代码就在你的进程里跑起来。
攻击链:区块链 C2 + 双分支并行执行
开发者引入 @joyfill/layouts 或 @joyfill/components(受影响 beta 版本)
→ Node.js 加载包入口 → 恶意 JS implant 立即执行
│
├── 分支 A:进程内执行
│ → 查询 Tron 链硬编码地址的最新交易
│ → 从交易 payload 中解密提取 JS 代码
│ → 执行 77KB "clientCode" loader(关联 DEV#POPPER 家族)
│
└── 分支 B:独立 Node.js 进程( detached,分叉执行)
→ 向 23.27.13[.]43 请求 boot payload
→ 解密响应内容 → eval 执行
→ 该进程不依赖引入包的父进程,可在构建/CI/CLI 退出后持续运行
→ 最终 payload:"clientCode" RAT
→ 建立 Socket.IO 远控通道
→ 上传文件、读取剪贴板、执行任意 JS/shell 命令
触发条件:不是 npm script、不是 postinstall——就是最普通的 require('@joyfill/layouts')。
关键特征:区块链 C2 是这次的核心
Tron + Aptos + BNB Smart Chain 三链联动来获取控制指令:
-
攻击者预先向 Tron 硬编码地址转入一笔交易(交易备注/payload 包含加密的 JS 代码) -
implant 查询该地址最新交易,从交易中解密出 BNB Smart Chain 交易哈希 -
用哈希从 BSC 链提取真正的 payload,解密后执行
为什么用区块链 C2: payload 不存储在包本身,不存储在任何静态服务器,而是嵌入链上交易——传统的静态 IOC 检测完全失效。攻击者可以随时在链上替换 payload 而无需重新发布 npm 包。
避开 CI/沙箱检测
恶意代码会主动检查运行环境,刻意跳过以下环境:
github-runner、buildbot、buildkitsandbox、microsoft-standard-WSL2
只攻击真实开发者机器。CI runner 和沙箱逃过一劫——不是防御有效,是攻击者有意为之。
窃取范围:开发者凭证全覆盖
“clientCode” RAT + Python infostealer(OmniStealer 迭代版)双 payload 组合:
- 系统信息
:主机名、IP、用户名、进程列表 - 浏览器数据
:Chromium/Firefox Cookie、密码、扩展存储(特别是钱包和密码管理器扩展) - Git 凭证
:Git 凭据、GitHub CLI 配置、GitHub Desktop 日志 - VS Code 存储
:工作区数据、扩展配置 - 系统凭据
:Windows Credential Manager、Linux Secret Service - 剪贴板
:Windows PowerShell / macOS pbpaste / Linux xclip/xsel
受影响包
@joyfill/[email protected]
@joyfill/[email protected]
均为 beta 版(攻击者专门选 beta 版投毒,版本号含 2773 特征),发布者使用 Node.js 18.20.0 + npm 10.5.0。npm 已下架,但内网镜像、CI 构建镜像、npm cache 中可能仍有残留。
关联:ViteVenom 同属一个行动
Socket 确认:本次 joyfill 投毒与本月初 Checkmarx 披露的 ViteVenom 恶意包系列同属朝鲜 APT 行动,关联威胁集群为 PolinRDriver(曾参与 Contagious Interview 求职陷阱)。PolinRDriver 使用相同的 Tron/Aptos/BSC 三链 C2 结构。
IOC
C2 IP:23.27.13.43
受影响包:@joyfill/[email protected]、@joyfill/[email protected]
链标识:Tron 硬编码地址(具体地址详见 Socket.dev 原始报告)
防御建议
① 立即全量审查依赖树
对所有使用 joyfill 的项目执行以下操作:
# 检查 lockfile 中是否含受影响版本
npm ls @joyfill/layouts
npm ls @joyfill/components
# 删除本地缓存
npm cache clean --force
# 如项目 node_modules 中有受影响版本,立即全删重装
rm -rf node_modules
rm package-lock.json
npm install
→ 亚信安全 TDA 可检测 Node.js 进程异常外连 23.27.13[.]43 的区块链 API 请求和 Tron/Aptos/BSC 节点访问。
② 清除 CI/CD 镜像和内网 npm 镜像中的残留
受影响版本可能在构建 Docker 镜像或内网 npmirror 中仍存在。从所有构建制品、CI 缓存、Docker 镜像中彻底删除;重新构建干净镜像并打上"不含 joyfill beta"的签名标签。
→ 弘积 SuperTD 具备 CI/CD 管道行为监控能力,可识别 npm install 阶段异常网络行为(链上 C2 请求)。
③ 轮换开发环境所有凭证
由于恶意软件专门窃取 Git 凭据和 GitHub CLI 配置,假定开发者机器已被访问。立即执行:
# GitHub:撤销所有 Personal Access Token,审查"SSH 金钥"列表
# 本地 Git:git config --global --unset credential.helper(临时)
# IDE:VS Code 相关存储目录需清理
# 浏览器:检查加密货币钱包扩展是否被访问
→ 科力锐数据保护平台提供开发环境快照备份,支持在清理后从干净快照恢复开发环境。
④ 引入 npm 安全管控机制
在 package.json 中明确固定非 beta 版本的精确版本号;使用 npm audit 或 Socket CLI 对引入包进行自动化扫描;对 beta/rc 版本引入实施额外审批流程。
→ Trellix Endpoint Security 可监控 Node.js 进程的异常行为(子进程派生、clipboard 访问、非预期网络出站)。
npm 供应链投毒的进化路线已经很清楚了:最早的恶意 postinstall 脚本 → npm lifecycle hook 劫持 → 这次直接做进包的 JS 入口逻辑。
区块链 C2 让这轮攻击更难检测:payload 从来不躺在攻击者控制的服务器上,而是嵌在 Tron 链的交易里,地址哈希换一下就能热更新 payload,npm 包本身完全不变。
对于企业安全来说,开发者机器就是边界——一台被 joyfill RAT 感染的开发者笔记本,GitHub 密钥、AWS 凭证、公司内网 VPN 配置全在攻击者手里。
网络安全领域深耕几十年,每日分享当下最新网络安全事件,喜欢的朋友可以点点关注~
原文始发于微信公众号(北京东方趋势科技发展中心):joyfill npm 包被植入区块链 RAT:导入即触发,朝鲜黑客借 npm 供应链投毒
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-


评论