| 字段 | 值 |
|---|
| CVE | CVE-2026-34486 |
| CVSS | 7.5 高危 |
| 类型 | 敏感数据加密缺失 |
| 组件 | Apache Tomcat 集群 EncryptInterceptor |
| 发布时间 | 2026 |
CVE-2026-34486 是由于修复 CVE-2026-29146 时引入的不完全回归缺陷。在 Apache Tomcat 的集群复制机制中,EncryptInterceptor 负责加密和认证集群消息。修复 CVE-2026-29146 时的重构意外地将 super.messageReceived(msg) 调用移到了处理解密失败的 try-catch 块之外。因此,当消息解密失败(即消息以明文形式到达,但拦截器期望加密数据)时,原始未加密的消息仍会被传递到处理链中,而不是被丢弃。
集群消息到达时会调用 EncryptInterceptor.messageReceived() 方法。预期的流程如下:
super.messageReceived(msg) 转发解密后的消息在受影响版本中,解密/验证逻辑仍被包裹在 try-catch 中,但调用链被重构,使得 super.messageReceived(msg) 在保护解密的 try-catch 块 外部 执行。变量 msg 在 try-catch 之前声明,并在块内赋值。当解密抛出异常时,msg 保留其初始(未加密/原始)值,而 catch 块仅记录错误——它不会提前返回。执行继续执行 super.messageReceived(msg),处理未处理的原始数据。
这意味着能够访问 Tomcat 集群端口的攻击者可以注入任意未加密的消息,拦截器将接受并处理这些消息。
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 块内部成功解密后调用,或者| 产品 | 版本 |
|---|---|
| Apache Tomcat 11 | 11.0.20 |
| Apache Tomcat 10 | 10.1.53 |
| Apache Tomcat 9 | 9.0.116 |
EncryptInterceptor 的集群复制功能的受影响 Tomcat 实例<Receiver> 配置)server.xml 中配置了 EncryptInterceptor 的 Tomcat 集群成员。本目录中的 exploit.py 脚本演示了绕过漏洞。它基于 ClusterMessage 序列化格式构造一个最小的 Tomcat 集群消息,并直接发送到接收器端口,不进行任何加密。受影响版本的拦截器会接受并转发该消息,尽管缺少加密。
升级到已修复版本的 Apache Tomcat:
| 产品 | 已修复版本 |
|---|---|
| Apache Tomcat 11 | 11.0.21+ |
| Apache Tomcat 10 | 10.1.54+ |
| Apache Tomcat 9 | 9.0.117+ |
如果无法立即升级,请限制对 Tomcat 集群端口的网络访问,仅允许受信任的主机(例如通过防火墙规则或将接收器绑定到回环地址或私有接口)。