检测和抵御 Apache Tomcat CVE-2025-24813
执行摘要
2025 年 3 月 10 日,Apache Tomcat 中的 路径等价漏洞 (分配有编号 CVE-2025-24813)被公开披露,同时发布的还有针对该漏洞的补丁。
虽然该漏洞可以允许进行 RCE,但 Apache 认为它是一个中等严重程度的漏洞,因为只有满足特定的非默认先决条件时,它才能被利用。
在该漏洞公开后不久,Akamai 就发现了初步的漏洞利用尝试,意图探查潜在的服务器是否存在该漏洞。
在本博文中,Akamai 研究人员详细介绍该漏洞及其利用方式和检测策略。
Akamai 自适应安全引擎快速规则自动为 Akamai App & API Protector 客户提供保护。
我们还提供 Akamai Guardicore Segmentation Insight 查询来进行检测。
- 受影响的 Akamai Hunt 客户已经收到了存在漏洞的资产的详细清单。
什么是 CVE-2025-24813?
Apache Tomcat 是一个热门开源 Web 服务器和 Java Servlet 容器,常用于托管基于 Java 的应用程序。2025 年 3 月 10 日,该软件中的一个路径等价漏洞 (CVE-2025-24813) 被披露,同时发布的还有针对该漏洞的补丁。具体来说,该缺陷会影响服务器内部处理文件路径的方式。在公开的概念验证发布仅仅几天后,攻击者便闻风而动,试图在现实环境中利用该漏洞,这与我们近来观察到的一个令人担忧的趋势相符:漏洞利用时间不断缩短。
由于存在漏洞利用要求,因此 Apache 将 CVE-2025-24813 标记为中等严重程度的漏洞。存在漏洞的服务器必须满足一组特定的先决条件,这导致该问题不太可能遭到利用。但是,无论这些先决条件如何,都必须立即对该漏洞进行修补,因为在遭到利用时它可能会导致未经身份验证的远程代码执行 (RCE)。
该漏洞在 Apache Tomcat 版本 11.0.3、10.1.35 和 9.0.99 中得到了修复,但是 运行版本 11.0.0-M1 到 11.0.2、10.1.0-M1 到 10.1.34 以及 9.0.0-M1 到 9.0.98 的服务器仍然可能受到影响。
什么是 CVE-2025-24813?
当 Apache Tomcat 的默认 Servlet 被配置为启用写入功能(默认情况下处于禁用状态)时,攻击者可以使用 CVE-2025-24813 造成巨大影响。例如,与允许部分 PUT 请求的默认行为相结合时,攻击者可以将特制的序列化会话文件上传到可写目录中。此文件被上传后,后续的 HTTP 请求会强制 Tomcat 对其内容进行反序列化,这会触发嵌入式攻击载荷的执行。
漏洞利用可能会导致 RCE、严重的信息泄露或恶意内容注入,进而可能破坏关键的服务器配置文件。受影响的 Apache Tomcat 版本包括 11.0.0‑M1 到 11.0.2、10.1.0‑M1 到 10.1.34 以及 9.0.0‑M1 到 9.0.98。
CVE-2025-24813 的利用
漏洞利用的最终结果相当严重,但通过此漏洞实现 RCE 需要满足一组严格的 先决条件:
必须对默认的 Servlet 明确启用写入功能
必须允许部分 PUT 请求
Web 应用程序必须将基于文件的会话持久性与默认存储位置结合使用(为恶意的序列化攻击载荷提供可写的目标目录)
此应用程序必须存在或正在使用易受反序列化攻击的库(允许通过反序列化攻击执行攻击载荷)
此外,攻击者必须了解该应用程序使用的内部文件命名约定和攻击目标的文件系统目录结构
虽然大多数先决条件可能都已满足,但最关键的先决条件(默认的 Servlet 写入功能)默认处于禁用状态。
观察到的攻击流量
在该漏洞被披露后不久,Akamai 安全情报组 (SIG) 便发现了攻击流量。所观察到的大多数攻击载荷都是漏洞探测,旨在帮助攻击者确定目标服务器是否存在漏洞。具体来说,另一种常见的攻击会以 .session 文件路径为目标,该路径遵循随机命名方案,即一个六字符的基本名称附加 .session 文件扩展名(图 1)。
最常见的攻击载荷包括一个 .session 文件作为请求正文,该文件由恶意的 Java 序列化对象构成。大多数情况下,在这个已上传的会话文件被 Apache Tomcat 反序列化后,该恶意对象会使用 java.net.URL 对象来“联系大本营”(图 2)。
检测存在漏洞的应用程序
识别一个网络中所有存在漏洞的 Apache Tomcat 实例非常困难。安全团队必须对各种资产进行评估,因为 Apache Tomcat 已集成在很多地方,包括正在使用防御者所不知道的库的应用程序。
与近期的 Apache Camel 漏洞类似, 此库可能作为间接依赖项出现,意味着源代码中并没有明确地包含库,而是通过另一个软件包引入。不论是对于检测还是抵御,这都进一步加剧了复杂性。
Apache Tomcat 可以单独安装在 Windows 和 Linux 上,或者作为 Kava 应用程序的一部分进行安装。可通过对目录进行递归扫描以查找名为 tomcat-api.jar的 Java 归档 (JAR) 文件来检测它。 一旦找到与 Tomcat 相关的 JAR 文件,通过检查其清单文件就能确定所用的版本。
对于提取出来的版本,安全团队可以根据 Apache 的安全建议 进行交叉引用,来评估可能存在的漏洞。以下版本受到影响:
- Apache Tomcat 11.0.0-M1 到 11.0.2
- Apache Tomcat 10.1.0-M1 到 10.1.34
- Apache Tomcat 9.0.0.-M1 到 9.0.98
自动检测
对于 Akamai Guardicore Segmentation 客户,我们已经构建了 Insight 查询,可以识别存在漏洞的资产。该查询将返回 tomcat-api.jar的所有可用路径和哈希值。您可以通过哈希值在 VirusTotal 中检查所返回的 JAR,也可以通过 JAR 内的清单文件来获取正确版本。
Windows — 应用程序内的 Apache Tomcat
WITH relevant_cwds as (
SELECT DISTINCT
proc.pid,
proc.path,
proc.cmdline,
proc.cwd,
mmap.path AS mmap_path
FROM process_memory_map AS mmap
LEFT JOIN processes AS proc USING(pid)
WHERE mmap_path LIKE "%jvm%"
UNION
SELECT DISTINCT
proc.pid,
proc.path,
proc.cmdline,
proc.cwd,
proc.path AS placeholder_path
FROM processes AS proc
WHERE proc.name IN ("java", "javaw", "java.exe", "javaw.exe")
UNION
SELECT DISTINCT
proc.pid,
proc.path,
proc.cmdline,
proc.cwd,
proc.path AS placeholder_path
FROM processes AS proc
WHERE LOWER(proc.name) LIKE "%tomcat%"
),
RELEVANT_JAR_PATHS AS (
SELECT file.path as lib_path, cwd, cwd || '..\%\%\tomcat-api.jar' AS jar_path, sha256
FROM file INNER JOIN relevant_cwds ON file.path LIKE jar_path
INNER JOIN hash on file.path = hash.path
UNION
SELECT file.path as lib_path, cwd, cwd || '..\%\tomcat-api.jar' AS jar_path, sha256
FROM file INNER JOIN relevant_cwds ON file.path LIKE jar_path
INNER JOIN hash on file.path = hash.path
UNION
SELECT file.path as lib_path, cwd, cwd || '%\%\tomcat-api.jar' AS jar_path, sha256
FROM file INNER JOIN relevant_cwds ON file.path LIKE jar_path
INNER JOIN hash on file.path = hash.path
)
SELECT DISTINCT lib_path, cwd, jar_path, sha256
FROM RELEVANT_JAR_PATHS
Linux — 应用程序内的 Apache Tomcat
WITH relevant_cwds as (
SELECT DISTINCT
proc.pid,
proc.path,
proc.cmdline,
proc.cwd,
mmap.path AS mmap_path
FROM process_memory_map AS mmap
LEFT JOIN processes AS proc USING(pid)
WHERE mmap_path LIKE "%jvm%"
UNION
SELECT DISTINCT
proc.pid,
proc.path,
proc.cmdline,
proc.cwd,
proc.path AS placeholder_path
FROM processes AS proc
WHERE proc.name IN ("java", "javaw", "java.exe", "javaw.exe")
UNION
SELECT DISTINCT
proc.pid,
proc.path,
proc.cmdline,
proc.cwd,
proc.path AS placeholder_path
FROM processes AS proc
WHERE LOWER(proc.name) LIKE "%tomcat%"
),
RELEVANT_JAR_PATHS AS (
SELECT file.path as lib_path, cwd, cwd || '../%/%/tomcat-api.jar' AS jar_path, sha256
FROM file INNER JOIN relevant_cwds ON file.path LIKE jar_path
INNER JOIN hash on file.path = hash.path
UNION
SELECT file.path as lib_path, cwd, cwd || '../%/tomcat-api.jar' AS jar_path, sha256
FROM file INNER JOIN relevant_cwds ON file.path LIKE jar_path
INNER JOIN hash on file.path = hash.path
UNION
SELECT file.path as lib_path, cwd, cwd || '%/%/tomcat-api.jar' AS jar_path, sha256
FROM file INNER JOIN relevant_cwds ON file.path LIKE jar_path
INNER JOIN hash on file.path = hash.path
)
SELECT DISTINCT lib_path, cwd, jar_path, sha256
FROM RELEVANT_JAR_PATHS
Windows — 已安装的 Apache Tomcat
SELECT name, version
FROM programs
WHERE name LIKE '%tomcat%'
AND ((version >= '11.0.0' AND version <= '11.0.2') OR (version >= '10.1.0' AND version <= '10.1.34') OR (version >= '9.0.0' AND version <= '9.0.98'))
Linux — 已安装的 Apache Tomcat
SELECT name, version
FROM deb_packages
WHERE name LIKE '%tomcat%'
AND ((version >= '11.0.0' AND version <= '11.0.2') OR (version >= '10.1.0' AND version <= '10.1.34') OR (version >= '9.0.0' AND version <= '9.0.98'))
UNION
SELECT name, version
FROM rpm_packages
WHERE name LIKE '%tomcat%'
AND ((version >= '11.0.0' AND version <= '11.0.2') OR (version >= '10.1.0' AND version <= '10.1.34') OR (version >= '9.0.0' AND version <= '9.0.98'))
利用 Akamai App & API Protector 进行抵御
现有的 Adaptive Security Engine 规则(包括用于检测 Java 反序列化尝试的规则)可以防范很多利用尝试(图 3)。
3000072 - 检测到反序列化攻击
2025 年 3 月 19 日,Akamai 威胁研究团队还部署了适用于 App & API Protector 客户的 Adaptive Security Engine 快速规则,以提供全面覆盖(图 4)。
3000957 — 检测到 Apache Tomcat 远程代码执行攻击 (CVE-2025-24813)
快速规则的版本 1 将默认操作设置为“告警”。为了阻止攻击尝试,建议客户在查看触发器后将规则操作设置为“拒绝”,以消除任何误报。