Eclipse Jetty WEB-INF敏感信息泄露漏洞分析(CVE-2021-28164/CVE-2021-34429)
字数 1815 2025-08-05 08:19:37

Eclipse Jetty WEB-INF敏感信息泄露漏洞分析(CVE-2021-28164/CVE-2021-34429)教学文档

1. 漏洞概述

本教学文档详细分析Eclipse Jetty服务器中两个WEB-INF敏感信息泄露漏洞(CVE-2021-28164和CVE-2021-34429)。这两个漏洞允许攻击者通过精心构造的URL路径绕过安全校验,访问WEB-INF目录下的敏感文件(如web.xml)。

2. 背景知识

2.1 Jetty简介

Jetty是Eclipse基金会下的一个纯Java网页服务器和Servlet容器,支持最新的Java Servlet API、WebSocket、SPDY和HTTP/2协议。

2.2 RFC3986规范

RFC3986定义了URI的规范处理方式,其中:

  • ...称为点段,用于路径的相对引用
  • 在URI路径解析时,点段应被处理并删除
  • 解析顺序应为:先规范化路径(处理点段),再进行URL解码和参数处理

3. 漏洞详情

3.1 CVE-2021-28164

影响版本:Jetty 9.4.37及之前版本

漏洞利用

/%2e/WEB-INF/web.xml

其中%2e.的URL编码形式。

3.2 CVE-2021-34429

影响版本:Jetty 9.4.40及之前版本

漏洞利用方式

  1. Unicode编码绕过:
/%u002e/WEB-INF/web.xml
  1. 空字符绕过:
/.%00/WEB-INF/web.xml
  1. 多层路径绕过:
/a/b/..%00/WEB-INF/web.xml

4. 漏洞原理分析

4.1 Jetty路径处理流程(漏洞版本)

  1. 输入路径:如/HelloTomcat/%u002e/WEB-INF/web.xml
  2. 规范化路径canonicalPath(path) → 原样返回(未处理%u编码)
  3. URL解码decodePath(path)/HelloTomcat/./WEB-INF/web.xml
  4. 提取目标路径target=/./WEB-INF/web.xml
  5. 安全校验isProtectTarget(target) → 检查不以/web-inf/meta-inf开头
  6. 再次规范化canonicalPath(target)/WEB-INF/web.xml
  7. 获取资源:读取/WEB-INF/web.xml

4.2 关键问题点

  1. 路径解析顺序问题

    • 按照RFC3986应先规范化再解码
    • Jetty实现是先解码再规范化
  2. 歧义路径检测不完整

    • 仅检测了%2e等编码形式,未检测%u002e
    • 歧义字符列表不完整
  3. 空字符处理缺陷

    • %00处理逻辑错误
    • ..%00会被解析为两层父目录跳转

5. 漏洞修复分析

5.1 CVE-2021-28164修复(9.4.39)

  • 在路径解析过程中增加歧义路径检测
  • 对检测到的歧义路径强制进行规范化

5.2 CVE-2021-34429修复(9.4.43)

  1. 改变解析顺序

    • 先进行URL解码和参数删除
    • 再进行路径规范化
  2. 空字符处理

    • 删除对\u0000的特殊处理
    • 在路径截取时直接检测并拒绝空字符
  3. 编码检测增强

    • 增加对%25(双重编码)和%2f的检测
    • 记录路径中的编码数据类型

6. 安全建议

  1. 升级建议

    • 升级至Jetty 9.4.43或更高版本
  2. 配置建议

    • 设置jetty.http.compliance=RFC7230_NO_AMBIGUOUS_PATH_SEPARATORS
    • 禁用可能引起歧义的编码形式
  3. 开发建议

    • 实现路径处理时严格遵循RFC3986规范
    • 在安全校验前确保路径已完全规范化

7. 深入思考

  1. RFC规范与实践的冲突

    • RFC3986要求先规范化再解码
    • 但实际安全实现可能需要先解码再规范化
  2. 潜在问题

    • Jetty未正确处理,作为参数分隔符
    • 歧义路径检测仍可能不完整
  3. 更安全的实现方式

    • 在安全校验时也进行规范化
    • 建立更全面的歧义字符列表

8. 参考资料

  1. RFC3986规范文档
  2. Jetty官方安全公告
  3. Vulhub漏洞环境说明
  4. Jetty GitHub提交记录

