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文件枚举, 中间件安全, 漏洞复现, 逆向工具