Eclipse Jetty WEB-INF敏感信息泄露漏洞分析(CVE-2021-28164/CVE-2021-34429)
字数 1630 2025-08-05 08:19:37
Eclipse Jetty WEB-INF敏感信息泄露漏洞分析(CVE-2021-28164/CVE-2021-34429)
漏洞概述
本文详细分析Eclipse Jetty服务器中两个WEB-INF目录敏感信息泄露漏洞(CVE-2021-28164和CVE-2021-34429)。这两个漏洞源于Jetty在URI路径解析过程中对编码字符和相对路径处理不当,导致攻击者可以绕过安全校验访问WEB-INF和META-INF目录下的敏感文件(如web.xml)。
受影响版本
- CVE-2021-28164:Jetty 9.4.37及之前版本
- CVE-2021-34429:Jetty 9.4.40及之前版本
漏洞背景
Jetty作为Java网页服务器和Servlet容器,在9.4.37版本中为了符合RFC3986规范,选择性地支持可能有歧义解释的URI,默认模式允许URL编码。RFC3986规定:
.和..称为点段,用于路径名层次结构中的相对引用- 这些点段仅在URI路径中解释层次结构,并作为解析过程的一部分被删除
漏洞利用方式
CVE-2021-28164利用
Payload: /%2e/WEB-INF/web.xml
直接通过URL编码的点字符(%2e)绕过路径校验。
CVE-2021-34429利用
-
Payload1:
/%u002e/WEB-INF/web.xml- 使用Unicode编码的点字符绕过修复
-
Payload2:
/.%00/WEB-INF/web.xml- 利用空字符处理逻辑绕过
-
Payload3:
/a/b/..%00/WEB-INF/web.xml- 利用空字符导致的双重父目录跳转
漏洞详细分析
路径解析流程
Jetty对URI路径的解析分为以下步骤:
- 初始解析:解析原始URI路径
- 规范化处理:处理
.和..相对路径 - URL解码:处理%编码和%u编码
- 安全校验:检查路径是否指向保护目录
- 最终规范化:获取资源前的最后规范化
- 资源获取:读取实际文件
关键问题点
-
CVE-2021-28164:
- 在安全校验前仅进行部分规范化
/%2e/被解码为/./但未在安全校验时规范化- 安全校验使用
/./WEB-INF/而非/WEB-INF/
-
CVE-2021-34429绕过:
%u002e未被列入歧义字符列表- 空字符(
%00)处理逻辑缺陷:- 忽略空字符前的单个点
- 对
..%00错误地执行两次父目录跳转
-
canonicalPath函数问题:
case '\u0000': if (dots == 1 || dots > 2) { len--; break; } // 错误处理逻辑导致安全问题
漏洞修复方案
修复版本
- CVE-2021-28164:Jetty 9.4.39
- CVE-2021-34429:Jetty 9.4.43
修复措施
-
9.4.39修复:
- 增加对歧义路径的二次规范化检查
- 在
Request.setMetaData()中添加额外规范化步骤
-
9.4.43修复:
- 改变解析顺序:先解码再规范化(违反RFC3986)
- 移除空字符特殊处理逻辑
- 在路径解析时直接拒绝空字符
安全建议
- 升级到Jetty 9.4.43或更高版本
- 配置
jetty.http.compliance=RFC7230_NO_AMBIGUOUS_PATH_SEPARATORS限制歧义路径 - 审查自定义路径处理逻辑,确保完整规范化
- 实施深度防御:除容器保护外,添加应用层校验
技术思考
-
RFC合规性与安全性冲突:
- RFC3986要求先规范化再解码
- 安全实践可能需要先解码再规范化
- Jetty最终选择安全性而非严格合规
-
空字符处理:
- RFC3986 7.3节建议特殊处理空字符
- 应拒绝而非忽略空字符
-
参数分隔符完整性:
- Jetty仅处理
;未处理,参数分隔符 - 可能遗留其他绕过可能性
- Jetty仅处理