FlawOpen

flawopen.com/Teardowns/cve-2026-27826-mcp-atlassian-ssrf

● CVE-2026-27826 · CVSS 8.2[1], [3] · 高危
安全研究 · FlawOpen

CVE-2026-27826:MCP Atlassian 请求头 SSRF

CVE-2026-27826 最初的基于请求头的 SSRF 问题已在 0.17.0 中修复。后续发现的其他 SSRF 问题在 0.22.0 中修复;确定全网最低版本前,请分别核对各安全公告。[1], [2], [6], [8], [9], [10], [11]

💡 通俗易懂的原理解析 (ELI5)

设想公司的收发室只获准把包裹送到已批准的办公室。访客在一张特殊表格上写了另一个地址,收发室却没有核验就照办。服务器 fetcher 就像这个收发室:请求头指定了目的地,服务器随后发出外部请求。0.17.0 的修复会在连接前检查提交的 URL,并检查任何重定向目标;运营方还可额外配置允许的域名列表。[1], [2]

核心概念与专有名词

Server-side request forgery (SSRF)
一种缺陷,调用方可影响服务器的出站请求,使其访问应用原本不打算联系的目标。[1], [4]
MCP 传输
MCP 客户端与服务器之间的通信通道。本漏洞影响 streamable-HTTP 和 SSE 传输;公告所述仅使用 stdio 的部署不受该 HTTP 请求头路径影响。[1]
基于请求头的多租户认证
一种模式,每个请求都携带 Atlassian URL 和令牌,以创建特定租户的 API 客户端。[1], [2]
出站网络策略
限制服务可连接目标的网络控制,可降低应用 URL 校验失效造成的影响。[12], [1]
间接提示注入
工具返回的不可信内容可能包含影响模型的指令。对于此 CVE,公告描述攻击者控制的服务响应进入工具结果;这是 SSRF 之外的另一条影响路径。[1], [7]
后续 SSRF 修复
CVE-2026-27826 的原始公告将 0.17.0 列为修复版本。维护者后来将四个不同的不完整修复路径分别记录为 CVE-2026-77242、CVE-2026-77267、CVE-2026-77249 和 CVE-2026-77274;每份公告都将 0.22.0 列为修复版本。这些是独立 CVE,不会扩大 CVE-2026-27826 的受影响范围。确定全网最低版本前,还应检查后续公告。[8], [9], [10], [11]

框架映射

根本原因剖析 (Root Cause)

在受影响的 HTTP 路径中,服务器从请求中读取 X-Atlassian-Jira-Url 或 X-Atlassian-Confluence-Url,并将该值传给用于创建 fetcher 的 JiraConfig 或 ConfluenceConfig。在存在漏洞的请求头认证分支中,fetcher 发出首次请求前,没有将目标与服务器配置的租户 URL 或目标策略进行比对。维护者公告指出问题位于请求 middleware 和依赖提供程序路径,而不是某个单独的 MCP 工具处理函数。该问题需要使用受影响的 HTTP 传输并满足请求头认证条件;不能将其泛化为所有 MCP 部署。[1], [2]

攻击执行流程分解

步骤 1

HTTP 传输可被访问

部署使用 streamable-HTTP 或 SSE,并将 MCP 端点暴露给能够访问它的调用方。[1], [2]

步骤 2

请求头选择服务 URL

在受影响的请求头认证路径中,请求包含 Jira 或 Confluence URL 和令牌请求头,却没有备用路径所期待的 Authorization 请求头。[1], [2]

步骤 3

Middleware 创建 fetcher

Middleware 保存收到的 URL,依赖提供程序用它配置 Atlassian fetcher,却未落实预期的目标边界。[1], [2]

步骤 4

服务器发出出站请求

初始化 fetcher 时,服务器会请求调用方指定的目标。根据网络可达性和目标响应,这可能暴露内部服务,或使攻击者控制的内容进入工具结果。[1], [2]

源代码对比:漏洞与安全实现

有漏洞的代码片段允许请求头中的 URL 选择服务器的出站目标。上游 0.17.0 补丁没有把这种基于请求头的租户模式替换为服务器端租户注册表:它会在 ASGI 中间件中、创建 fetcher 之前验证传入的 Jira 或 Confluence URL,随后添加响应钩子来验证重定向目标。加固片段展示了这两项上游控制;验证器实现未列出。服务器端租户注册表是更强的替代架构,并非该补丁实际实现的内容。0.22.0 的后续公告记录了不同的残余路径,因此在检查这些公告前,不要把 0.17.0 当作全网最低安全版本。还必须在连接时落实 DNS 验证以抵御 rebinding;只解析一次主机名不足以构成完整的 SSRF 边界。[1], [2]

源码摘录: 上游中间件和 fetcher 补丁摘录(Jira 路径;Confluence 也有对应检查)。

存在漏洞的实现
header_jira_fetcher = JiraFetcher(config=header_config)
current_user_id = header_jira_fetcher.get_current_user_account_id()
加固后的安全修复
ssrf_error = validate_url_for_ssrf(jira_url_str)
if ssrf_error:
    scope["state"]["auth_validation_error"] = (
        f"Forbidden: Invalid Jira URL - {ssrf_error}"
    )
    return

header_jira_fetcher = JiraFetcher(config=header_config)
header_jira_fetcher.jira._session.hooks["response"].append(
    _make_ssrf_safe_hook(validate_url_for_ssrf)
)
current_user_id = header_jira_fetcher.get_current_user_account_id()

工程与系统安全加固清单

参考来源