代理推荐了那个恶意软件
Island 发现了 FakeGit:约 7,600 个恶意 GitHub 仓库,其中逾 800 个假冒 AI skill 与 MCP 服务器,散播一个名为 SmartLoader 的 Windows 加载器,用以安装 StealC 信息窃取程序。新的地方在于投递手法 AgentBaiting——Claude Code、Gemini 与 ChatGPT 会自行找到这些仓库,把攻击者的 README 当作文档来读,并把安装步骤递给你。在一次测试中,Claude Code 自己克隆了仓库并执行了文件。Bromure Agentic Coding 让从推荐到执行的整条路径都跑在一台用完即弃的 Linux 虚拟机里,在那里 Windows 加载器毫无作用,能偷的凭据只有诱饵。
你让你的代码代理去找一个 skill。它搜索了,读了一份看起来像文档的 README, 然后叫你下载一个 ZIP 并执行它。没有人给你发过一条坏链接。是代理自己找到了 恶意软件并加以推荐——而且在一次测试运行中,它克隆了仓库,替你执行了那些 文件。
2026 年 7 月 21 日,Island 发布了一项研究,谈的是它称为 FakeGit 的行动——以及它命名为 AgentBaiting 的投递手法。数字很庞大:横跨约 6,600 个账号的约 7,600 个恶意 GitHub 仓库,其中逾 800 个假冒 AI skill 或 MCP 服务器——Gmail 与 WhatsApp 集成、Databricks、Jenkins 与 Docker 工具,正是开发者会让代码代理去找的那种 能力。其中逾 600 个还被列在 LobeHub、Glama、MCP.so 与 MCP Market 这类公开的 AI 注册表上。到了七月,约 200 个仓库的子集,其发行资产已累计逾 1,400 万 次下载。
载荷是一个名为 SmartLoader 的 Windows 加载器,它建立持久化并拉下 StealC, 一款信息窃取程序。恶意软件是寻常的部分。它如何抵达你,才是新的部分。
AgentBaiting:代理就是投递通道
供应链攻击过去需要一个诱饵——电子邮件里的一条链接、你打错字而输入的仿冒 包名、你点下去的一则搜索结果。FakeGit 把人从这一步中抽走。Island 的发现, 用它自己的话说:“一个 AI 代理不需要被交予恶意链接。它可以自行发现一个 FakeGit 仓库,把 README 当成合法文档对待,并把攻击者的指示递交给用户。”
他们拿真实的代理来测试:
- 让 Claude Code“找一个免费的电影感提示词 skill”,它浮现出
adlaiponderous700/claude-skill-cinematic-prompt,并在部分运行中推荐了 下载并执行的步骤。 - 让 Gemini 给一个“免费的 Walmart MCP 服务器”,它把
DomingosNgongo/walmart-mcp当成首选结果返回,附上直接的 GitHub 链接。 - ChatGPT 把同一个仓库列进选项,并把它点名为“最好的起点”。
没有一个是被交予链接的。这些代理去找一项能力,通过寻常的搜索与注册表浏览
找到了那场行动的仓库,并把攻击者所写的 README,如同读任何文档那般——当成
事实——来读。这些仓库正是为那样的读者所打扮的:
Mann1988/awesome-claude-skills 复制了真正的
ComposioHQ/awesome-claude-skills(逾 67,000 颗星),并用 63 颗星和 18 个
分叉来灌水,好让自己显得根基稳固。用户名与某位知名维护者只差一个字符。
README 带着读者走过三个步骤:从 GitHub Releases 下载 ZIP、执行它、把任何
安全警告点掉、跟着安装向导走。
而在至少一次运行中,Island 报告说,Claude Code 没有停在推荐——它“克隆了 恶意仓库,并把恶意文件下载到测试机器上”,直到指标里的某些东西使它停下。 整个攻击面就在一句话里:代理,在做一件例行任务时,自己把载荷搬下到磁盘上。
实际落地的是什么
那个 ZIP 不是源代码。Island 对这个破绽直言不讳:“一个合法的 MCP 服务器或
Skill 是带着清单文件的源代码,而不是一个装着启动脚本、改名的运行时,以及
伪装成文本文件的载荷的 Windows ZIP。”在一个像 server_databricks_mcp_1.6.zip
的 FakeGit 发行版里,你会拿到一个小小的 .cmd 或 .bat 启动器、一个改名的
LuaJIT 式运行时(luau.exe),以及一个约 300 KB、顶着数据文件名字的混淆
Lua 载荷——ico64.txt。启动器执行 start luau.exe ico64.txt,控制台窗口
自行隐藏,接着 SmartLoader:
- 从存在Polygon 智能合约里的一个值解析出它的命令与控制地址——去中心化、 难以下架;
- 在
%LOCALAPPDATA%之下注册计划任务,以熬过重新启动; - 从 GitHub 拉下加密的阶段,并通过 PE 加密器把 StealC 注入另一个进程。
接着 StealC 做信息窃取程序会做的事,还更恶劣一点:它拿走浏览器的密码与 cookie、扩展程序数据、电子邮件与远程访问的凭据、屏幕截图、主机细节——还有 活跃的会话。Island 对最后这一点的注记很要紧:“StealC 拿走的是即时会话, 不只是密码,所以光是重置密码并不够。”一枚被偷的会话令牌,早已越过你的登录。
为什么核查仓库从来就不是全部的答案
直觉是去抓那个坏仓库——为仿冒名标记、为 README 打分、把账号列入封锁清单。 Island 自己的建议指向更难的地方:“监看代理走的路径,而不只是用户走的路径。 AgentBaiting 意味着一次下载、一次 git clone 或一条 shell 命令,都可能源自 一个正在完成例行任务的代理。”代理的搜索,不是一条你能安上人为检查点的路径。 它以机器的速度执行,横跨数千个近乎相同的仓库,并把它找到的任何东西都当成 文档——因为那正是它的工作。
这是代理式安全其余部分不断撞上的同一堵墙。一份读取命令的封锁清单 败给那条把它改写掉的 shell。 一个读取包的扫描器败给那个不在包里的载荷。 而一次为了找出恶意软件的审查执行了它被派去找的那个恶意软件。 FakeGit 又加上一个:一具把攻击者的 README 当作真理的推荐引擎。它们每一个都 把过滤器放在坏东西被描述的地方,指望在坏东西执行之前抓住它。描述由 攻击者来写。执行才是结果被决定的唯一之处。
Bromure 在哪里划线
Bromure Agentic Coding 不试图去猜赢代理的搜索结果。它改变的是那唯一要紧的 时刻所发生的事——当被推荐的东西执行时。Bromure 所执行的每一个代理——Claude Code、Codex、Grok Build——都跑在你 Mac 上一台用完即弃的 Linux 虚拟机里,而非 macOS 本身之上。所以当代理克隆了 FakeGit 仓库,并像 Island 看着 Claude Code 那样执行 ZIP 时,已经有三件事为真。
第一,**载荷毫无作用。**SmartLoader 是一支 Windows 程序:一个 .bat
启动器、一个 luau.exe 运行时、一次 PE 加密器注入、%LOCALAPPDATA% 之下的
计划任务。Bromure 的代理跑在 Linux 上。.cmd 启动器没有解释器,luau.exe
与被注入的 StealC PE 不会执行,也没有 %LOCALAPPDATA%、没有 Windows 任务
计划程序可供持久化攀附。一场为某个操作系统编译的攻击,跑在另一个上头,找
不到任何它懂得怎么做的事。
第二,**没有真正的凭据可拿。**假设攻击者出的是 Linux 版本。StealC 的全部
用意就是刮取浏览器存储、即时会话与已存的凭据——但在虚拟机里,没有登录的
浏览器、没有 cookie 罐、没有可捞起的会话。它能在磁盘与环境里找到的秘密
都是诱饵:Bromure 把占位值(brm_…、一份合成的 ~/.kube/config、用完即弃
的 ssh 与云端令牌)注入虚拟机,只在主机上、在代理服务器里、在通往真正 API
的出口途中,才把真的换回来。真正的密钥从不进入这个盒子。凡是抵达那个由
Polygon 解析出的 C2 的,都是一袋什么都认证不了的字符串。
第三,**外流可见,盒子用完即弃。**C2 的解析、从 GitHub 获取加密阶段、外传的 信标——这些都会以你看得见的对外流量,出现在 Bromure 的安全日志里。而因为 虚拟机的家目录是用完即弃的,那个计划任务与任何落地的二进制文件,都会在你 下次把配置重置回基线时消失。没有一台持久的主机供 SmartLoader 保住立足点。
还有第四层,因为这场攻击在是一场执行攻击之前,先是一场阅读攻击。FakeGit 的
README 正是 Bromure 所看守的那类不可信权威——与一份流氓的 CLAUDE.md、
AGENTS.md 或 SKILL.md 属同一类。Bromure 的设备端提示注入检测,会拿代理
当作文档吞入的内容,对照从不离开 Mac 的本机模型加以打分,另有一个针对隐形
Unicode 花招的确定性扫描器。一份告诉代理“下载这个 ZIP、执行它、把警告点掉”
的 README,正是那个检测器存在要标记的案例。它单独并不是一堵墙——但在 Bromure
里,它坐落在隔离之上,所以就算漏接,仍会被一个里头没有任何真东西的盒子
接住。
这划线圈住的是什么
隔离是围堵,不是推荐过滤器。值得把 Bromure 在此改变什么、不改变什么说清楚。
代理仍然可以推荐那个仓库
Bromure 不核查 GitHub,不核查 MCP 注册表,也不核查代理的搜索结果,更不会 阻止代理浮现一个 FakeGit 仓库或把它的安装步骤递给你。它的供应链扫描涵盖的 是包注册表——npm、PyPI、Cargo 等等——而不是仿冒仓库的 README。改变的是被 推荐的东西在哪里执行、以及执行时它能触及什么。
挡下 Windows 载荷的是操作系统边界,不是一条规则
SmartLoader 失败,是因为代理跑在 Linux 上,而不是因为 Bromure 为它做了 指纹识别。一个 Linux 原生的窃取程序会执行——却仍然空手而回,因为虚拟机里 没有登录的浏览器、没有即时会话,凭据是诱饵,家目录用完即弃。
替换涵盖的是你所配置的秘密
诱饵替换保护的是你放进配置文件的凭据:模型密钥、git 与云端令牌、受托管的 数据库端点、ssh 密钥。你在盒子里手动建立的会话,或某支脚本在执行途中写进 文件的秘密,都只是数据。把秘密放在代理处理器里,别放在工作区里。
检测是一张网,不是一堵墙
设备端的注入打分,多半能标记出一份要你安装并执行的 README,但意志坚定的 作者能把诱饵的措辞调成溜过单一扫描器。把检测器当成一层;当检测器漏接时 撑住的,是那份围堵——一个装着假密钥、外流被记录的用完即弃盒子。
Island 的收尾一句最值得静下来咀嚼:“AI 能力已成为软件进入企业的一条途径, 而 FakeGit 不会是最后一场利用它的行动。”你的代理会去找 skill 与服务器,而它 找到的一部分,会是为了被找到而打扮过的。问题不在于它会不会有天推荐错的 仓库——在 7,600 个仓库与 1,400 万次下载的规模下,有时候就是会。问题在于它 这么做时,执行的是什么:是你的机器、你的浏览器会话与你真正的密钥,还是一个 你可以连同里头一把诱饵一起扔掉的 Linux 盒子。Bromure 让它是后者。