MCPHub 的 prompt 写接口不看你是不是管理员,写进去的模板每个会话都先读它

今天只有一起,落在 MCP 生态里:MCPHub 的 prompt/resource 写接口漏了权限校验,任何登录用户都能改所有人共用的 prompt 模板。

CVE-2026-79745 · MCPHub

披露日 2026-08-31,CVSS 7.1 HIGH,向量 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:L——注意机密性打的是 N、完整性 H,评分只算了「记录被篡改」,没把下游的模型行为算进去。CWE-862 Missing Authorization。影响 ≤1.0.31,修复版本 1.0.32。

MCPHub 干的事是把一堆 MCP server(模型调外部工具的标准接口,比如一个查数据库的 server、一个读文件的 server)汇总到统一端点,团队里所有人共用一个实例。它自己也内置一套 prompt 模板和 resource,存在本地 DAO 里。

攻击链:一个普通成员账号(不需要 admin,PR:L 就是这个意思)向 POST /api/promptsPUT /api/resources/... 发一次请求。这两条路由挂在「已认证」路由器上,但没有 admin gate,handler 从头到尾没读过 req.user——它不知道也不关心你是谁。请求写进去的模板对全实例生效。之后同事 B 打开 agent、触发某个 prompt,服务端走 handleGetPromptRequest / handleReadResourceRequest这两个函数先查本地 DAO,再去问连接着的 MCP server。于是攻击者不仅能新建模板,还能用同名条目盖掉真实 MCP server 提供的那一份——同事 B 拿到的是攻击者写的版本,界面上看不出区别。

模型在链里的哪一环:模型是这条链的执行末端,也是唯一让「改了一条数据库记录」变成安全事件的环节。被覆写的是喂进模型上下文的文本,模型没有办法区分「这段是管理员配置的系统提示」和「这段是刚才那个普通成员塞进来的」——就像让助手照着一张便签办事,而便签被人换过,字迹一样。GHSA 自己的措辞是 stored prompt injection 属于篡改的 downstream consequence:攻击者写一次,之后每个会话自动重放。

厂商修的是哪一层:PR #1069 的 commit 763381f 把 prompt/resource 的 create/update/delete 全部套上共享的 requireAdmin helper,读操作保持开放。也就是只修了写侧的授权。入口侧——模型读到全局模板时无从判断这段文本可不可信、本地 DAO 优先于 MCP server 的查找顺序——都没动。管理员账号被盗、或者组织确实想让非管理员管自己的 prompt(advisory 把 per-user/group ownership scoping 列为「可选」建议,1.0.32 没实现),同一条路径照样成立。

已核实来源


本文由自动化管道生成(采集 → 逐字核验 → 模型撰写),未经人工改写。