razureink/cve-2026-34486-tomcat_encrypt_bypass_reproduction
GitHub: razureink/cve-2026-34486-tomcat_encrypt_bypass_reproduction
复现 Apache Tomcat 集群 EncryptInterceptor 加密绕过漏洞(CVE-2026-34486),提供漏洞原理分析与 PoC 利用脚本。
Stars: 0 | Forks: 0
# CVE-2026-34486:Apache Tomcat EncryptInterceptor 绕过漏洞
| 字段 | 值 |
|-------|-------|
| **CVE** | CVE-2026-34486 |
| **CVSS** | 7.5 高危 |
| **类型** | 敏感数据缺少加密 |
| **组件** | Apache Tomcat Cluster EncryptInterceptor |
| **发布日期** | 2026 |
## 概述
CVE-2026-34486 是由 [CVE-2026-29146](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-29146) 的不完整修复引入的一个回退漏洞。在 Apache Tomcat 的集群复制中,`EncryptInterceptor` 负责对集群消息进行加密和验证。针对 CVE-2026-29146 的修复在进行重构时,无意中将 `super.messageReceived(msg)` 调用移出了处理解密失败的 try-catch 块。结果,当消息解密失败时(即:接收到的是明文,但 interceptor 期望的是加密数据),原始的未加密消息仍会被传递到处理程序链中,而不是被丢弃。
## 技术细节
### 代码流程回退
当集群消息到达时,会调用 `EncryptInterceptor.messageReceived()` 方法。预期的流程是:
1. 接收原始消息字节
2. 解密并验证消息(在 try-catch 块内)
3. 如果解密成功,调用 `super.messageceived(msg)` 转发解密后的消息
4. 如果解密失败,丢弃该消息(或记录错误)
在受影响的版本中,解密/验证逻辑仍然包裹在 try-catch 块中,但调用链经过了重构,导致 `super.messageReceived(msg)` 在保护解密的 try-catch 块**外部**执行。变量 `msg` 在 try-catch 块之前声明,并在其中赋值。当解密抛出异常时,`msg` 保留其初始值(未加密/原始值),并且 catch 块仅记录错误——它不会提前返回。程序会继续使用未处理的原始数据执行到 `super.messageReceived(msg)`。
这意味着,能够访问 Tomcat 集群端口的攻击者可以注入任意的未加密消息,而 interceptor 会接受并处理这些消息。
### Bug 的简化伪代码
```
public void messageReceived(Message msg) {
// msg arrives raw
try {
// decrypt and populate msg fields
decrypt(msg);
} catch (Exception e) {
log.error("Decryption failed", e);
// BUG: no return statement here
}
// msg is still the original unencrypted object when catch is hit
super.messageReceived(msg); // outside try-catch → passes raw data
}
```
修复方案必须确保满足以下条件之一:
- `super.messageReceived(msg)` 仅在成功解密后在 try 块内被调用,或者
- catch 块立即返回,从而确保未加密消息永远不会被转发。
## 受影响版本
| 产品 | 版本 |
|---------|----------|
| Apache Tomcat 11 | 11.0.20 |
| Apache Tomcat 10 | 10.1.53 |
| Apache Tomcat 9 | 9.0.116 |
## 复现
### 前置条件
- 一个易受攻击的 Tomcat 实例,且启用了使用 `EncryptInterceptor` 的集群复制
- 拥有访问 Tomcat 集群端口的网络权限(通常为 4000 或 5000,通过 `` 进行配置)
- Python 3.6+
### 步骤
1. 在 `server.xml` 中找到配置了 `EncryptInterceptor` 的 Tomcat 集群成员。
2. 确定集群接收器的地址和端口。
3. 运行漏洞利用脚本,发送构造好的原始集群消息。
4. 观察接收器是否接受并记录了该消息,从而绕过加密验证。
## PoC
此目录中的 `exploit.py` 脚本演示了该绕过漏洞。它构造了一个最小化的 Tomcat 集群消息(基于 `ClusterMessage` 序列化格式),并在不进行任何加密的情况下直接将其发送到接收器端口。易受攻击的 interceptor 将接受并转发该消息,尽管缺少加密。
## 缓解措施
将 Apache Tomcat 升级到已修复版本:
| 产品 | 已修复版本 |
|---------|-----------------|
| Apache Tomcat 11 | 11.0.21+ |
| Apache Tomcat 10 | 10.1.54+ |
| Apache Tomcat 9 | 9.0.117+ |
如果无法立即升级,请将 Tomcat 集群端口的网络访问权限限制为仅受信任的主机(例如,通过防火墙规则或将接收器绑定到环回或私有网络接口)。
## 参考
- [CVE-2026-34486](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-34486)
- [CVE-2026-29146](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-29146)(原始漏洞)
- [Apache Tomcat 安全公告](https://tomcat.apache.org/security.html)
- [EncryptInterceptor 文档](https://tomcat.apache.org/tomcat-10.1-doc/cluster-howto.html)
标签:Apache Tomcat, CISA项目, JS文件枚举, 中间件安全, 漏洞复现, 逆向工具