Tomcat CVE-2024-50379 条件竞争漏洞

Tomcat CVE-2024-50379 条件竞争漏洞

原创 iak3ec 薛定谔的安全 2024-12-18 09:28

https://lists.apache.org/thread/y6lj6q1xnp822g6ro70tn19sgtjmr80r

受影响版本:

Apache Tomcat 11.0.0-M1 to 11.0.1Apache Tomcat 10.1.0-M1 to 10.1.33Apache Tomcat 9.0.0.M1 to 9.0.97

该漏洞仅影响 Windows 环境

漏洞相关配置

web.xml
 示例配置:

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name><servlet>    <servlet-name>default</servlet-name>    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>    <!-- 设置 readonly 为 false,允许资源被写入或修改 -->    <init-param>      <param-name>readonly</param-name>      <param-value>false</param-value>    </init-param>    <load-on-startup>1</load-on-startup></servlet><servlet-mapping>    <servlet-name>default</servlet-name>    <url-pattern>/</url-pattern></servlet-mapping></web-app>

漏洞利用流程

  1. 攻击者通过PUT
     请求向服务器上传恶意 JSP 文件:

  2. 例子文件:aa.Jsp
     和bb.Jsp

  3. 恶意 JSP 文件内容如下:

PUT /tomcat-CVE-2024-50379/{{file:line(/Users/xxx/yakit-projects/temp/tmp1660464294.txt)}}.Jsp HTTP/1.1Host: 192.168.2.128:58093User-Agent: Mozilla/5.0

  1. 并发访问上传的 JSP 文件:

  2. 利用条件竞争,攻击者通过GET
     请求并发访问目标 JSP 文件,例如访问aa.jsp

  3. 请求示例:

GET /tomcat-CVE-2024-50379/aa.jsp HTTP/1.1Host: 192.168.2.128:58093User-Agent: Mozilla/5.0

  1. Tomcat 的编译与加载过程出现 Race Condition:

  2. JSP 文件被写入时触发编译。

  3. 在文件被完全编译成.class
     文件并删除前的时间窗口内,某些访问可能会跳过完整检查,触发恶意代码执行。

  4. 在 Windows 系统中,由于文件名不区分大小写(aa.Jsp
     与aa.jsp
    被视为同一个文件),当文件写入和访问同时发生时,会导致:

    1. JSP 文件被写入时触发编译
    1. 在文件被完全编译成.class
       文件并删除前的时间窗口内,某些访问可能会跳过完整检查,触发恶意代码执行。

漏洞复现细节

  1. 示例攻击行为

  2. 通过并发PUT
    上传和GET
    请求访问,可能在以下情况下出现 500 错误:

HTTP Status 500 – Internal Server ErrorMessage java.lang.ClassNotFoundException: org.apache.jsp.aa_jsp
  1. 错误原因是 Tomcat 在编译 JSP 文件的过程中,因条件竞争未能正确加载类文件。

  2. 关键影响

  3. 在恶意 JSP 文件成功加载的情况下,可执行任意代码(如Runtime.getRuntime().exec(“calc”)
    )。 

漏洞为何仅影响 Windows 环境?

  1. 文件系统对大小写的敏感性

  2. Windows 使用的 NTFS 文件系统对文件名不区分大小写,aa.jsp
     和aa.Jsp
     被视为同一个文件。

  3. 在 Linux 和 macOS 上,文件系统(如 ext4、APFS)对文件名大小写敏感,aa.jsp
     和aa.Jsp
     被视为两个不同的文件,不会触发条件竞争。

  4. Tomcat 编译机制与文件路径一致性

  5. Tomcat 的 Jasper 引擎会根据文件路径生成类名(如org.apache.jsp.aa_jsp
    )。在大小写不敏感的环境中,不一致的文件名可能绕过检查。

  6. 例如,aa.Jsp
     编译生成的.class
     文件被视为aa_jsp
     类,但在请求路径中访问aa.jsp
     会导致类加载失败(ClassNotFoundException
    )。

  7. 条件竞争的时间窗口

  8. 在并发条件下,Windows 不区分文件大小写的特性加剧了竞争,导致 JSP 文件被部分写入或删除时仍然被访问。

缓解措施

  1. 禁用文件写入功能

  2. 禁止通过 HTTP PUT 请求上传文件,确保readonly=true

<init-param>  <param-name>readonly</param-name>  <param-value>true</param-value></init-param>
  1. 启用大小写敏感检查

  2. 确保DefaultServlet
    的配置未禁用大小写敏感性:

<init-param>  <param-name>caseSensitive</param-name>  <param-value>true</param-value></init-param>

注:此方案并不能缓解PUT写入文件

  1. 升级 Tomcat

  2. 检查并应用 Tomcat 的安全补丁,确保使用最新版本。

  3. 调整文件系统设置(可选)

注:此方案并不能缓解PUT写入文件

  1. 在 Windows 上启用文件系统的大小写敏感特性(如通过修改 NTFS 配置),避免文件名冲突。