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-appPUBLIC"-//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>
漏洞利用流程
-
攻击者通过 PUT
请求向服务器上传恶意 JSP 文件:-
例子文件: aa.Jsp
和bb.Jsp
。 -
恶意 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
-
-
并发访问上传的 JSP 文件: -
利用条件竞争,攻击者通过 GET
请求并发访问目标 JSP 文件,例如访问aa.jsp
。 -
请求示例: GET /tomcat-CVE-2024-50379/aa.jsp HTTP/1.1Host: 192.168.2.128:58093User-Agent: Mozilla/5.0
-
-
Tomcat 的编译与加载过程出现 Race Condition: -
JSP 文件被写入时触发编译。 -
在文件被完全编译成 .class
文件并删除前的时间窗口内,某些访问可能会跳过完整检查,触发恶意代码执行。
-
-
-
在 Windows 系统中,由于文件名不区分大小写( aa.Jsp
与aa.jsp
被视为同一个文件),当文件写入和访问同时发生时,会导致: - 1. JSP 文件被写入时触发编译
- 2. 在文件被完全编译成
.class
文件并删除前的时间窗口内,某些访问可能会跳过完整检查,触发恶意代码执行。
-
漏洞复现细节
-
示例攻击行为: -
通过并发 PUT
上传和GET
请求访问,可能在以下情况下出现 500 错误:HTTP Status 500 – Internal Server ErrorMessage java.lang.ClassNotFoundException: org.apache.jsp.aa_jsp
-
错误原因是 Tomcat 在编译 JSP 文件的过程中,因条件竞争未能正确加载类文件。
-
-
关键影响: -
在恶意 JSP 文件成功加载的情况下,可执行任意代码(如 Runtime.getRuntime().exec("calc")
)。
-
漏洞为何仅影响 Windows 环境?
-
文件系统对大小写的敏感性: -
Windows 使用的 NTFS 文件系统对文件名不区分大小写, aa.jsp
和aa.Jsp
被视为同一个文件。 -
在 Linux 和 macOS 上,文件系统(如 ext4、APFS)对文件名大小写敏感, aa.jsp
和aa.Jsp
被视为两个不同的文件,不会触发条件竞争。
-
-
Tomcat 编译机制与文件路径一致性: -
Tomcat 的 Jasper 引擎会根据文件路径生成类名(如 org.apache.jsp.aa_jsp
)。在大小写不敏感的环境中,不一致的文件名可能绕过检查。 -
例如, aa.Jsp
编译生成的.class
文件被视为aa_jsp
类,但在请求路径中访问aa.jsp
会导致类加载失败(ClassNotFoundException
)。
-
-
条件竞争的时间窗口: -
在并发条件下,Windows 不区分文件大小写的特性加剧了竞争,导致 JSP 文件被部分写入或删除时仍然被访问。
-
缓解措施
-
禁用文件写入功能: -
禁止通过 HTTP PUT 请求上传文件,确保 readonly=true
<init-param><param-name>readonly</param-name><param-value>true</param-value></init-param>
-
-
启用大小写敏感检查: -
确保 DefaultServlet
的配置未禁用大小写敏感性:<init-param><param-name>caseSensitive</param-name><param-value>true</param-value></init-param>
注:此方案并不能缓解PUT写入文件
-
-
升级 Tomcat: -
检查并应用 Tomcat 的安全补丁,确保使用最新版本。
-
-
调整文件系统设置(可选): 注:此方案并不能缓解PUT写入文件
-
在 Windows 上启用文件系统的大小写敏感特性(如通过修改 NTFS 配置),避免文件名冲突。
-
原文始发于微信公众号(薛定谔的安全):Tomcat CVE-2024-50379 条件竞争漏洞
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论