forge-jsxy npm 信息窃取器:IOC 和检测指南

forge-jsxy:不断更改名称的 npm 信息窃取工具

TL博士

大约 2个月一个 npm 信息窃取程序以一系列轮换的包名再次出现,但其有效载荷几乎未作更改。它最初是公开的。 forge-jsxy,已生成 forge-jsx3 / forge-jsx4 兄妹俩随后完全放弃了“forge”品牌,转而伪装成开发者基础设施——首先 zredis-typed最近, pinokio-redis.

每个变体都带有 相同的内部工具链: 名为 forge-jsx-explorer-*,以 relayPackageServe 服务于一个模块 forge-jsxy-package.tgz并且,它还包含一个隐藏在点目录下的持久运行时,即使 npm 包被删除,它也能继续运行。

有效载荷读取 加密货币钱包材料 并从主机获取开发者凭证,然后将其传输到 Discord 网页版。hooks它支持 HuggingFace Hub 上传,并内置了一个 C2 端点。它会安装操作系统级别的自动启动项,以便在重启后再次运行,并捕获剪贴板、键盘和屏幕活动。最新版本是…… pinokio-redis它自称是“Autodesk Forge”集成——这种描述与代码的实际功能无关。

生态系统NPM
有效载荷等级多阶段信息窃取程序 + 远程控制代理 (RAT)
主要目标加密钱包、浏览器钱包扩展程序、开发者/云凭证
坚持隐藏的持久运行时 + 操作系统自动启动(即使软件包被删除仍然存在)
渗出不和谐网络hooks + 中继,HuggingFace Hub,端口 9877 上硬编码 C2
观测跨度2026年5月至2026年7月(持续进行中)
最新名称pinokio-redis:1.0.127

攻击解剖