9. 实验验证

建议在受控环境中使用以下版本进行验证:

  • Jetty 9.4.37(存在CVE-2021-28164)
  • Jetty 9.4.40(存在CVE-2021-34429)
  • Jetty 9.4.43(已修复)

通过构造不同payload观察响应差异,加深对漏洞原理的理解。

Eclipse Jetty WEB-INF敏感信息泄露漏洞分析(CVE-2021-28164/CVE-2021-34429)教学文档 1. 漏洞概述 本教学文档详细分析Eclipse Jetty服务器中两个WEB-INF敏感信息泄露漏洞(CVE-2021-28164和CVE-2021-34429)。这两个漏洞允许攻击者通过精心构造的URL路径绕过安全校验,访问WEB-INF目录下的敏感文件(如web.xml)。 2. 背景知识 2.1 Jetty简介 Jetty是Eclipse基金会下的一个纯Java网页服务器和Servlet容器,支持最新的Java Servlet API、WebSocket、SPDY和HTTP/2协议。 2.2 RFC3986规范 RFC3986定义了URI的规范处理方式,其中: . 和 .. 称为点段,用于路径的相对引用 在URI路径解析时,点段应被处理并删除 解析顺序应为:先规范化路径(处理点段),再进行URL解码和参数处理 3. 漏洞详情 3.1 CVE-2021-28164 影响版本 :Jetty 9.4.37及之前版本 漏洞利用 : 其中 %2e 是 . 的URL编码形式。 3.2 CVE-2021-34429 影响版本 :Jetty 9.4.40及之前版本 漏洞利用方式 : Unicode编码绕过: 空字符绕过: 多层路径绕过: 4. 漏洞原理分析 4.1 Jetty路径处理流程(漏洞版本) 输入路径 :如 /HelloTomcat/%u002e/WEB-INF/web.xml 规范化路径 : canonicalPath(path) → 原样返回(未处理%u编码) URL解码 : decodePath(path) → /HelloTomcat/./WEB-INF/web.xml 提取目标路径 : target=/./WEB-INF/web.xml 安全校验 : isProtectTarget(target) → 检查不以 /web-inf 或 /meta-inf 开头 再次规范化 : canonicalPath(target) → /WEB-INF/web.xml 获取资源 :读取 /WEB-INF/web.xml 4.2 关键问题点 路径解析顺序问题 : 按照RFC3986应先规范化再解码 Jetty实现是先解码再规范化 歧义路径检测不完整 : 仅检测了 %2e 等编码形式,未检测 %u002e 歧义字符列表不完整 空字符处理缺陷 : 对 %00 处理逻辑错误 ..%00 会被解析为两层父目录跳转 5. 漏洞修复分析 5.1 CVE-2021-28164修复(9.4.39) 在路径解析过程中增加歧义路径检测 对检测到的歧义路径强制进行规范化 5.2 CVE-2021-34429修复(9.4.43) 改变解析顺序 : 先进行URL解码和参数删除 再进行路径规范化 空字符处理 : 删除对 \u0000 的特殊处理 在路径截取时直接检测并拒绝空字符 编码检测增强 : 增加对 %25 (双重编码)和 %2f 的检测 记录路径中的编码数据类型 6. 安全建议 升级建议 : 升级至Jetty 9.4.43或更高版本 配置建议 : 设置 jetty.http.compliance=RFC7230_NO_AMBIGUOUS_PATH_SEPARATORS 禁用可能引起歧义的编码形式 开发建议 : 实现路径处理时严格遵循RFC3986规范 在安全校验前确保路径已完全规范化 7. 深入思考 RFC规范与实践的冲突 : RFC3986要求先规范化再解码 但实际安全实现可能需要先解码再规范化 潜在问题 : Jetty未正确处理 , 作为参数分隔符 歧义路径检测仍可能不完整 更安全的实现方式 : 在安全校验时也进行规范化 建立更全面的歧义字符列表 8. 参考资料 RFC3986规范文档 Jetty官方安全公告 Vulhub漏洞环境说明 Jetty GitHub提交记录 9. 实验验证 建议在受控环境中使用以下版本进行验证: Jetty 9.4.37(存在CVE-2021-28164) Jetty 9.4.40(存在CVE-2021-34429) Jetty 9.4.43(已修复) 通过构造不同payload观察响应差异,加深对漏洞原理的理解。