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利用

  1. Payload1: /%u002e/WEB-INF/web.xml

    • 使用Unicode编码的点字符绕过修复
  2. Payload2: /.%00/WEB-INF/web.xml

    • 利用空字符处理逻辑绕过
  3. Payload3: /a/b/..%00/WEB-INF/web.xml

    • 利用空字符导致的双重父目录跳转

漏洞详细分析

路径解析流程

Jetty对URI路径的解析分为以下步骤:

  1. 初始解析:解析原始URI路径
  2. 规范化处理:处理...相对路径
  3. URL解码:处理%编码和%u编码
  4. 安全校验:检查路径是否指向保护目录
  5. 最终规范化:获取资源前的最后规范化
  6. 资源获取:读取实际文件

关键问题点

  1. CVE-2021-28164

    • 在安全校验前仅进行部分规范化
    • /%2e/被解码为/./但未在安全校验时规范化
    • 安全校验使用/./WEB-INF/而非/WEB-INF/
  2. CVE-2021-34429绕过

    • %u002e未被列入歧义字符列表
    • 空字符(%00)处理逻辑缺陷:
      • 忽略空字符前的单个点
      • ..%00错误地执行两次父目录跳转
  3. canonicalPath函数问题

    case '\u0000':
        if (dots == 1 || dots > 2) {
            len--;
            break;
        }
        // 错误处理逻辑导致安全问题
    

漏洞修复方案

修复版本

  • CVE-2021-28164:Jetty 9.4.39
  • CVE-2021-34429:Jetty 9.4.43

修复措施

  1. 9.4.39修复

    • 增加对歧义路径的二次规范化检查
    • Request.setMetaData()中添加额外规范化步骤
  2. 9.4.43修复

    • 改变解析顺序:先解码再规范化(违反RFC3986)
    • 移除空字符特殊处理逻辑
    • 在路径解析时直接拒绝空字符

安全建议

  1. 升级到Jetty 9.4.43或更高版本
  2. 配置jetty.http.compliance=RFC7230_NO_AMBIGUOUS_PATH_SEPARATORS限制歧义路径
  3. 审查自定义路径处理逻辑,确保完整规范化
  4. 实施深度防御:除容器保护外,添加应用层校验

技术思考

  1. RFC合规性与安全性冲突

    • RFC3986要求先规范化再解码
    • 安全实践可能需要先解码再规范化
    • Jetty最终选择安全性而非严格合规
  2. 空字符处理

    • RFC3986 7.3节建议特殊处理空字符
    • 应拒绝而非忽略空字符
  3. 参数分隔符完整性

    • Jetty仅处理;未处理,参数分隔符
    • 可能遗留其他绕过可能性

参考资料

  1. RFC3986 URI规范
  2. Jetty安全公告GHSA-vjv5-gp2w-65vm
  3. Jetty修复提交
  4. Vulhub漏洞环境
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函数问题 : 漏洞修复方案 修复版本 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仅处理 ; 未处理 , 参数分隔符 可能遗留其他绕过可能性 参考资料 RFC3986 URI规范 Jetty安全公告GHSA-vjv5-gp2w-65vm Jetty修复提交 Vulhub漏洞环境