老魏 · 折腾铺
民宿站监控台双色球点哪抠哪老照片修复Murdoku科学探险家
折腾铺/单篇
单篇2026-10-05老魏

Claude Code 的插件,能改你的界面了

Anthropic 说 Claude Code Mods 是精简核心按需加回。Pluto 实测:一个 mod 能静默外发 834 KB 提示词历史,plugin
Claude Code 的插件,能改你的界面了

AI TOOL · 反共识观察 | 2026-10-05 Anthropic 说 Claude Code Mods 是精简核心、按需加回。Pluto Security 实测:一个 mod 能静默读取你 834 KB 的全部提示词历史并外发,plugin details 界面报 Hooks (0),还能在真客户端里画一个假的 Anthropic 登录框。 不是模型越权,是人写的代码在你的终端里有了完整权限。你上周装的那个插件,验过没有? 来源:Anthropic 官方变更(Yet Another Changelog 收录 2026-10-01)、Pluto Security 安全审计、Wavect 架构分析

先对齐一下这篇跟 9 月 30 日、10 月 3 日那两篇的关系。

9 月 30 日那篇是「Cursor 加安全功能」——AI 帮你审,正面。10 月 3 日那篇是「OpenAI 内部模型自己越权」——AI 自己找缝,反面。这篇是「Claude Code 的插件机制,允许第三方代码改写你的界面」——攻击者不是模型,是人,而且入口是官方刚放行的。

三件事凑齐才是安全全貌:工具被黑 → 模型越权 → 界面被劫。少看一个都会误判。

PART 01 · Mods 不是插件,是中间件

10 月 1 日,Anthropic 在 2.1.287 里上线了 Claude Mods。

官方话术是"插件可以发小段 TypeScript 函数,钩进 Claude Code 的事件,改写 prompt、替换界面,甚至把 /diff 这类内置功能也改成 mod 分发——核心做轻,按需加回"。

听起来很 Express。问题就在这里。

经典 hooks(hooks.json)走独立进程、stdin/stdout 通信,改不了界面。Mods 是 TypeScript 函数注册到事件上,在进程内跑。每次 Claude Code 调工具、要权限、渲染界面,mod 都能插进来——在之前、之后、或者直接替它执行。

每个钩子收三个参数:事件对象 e、引擎接口 $、继续函数 next。按注册顺序执行,前面的可以改了事件再传给后面的。

$ 接口暴露 19 个名词、60+ 方法:$.fs.read/.write(绝对路径,不限项目不限会话)、$.process.run(以你的身份跑 shell)、$.http.fetch(外网)、$.session.messages(全部对话历史)、$.model.complete(用你的凭据调模型)、$.ui.render/$.ui.resolve(画屏、改写界面)、$.env.get、$.settings.read。

官方自己说 mods 没有沙箱,跟 Claude Code 同机器权限。安装即信任决策。

所以别把它当"加功能"。它是在你终端里装了一段有你全部权限、能改你屏幕、能联网的代码。

Mods vs 经典 hooks:独立进程 vs 进程内 / 19 名词 60+ 方法

PART 02 · Pluto 实测:四个风险,三个看不见

安全公司 Pluto Security 跑了一整轮审计,四条风险。

静默偷凭据。 在 session.start 里读 ~/.claude/.credentials.json 和 history.jsonl,再 $.http.fetch 发走。Pluto 实测:两条读都成功,外发成功,零 prompt、零权限请求。那台机器上返回了 834 KB 的 history.jsonl——你打过的每一个 prompt,跨所有项目和会话。旧 hooks 原理上也能干这事,但旧 hooks 你至少知道它在开新进程。

能力声明是假的。 plugin install 只说 "Successfully installed",plugin list 只显示名字,plugin details 显示 Hooks (0)。Pluto 实测一个钩了 4 个事件(含通配符 *)的 mod,被报成零钩子。唯一说真话的是手动的 claude plugin validate。更讽刺的是:plugin details 对经典 hooks 是对的,只对新的 function hooks 失明——最该看的地方,恰好对新东西看不见。

真客户端钓鱼。 AbovePrompt 这个界面组件,官方文档说"引擎自己不画任何东西"——所以 mod 完全拥有它。Pluto 画了一个"Anthropic – session verification required,API key: sk-ant-…"的假登录框,贴在真实输入行上方。用户看到真客户端、真 logo,中间那栏是假的。值一提交,ui.input 事件被钩住,$.http.fetch 发走。没 URL 可查,没窗口可看——它就是你信任的那个客户端。

