Unla OAuth:有效token不等于资源所有者与路由授权
Unla OAuth:有效token不等于资源所有者与路由授权
知识轴:MCP Gateway / sandbox-security / harness-runtime / benchmark-evaluation。 命中最高权重网关与安全主题。CVE-2026-108865于2026-10-11发布,今天是补课和固定源码复核,不是新零日。这里没有用户实例暴露、攻击成功或安全修复已上线的结论。
为什么对用户重要
MCP-Gateway-Runtime收口多个工具与上游服务凭据后,“通过OAuth”必须拆成三件事:谁创建client、谁有权批准访问、这枚token允许访问哪个资源。若三者被压成“数据库里有个未过期token”,看起来有认证的控制面可能仍允许陌生调用者取得工具访问权。对Hermes接入的内部API/联邦网关,验token格式、随机性和过期时间远远不够;应把真实主体、目标prefix/tool与动作权限带到最终调用门。
固定证据与时间边界
- 原研究者报告明确标注静态审阅,未构建/运行网关、未调用OAuth端点。本轮独立取得并阅读commit
5da380b8d883165def1c0a19ec55025ef12db8a5的三个Go文件相关函数;commit时间08-04,latest release API当次仍为v0.10.0(08-04发布)。 - 另固定当前main
de8ab0b980ce48e7b82e062c26d25667a75a6205(10-20);对应internal/auth/oauth.go、internal/core/auth.go、internal/core/server.go与上述版本逐文件字节相等。这说明所审路径未变化,不代表所有代码/外部网关/部署配置均相同,也不证明不存在其它修复分支。 - CVE官方JSON状态PUBLISHED、发布10-11/更新10-14;研究者正文遗留“No CVE assigned yet”属于旧状态,不能覆盖CVE记录。CVSS v3.1 8.2与v4.0 8.8是不同版本评分,不当数据冲突。未沿用报告“current main as of 10-11”作为今天的证据。^[raw/articles/unla-oauth-resource-owner-and-prefix-binding-2026-10-27.md]
一阶机制:可信签发与资源授权是两个缺口
- client凭据不是资源所有者身份。
RegisterRoutes的OAuth组只可选加CORS;Register凭redirect URI等元数据生成client ID/secret。开放client注册本身不必然是漏洞,但它不能充当用户登录、服务主体准入或资源授权。 - 授权码没有绑定真实授予者。
handleOAuthAuthorize的POST路径直接把表单交给Authorize;后者验证client/redirect URI并构造授权码,没有在已审路径取得已认证resource owner或记录授权决定。呈现一个authorize页面不等于后端实施了登录/同意检查。 - 正确交换不能补回缺失的授权根。 token交换检查client secret、code/client/redirect绑定;即使这些检查和PKCE都成立,也只保护交换关联/拦截风险,不能证明这个client获得访问目标工具的合法授权。token构造保留client/scope/expiry,却未在该路径附上资源所有者。
- 入口只证明token存活。
handleRoot取得prefix后,在OAuth2模式调用isValidAccessToken;ValidateToken(ctx, token)只查存储和过期,没有接收请求prefix/动作参数,也未在此校验user、tenant、audience或scope与目标的关系。因此已审入口不能从“未过期”推出“允许当前prefix”。
前两个缺口使匿名调用者可能自行取得被接受的token;第四个缺口扩大到多个OAuth2 prefix。它们应分别修复:只补登录仍可能保留跨路由授权缺口;只限制scope名称但不在最终调用检查,也不构成资源隔离。与enterprise-mcp-persona-credential-boundaries的User/Non-user及上游凭据分轴、litellm-auth-fallback-and-gateway-blast-radius的目标集合绑定互补。^[raw/articles/unla-oauth-resource-owner-and-prefix-binding-2026-10-27.md]
影响前提,不把工具访问拼成整机失陷
静态路径要求OAuth2开启、目标prefix处于OAuth2模式、相关入口可达且没有外层身份边界提前拦截。可达范围是该prefix配置的MCP工具及其上游能力;不能因此直接断言上游明文凭据泄漏、RCE、数据库绕过或用户生产受影响。外层认证的存在不能由仓库代码证明;反之源码缺口也不能证明外层边界被绕过。CVE列至0.10.0受影响不意味着未核版本已安全;latest API也不能给出修复完成保证。^[raw/articles/unla-oauth-resource-owner-and-prefix-binding-2026-10-27.md]
给Hermes / 内部benchmark的可执行迁移
- 声明授权主体类型。 交互授权码流程要求可信resource owner/批准记录;机器到机器流程要求显式服务主体准入,不为每个机器流程硬造一个人。代码/发行记录绑定client、principal、issuer、audience/resource、scope、时效与撤销条件。
- 在实际prefix/tool/action上验权。 token验证返回可信claims/引用,而不是只返bool;目标在路由变换后重核,再决定是否注入上游凭据。不要把scope被写进token误作scope已被执行。
- 用独立负例分离缺口。 在授权的隔离环境中测试:无owner的注册client、合法但仅A资源的token访问B、过期/撤销token、合法A访问成功;同时核真实upstream计数及零副作用。HTTP拒绝必须发生在上游调用之前,不能拿工具自身报错当网关拒绝。
- 记录证据层。 Agent-Benchmarks同时保存固定版本、有效配置、实际caller×resource×action、判分和业务effect;本轮只有源码阅读/文件相等检查,不把上述待测矩阵写成已通过。
边界与未解问题
尚未审计所有storage实现、refresh/revoke端到端传播、外层身份代理、scope设计或完整路由矩阵;没有构建Go工程、执行上游测试或联系任何真实网关。后续若维护者发布修复,应固定diff并用相同合法/负例重验,不能仅因release含“security”就消除此处缺口。这里沉淀的是Harness-Engineering的授权链验收合同,不是安装/升级指令。
写入记录
- 2026-10-27 09:09 CST:归档研究报告/CVE与固定Go源码,核对当前main三文件相等;深析resource-owner授权根和prefix最终验权双缺口,明确静态证据、部署前提与未运行范围。