该系列的所有变体都通过相同的包装进行安装。 它在其列表页面上看起来没有任何作用,但实际上声明了一个安装后钩子,所以 有效载荷会在软件包作为依赖项安装后立即运行。 钩子驱动五级链条。

  • 第一阶段——实体化。 安装脚本会解码捆绑的、编码后的文件。 将 blob 转换为一组运行时脚本,并将它们写入平台配置位置下的一个隐藏目录(forge-jsxy 版本使用点号 .forge-jsxy/runtime/v)。 / 路径)。因为此副本位于 node_modules 之外,所以删除或取消发布 npm 包不会删除正在运行的代理。
  • 第二阶段——坚持。 该链会注册一个操作系统自启动项,以便代理程序在重启后重新启动。在 Windows 系统中,此过程通过一个隐藏的 PowerShell 诊断脚本运行;代理程序进程以分离模式启动,并设置了 windowsHide 属性,因此不会显示任何控制台窗口。
  • 第三阶段——逃避。 运行时会检查持续集成标记,并在检测到 CI 环境时静默退出,因此自动化构建沙箱不会看到任何内容。在 forge-jsxy 版本中,源代码注释指出,package.json 中故意省略了 forgeInstall 字段,“因为该字段在 npm 上是可见的”——开发人员有意将触发元数据隐藏在公共列表中。
  • 第四阶段——收集。 代理程序一旦运行,即可一次性完成数据采集:
  1. 加密钱包素材。 捆绑的 secret_filename_patterns.json 目标列表会驱动文件系统扫描,查找 wallet.dat、*.mnemonic 等文件。.seed / *.phrase 文件、keypair.json、以太坊 UTC– 密钥库,以及 *.p12 / *.pfx / *.jks 密钥库。软件包中包含钱包派生库(bip39、secp256k1、base58check 和 Solana 辅助程序)。
  2. 浏览器钱包扩展程序。 chromiumExtensionDbHarvest 模块读取 Chromium 浏览器的本地扩展存储数据库,浏览器钱包扩展程序将其保险库数据保存在该位置。
  3. 凭证和秘密。 该代理扫描 shell 历史记录和包含秘密的文件,读取开发者/云凭据,然后对 HuggingFace 凭据进行编码以进行上传。
  4. 实时输入。 剪贴板内容、键盘输入和屏幕截图会被持续捕获。
  • 第五阶段——撤离收集到的数据通过三个途径离开主机。 并行运行的频道:Discord 网页版hooks (discordWebhookPost) 一个与“通信的 Discord 中继上传器”discord.com/api/v10` (discordRelayUpload)、HuggingFace Hub 上传(hfUpload)以及一个 通过端口 9877 连接到硬编码的 C2 端点。中继包服务 此外,该模块还会提供一个 forge-jsxy-package.tgz 文件作为输出——相同 每次重命名时都会使用相同的工件名称。

重要的结构要点是,阶段 1-3 在安装时运行。 无需用户交互,第一阶段将有效载荷放置在包裹的某个位置。 经理没有跟踪。一位注意到奇怪依赖关系的开发人员和 运行 npm uninstall 会删除列表,但不会删除代理。

有效载荷也难以快速读取。运行时脚本未随附。 明确一点:编码部署步骤将操作逻辑保留为一个 编码后的数据块,只有在安装链完成后才会展开成可读脚本。 将其解码到隐藏的运行时目录中。可见的文件 清单上——薄的安装后垫片和分布式物质化 辅助程序——很少透露最终运行的内容。这种编码交付 设计对分诊产生了可衡量的影响:在家庭的整个生命周期中, 多个已确认的变异株经自动分类评定为安全, 而且有效载荷非常不透明,以至于直接阻碍了自动审查。 只有在编码之后,那些暴露家庭身份的行为才会显现出来。 阶段已扩展,运行时直接读取。

时间线

该家庭的有效载荷一直保持着惊人的稳定性;发生变化的是…… 盒子上的名称。弧线从开放式的“锻造”品牌标识延伸至 伪装成无关的开发者工具。

日期 (2026) 软件包:版本 注意:
五月(初) forge-jsxy:1.0.81, :1.0.90 最早确认的变种——采用 AES-256-GCM 加密的 C2 的 RAT
19 年 5 月 forge-jsxy:1.0.92 / 1.0.105 / 1.0.107 / 1.0.108 活动正在进行中;1.0.92 版本最初被错误地标记为安全,在代码重新审查后已撤销。
五月下旬 forge-jsx3 / forge-jsx4:1.0.122 / 1.0.123, zod-pino 同级软件包名称,相同的工具链
4年XNUMX月 forge-jsxy:1.0.120 继续;机器学习模型判定为安全(未命中)
6月21日至23日 forge-jsxy:1.0.121 模块集与 1.0.120 版本相比没有变化
6年XNUMX月 zredis-typed:1.0.127 名称中去掉了“锻造”一词;仍然有船只运输。 forge-jsxy-package.tgzforgeAgent* 配置键
7年XNUMX月 pinokio-redis:1.0.127 相同的工具链;新的 C2;自称是“Autodesk Forge”集成

纵观整个时间线,有两点尤为突出。首先,zredis-typed 和 pinokio-redis 都直接使用了版本号 1.0.127——虽然命名方式有所不同,但构建历史并未重置。其次,从“forge-*”命名方式的转变,与转向更易于理解的、更贴近普通基础设施名称(如 redis、pinokio)的命名方式相吻合,这降低了开发者仅凭名称就犹豫不决的可能性。

妥协指标

以下 IOC 已被禁用。C2 主机在 forge-jsxy 系列之间轮换。 以及在保持相同端口的情况下推出的最新版本。

指示符 价值 出现在
C2 终点 212.193.3[.]61:9877 pinokio-redis:1.0.127
C2 终点 79.108.162[.]160:9877 forge-jsxy 行, zredis-typed:1.0.127
撤离通道 discord.com/api/webhooks/… (webhook 帖子) 所有变体
撤离通道 discord.com/api/v10 (中继上传) 所有变体
撤离通道 HuggingFace Hub 上传 所有变体
已上架的文物 forge-jsxy-package.tgz (通过 relayPackageServe) 所有变体
工具链文件 chromiumExtensionDbHarvest, discordRelayUpload, discordWebhookPost, hfUpload, encode-hf-credentials, forge-jsx-explorer-* 所有变体
目标列表 secret_filename_patterns.json (wallet.dat, .mnemonic/.seed/.phrase, keypair.json, UTC--, .p12/.pfx/*.jks) 所有变体
隐藏运行时 虚线 …/.forge-jsxy/runtime/v<version>/ 配置目录路径 forge-jsxy 线
Windows 持久性 隐藏的 PowerShell “forge diagnostics” 自动启动脚本 所有变体
安装触发器 安装后钩子调用 dist-materialization 脚本链 所有变体

最持久的检测信号并非任何单个主机或 webhook——而是那些 旋转——但工具链文件名和 forge-jsxy-package.tgz 这些内容在每次更名后都原封不动地保留了下来。

归因与观察行为

这些软件包以多个 npm 帐户发布。forge-jsxy 行使用了发布者 jacksonkaandorp2 (jacksonkaandorp2@outlook[.]com); 最新的 pinokio-redis 变体由 donimique 发布。 (donimiqueakers@gmail[.]com)。这两个账户都没有经过验证的电子邮件或 一个关联的源代码库。贯穿所有账户的线索是…… 工具链,而不是发布者身份——相同的模块名称,相同的 提供的 .tgz 文件,无论发布者是谁,都会重复使用相同的导出设计。

一些可观察到的行为表明这是故意隐瞒,而不是…… 意外过度收集:

运行时环境位于 node_modules 目录之外的一个隐藏目录中,因此它的生命周期比提供它的软件包更长。

当检测到 CI 环境时,代理程序会退出,从而限制其在自动化分析沙箱中的暴露。

代理进程以分离方式启动, 隐藏窗口。 在 forge-jsxy 版本中,一条评论将缺少可见的安装字段与该字段“在 npm 上可见”联系起来。

公开的软件包描述与代码无关——pinokio-redis 显示为“Autodesk Forge”集成。

对于依赖以下技术的防御者来说,一个反复出现的检测漏洞值得注意: 自动分类:该家族中存在多个已确认的变异体 在代码审查修正之前,机器学习分类器将其评为安全。 结论。评论者可以依据的稳定因素——安装时间 链、隐藏的运行时、工具链文件名——正是这些。 更名后保留下来的那些。

我们将上述行为描述为观察到的行为。我们不将其归因于…… 我们不会针对任何特定演员发起活动,并且我们不对运营商的任何行为做出任何声明。 超出代码和基础设施所展现的身份或目标。

谁会被曝光? 该合集的目标用户群体明确为开发者。 设备:加密货币钱包和密钥库、浏览器钱包扩展程序、 shell 历史记录和云/服务凭据。任何安装 受影响的包裹——直接或作为 传递依赖 — 在 窗口处于活动状态仍在考虑范围内,持久化设计意味着 即使包装被移除,暴露过程也不会结束。

为什么坚持很重要。 因为第一阶段将有效载荷复制到 隐藏的运行时目录和阶段 2 注册自动启动,这是通常的做法。 补救措施本能(卸载有问题的依赖项,删除 node_modules, 重新安装)不会移除代理。事件响应人员必须查找…… 不仅是软件包,还包括外部运行时和自动启动项。

这种趋势。 这个家庭展现了一种值得关注的模式: 一种稳定且成熟的有效载荷,被包裹在一连串一次性包装中。软件包名称会迁移,不再使用之前被下架时使用的任何名称。 易于识别,朝着读起来像普通基础设施的名称发展。基于名称 屏蔽列表和发行商信誉很快就会失效;行为- 而基于伪影的信号则不然。

对于开发者和消费者

将安装时脚本视为主要风险面。尽可能禁用脚本进行安装,并审查任何声明了脚本的依赖项。 安装后。 锁定并审查传递依赖关系;这类恶意软件既可以通过子依赖关系传播,也可以通过直接依赖关系传播。

在可疑主机上,要超越软件包本身进行查找:在平台配置位置查找隐藏的运行时目录、意外的自动启动项, 以及与 Discord webhook 或 :9877 端点的出站连接。

假设在暴露窗口期间受影响主机上存在的任何钱包助记词、密钥库或凭证均已泄露,并进行轮换。

对于注册机构和辩护者

持久化工件(forge-jsxy-package.tgz、forge-jsx-explorer-* / chromiumExtensionDbHarvest / discordRelayUpload)发出警报 文件名)而不是包名,包名会发生变化。

标记该家族所依赖的结构组合——安装后将脚本具体化到一个隐藏的配置目录路径以及一个操作系统。 自动启动注册——与所涉及的具体字符串无关。

包装上的名字至少改了四次;里面的箱子 并没有。基于代码行为的检测机制已经超越了所有…… 目前为止,标签已全部重新贴好。

sca-tools-软件-成分分析工具
确定软件风险的优先级、进行补救并加以保护
注册免费账号。
不需要信用卡。

保护您的软件开发和交付

使用 Xygeni 产品套件