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>
漏洞利用流程
-
攻击者通过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
被视为同一个文件),当文件写入和访问同时发生时,会导致: -
- JSP 文件被写入时触发编译
-
- 在文件被完全编译成.class
文件并删除前的时间窗口内,某些访问可能会跳过完整检查,触发恶意代码执行。
- 在文件被完全编译成.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 配置),避免文件名冲突。