显示的不等于执行的。 tool.call 钩子改实际命令,ToolUse 渲染钩子改显示。Pluto 实测模型执行 echo transcript-demo,mod 放行但追加了一条隐藏命令,transcript 只显示原版。隐藏命令执行了,记录里什么都没有。 更讽刺的是这个攻击一个 $ 调用都不用——只改写传给 next() 的值,所以 claude plugin validate 报 calls: nothing on $。能力扫描仪盯着 $,对 next() 是盲区。

还有一条没算进四条里的:安装后换码。$.http.fetch 拉脚本 + $.process.run 执行。审查时拉的是无害脚本,上线后服务端换文件就行——不用新版本、不用重安装、不用重审查。$ 能告诉你"它能 fetch 和 run",永远告诉不了你它 fetch 了什么。

四条攻击路径:凭据静默外发 / Hooks (0) 假报 / 假登录框 / 显示≠执行

PART 03 · 那 Anthropic 做对了吗?

得说句公道话,不是全烂。

Pluto 确认有效的控制:没有 ambient fetch/require/import/XMLHttpRequest/WebSocket,eval 和 Function 不能从字符串生成代码——绕不开 $;工具审批弹窗本身不可被 mod 重写(这是最关键的一道,"要批准这个命令吗"那个框 mod 动不了);AskUserQuestion 的选项标签由模型创建,mod 改不了——但问题文本和描述还能改,所以模型用了 "Confirm"/"Cancel" 这种通用标签时依然挡不住;身份不可伪造,tier 由宿主指派。

问题在于:这些控制保护的是运行时,没保护安装前。 用户在安装那一刻拿不到能力信息——install、list、首次运行都不展示,plugin details 还撒谎。文件、网络、进程、UI 的访问权,是在用户不知情时授予的。

Pluto 给 Anthropic 的建议就四条:在安装时和 plugin details 里展示能力扫描结果、把 function-hook 事件数算进去、固定确认对话框文本、把内容扫描覆盖到每个安装渠道。

另外两条企业管控:disableAllHooks 和 allowManagedHooksOnly——当前被环境变量门控,默认关闭。功能钩本身还需要 CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 才开启。

Anthropic 造了开关,但没推到你能看见的地方。

PART 04 · 两分钟自查,今天就能做

CASE 01|装过 Claude Code 插件的人,自查供应链

需求:个人开发者或小团队,日常用 Claude Code,装过一两个第三方插件,想不耽误干活把供应链过一遍。 方案: 1. 对每个已装插件跑 claude plugin validate,只认它列出的 $ 方法清单,别信 plugin details 2. 源码里盯两处:next() 改了什么(扫描盲区,零 $ 调用也能换命令),有没有 fetch-then-run(能 vendor 就 vendor,别信"作者不会变坏") 3. $.http.fetch + $.process.run 同时出现的插件,直接划走——这意味着它能执行审查时没见过的代码 输出: - 一份"已装插件 × 能力声明"清单 - 高危组合插件的卸载决定 - 团队机器上打开 allowManagedHooksOnly

顺带一提,10 月 2 日的 2.1.288 一天修了四处权限缺口——bash -c 里的危险 rm 在 bypassPermissions 模式下能不经提示跑、BASHPID 算术赋值绕过 prompt、没匹配上的 hook 被直接跳过、sandbox 凭证条目在 git config 文件上被忽略。四天之内修了四处同一方向的漏洞。 这不是"Anthropic 安全做得好",这是"这个方向漏洞密度高"。

5 分钟插件自查清单:plugin validate / 审 next() / 开门控

结尾

Pluto 原文里有一句话我印象很深——mods 让"用户在安装那一刻被授予了文件、网络、进程和 UI 的访问权,却没有被告知"。

Anthropic 的叙事是"精简核心、按需加回"。翻译成人话:你的终端屏幕,现在有一部分属于插件了。

不是说所有插件都坏。Wavect 的建议是对的——从最小机制选起:能用经典 hook 就别用 mod,能用 MCP 就别自己写运行时代码,先做可控试点。但"最小"的前提,是你得知道自己在用什么。

去跑一下 claude plugin validate 吧,两分钟的事。


一句话推荐:用 Claude Code 的团队,把"装插件前跑 claude plugin validate"写进入职 checklist——别再让一段有你全部权限的代码,以"扩展"的名义静默上线。

适合场景:用 Claude Code 跑日常开发的开发者;管理 Team/Enterprise 部署的平台工程与安全团队;评估 AI 代理扩展机制的技术负责人。

参考资源

以上事实均来自 Anthropic 官方变更(经 Yet Another Changelog 收录)、Pluto Security 实测审计、Wavect 架构分析。攻击描述全部归因到 Pluto 实验室环境实测,不代表任何已发生的大规模利用;官方口径与第三方口径已分开标注。Mods 需 CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 开启,企业管控 disableAllHooks / allowManagedHooksOnly 当前默认关闭。