
Reproducer for CVE-2026-43867 — Apache Camel camel-pqc AwsSecretsManagerKeyLifecycleManager unsafe key-metadata deserialization (RCE)
यह प्रोजेक्ट Apache Camel के camel-pqc घटक में एक जावा डिसीरियलाइज़ेशन भेद्यता प्रदर्शित करता है, जिसे CVE-2026-43867 के रूप में ट्रैक किया गया है। AwsSecretsManagerKeyLifecycleManager.deserializeMetadata() AWS Secrets Manager सीक्रेट से संग्रहीत पोस्ट-क्वांटम कुंजी मेटाडेटा को Base64-डिकोड करके और इसे बिना किसी ObjectInputFilter के java.io.ObjectInputStream.readObject() के साथ डिसीरियलाइज़ करके पढ़ता है — KeyMetadata में कास्ट readObject() लौटने के बाद ही होता है, इसलिए readObject() के सभी साइड इफेक्ट पहले चलते हैं। एक प्रिंसिपल जो उस सीक्रेट (secretsmanager:PutSecretValue) पर लिख सकता है, वह एक निर्मित सीरियलाइज़्ड ऑब्जेक्ट संग्रहीत कर सकता है जो सामान्य कुंजी-जीवनचक्र संचालन के दौरान डिसीरियलाइज़ होता है, जो संभावित रूप से कोड निष्पादन की ओर ले जाता है।
परामर्श: https://camel.apache.org/security/CVE-2026-43867.html
यही दोष CVE-2026-46590 (स्वतंत्र रूप से रिपोर्ट किया गया; उस परामर्श में HashiCorp Vault और फ़ाइल-आधारित सहायक प्रबंधक भी शामिल हैं), और CVE-2026-40048 (CAMEL-23200) का अपूर्ण-सुधार अनुवर्ती है, जिसने
FileBasedKeyLifecycleManagerको JSON/PKCS#8/X.509 प्रारूप में बदल दिया लेकिन कोईObjectInputFilterनहीं जोड़ा और AWS/Vault प्रबंधकों को कवर नहीं किया।
// AwsSecretsManagerKeyLifecycleManager - प्रभावित 4.18.2
private KeyMetadata deserializeMetadata(String base64) throws Exception {
byte[] data = Base64.getDecoder().decode(base64);
ByteArrayInputStream bais = new ByteArrayInputStream(data);
try (ObjectInputStream ois = new ObjectInputStream(bais)) { // कोई ObjectInputFilter नहीं
return (KeyMetadata) ois.readObject(); // गैजेट यहाँ फायर होता है, कास्ट से पहले
}
}
getKeyMetadata(keyId) <keyPrefix>/<keyId>/metadata नामक सीक्रेट को पढ़ता है, इसके JSON आवरण ({"metadata":"<base64>","keyId":...,"algorithm":...}) को पार्स करता है, और metadata फ़ील्ड को deserializeMetadata को भेजता है। फिक्स (4.18.3 / 4.21.0) एक साझा KeyMetadataCodec पेश करता है जो सभी प्रबंधकों के लिए मेटाडेटा को JSON के रूप में संग्रहीत करता है और एक अनुमति-सूची ObjectInputFilter के साथ शेष विरासत ObjectInputStream रीड को बाधित करता है।
पीड़ित वह एप्लिकेशन है जो AWS प्रबंधक के साथ PQC कुंजियों का प्रबंधन करता है। हमलावर वह प्रिंसिपल है जो मेटाडेटा सीक्रेट (secretsmanager:PutSecretValue) लिख सकता है। यह PoC AWS Secrets Manager को अनुकरण करने के लिए LocalStack का उपयोग करता है; /exploit/attack एंडपॉइंट एक निर्मित मेटाडेटा सीक्रेट लिखता है और फिर प्रबंधक के रीड पथ को चलाता है।
CVE-2026-43867/
├── pom.xml # camel-pqc 4.18.2 + aws-sdk secretsmanager 2.41.28 + commons-collections 3.2.1
├── Dockerfile # ऐप चलाता है (गैजेट निर्माण के लिए --add-opens)
├── docker-compose.yml # LocalStack (Secrets Manager) + पुनरुत्पादक ऐप
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── Gadget.java # CommonsCollections6 गैजेट, readObject() के दौरान फायर करता है
│ └── ExploitController.java # निर्मित सीक्रेट लिखता है, फिर getKeyMetadata() कॉल करता है
└── resources/
└── application.properties
वास्तविक हमले में सीरियलाइज़्ड बाइट्स हमलावर द्वारा ऑफ़लाइन उत्पन्न की जाती हैं (उदाहरण के लिए ysoserial के साथ)। यह PoC गैजेट को इन-प्रोसेस बनाता है, यही कारण है कि JVM
--add-opens java.base/java.util=ALL-UNNAMEDके साथ चलता है — यह एक गैजेट-निर्माण विवरण है, जो भेद्यता से असंबंधित है।
mvn clean package -DskipTests
docker compose up -d --build
यह LocalStack (AWS Secrets Manager का अनुकरण) और पुनरुत्पादक ऐप शुरू करता है, जो अपने AwsSecretsManagerKeyLifecycleManager को एंडपॉइंट ओवरराइड के माध्यम से LocalStack की ओर इंगित करता है।
curl -s http://localhost:8080/exploit/attack
# -> Wrote crafted serialized metadata to AWS Secrets Manager secret 'pqc/keys/victim-key/metadata'.
# getKeyMetadata() threw java.lang.ClassCastException (expected — the gadget runs during readObject ...)
#
# >>> RCE proof — /tmp/pwned exists: true
docker exec cve-2026-43867 ls -la /tmp/pwned
docker compose down
कोई भी एप्लिकेशन जो AwsSecretsManagerKeyLifecycleManager का उपयोग करता है और जिसका कुंजी-मेटाडेटा सीक्रेट एप्लिकेशन के स्वयं के विश्वसनीय पहचान के अलावा किसी अन्य पक्ष द्वारा लिखा जा सकता है। डिसीरियलाइज़ेशन सामान्य कुंजी-जीवनचक्र संचालन (getKeyMetadata, loadExistingKeys, listKeys, रोटेशन जाँच, …) के दौरान चलता है।
AwsSecretsManagerKeyLifecycleManager का उपयोग करने वाला एप्लिकेशन।secretsmanager:PutSecretValue उस पर) लिख सकता है।commons-collections:3.2.1)।4.18.3 / 4.21.0 (CAMEL-23726) में अपग्रेड करें। मेटाडेटा JSON के रूप में संग्रहीत किया जाता है और किसी भी शेष विरासत ObjectInputStream रीड को एक अनुमति-सूची ObjectInputFilter द्वारा बाधित किया जाता है।
अपग्रेड करने तक:
secretsmanager:PutSecretValue प्रतिबंधित करें।यह पुनरुत्पादक सुरक्षा अनुसंधान और अधिकृत परीक्षण के लिए, एक सार्वजनिक रूप से प्रकट और सुधारित भेद्यता के लिए प्रदान किया गया है। इसका उपयोग बिना स्पष्ट अनुमति के सिस्टम के विरुद्ध न करें।
| गुण | मूल्य |
|---|
| घटक | camel-pqc (AwsSecretsManagerKeyLifecycleManager) |
| प्रभावित क्लास | org.apache.camel.component.pqc.lifecycle.AwsSecretsManagerKeyLifecycleManager#deserializeMetadata |
| CWE | CWE-502: अविश्वसनीय डेटा का डिसीरियलाइज़ेशन |
| प्रभाव | कुंजी-प्रबंधन एप्लिकेशन में कोड निष्पादन (मेटाडेटा सीक्रेट पर लिखने की पहुंच आवश्यक) |
| प्रभावित संस्करण | 4.18.0 से 4.18.3 से पहले, 4.19.0 से 4.21.0 से पहले |
| सुधारित संस्करण | 4.18.3, 4.21.0 (camel-pqc 4.14.x LTS लाइन पर नहीं है) |
| JIRA | CAMEL-23726 |
| रिपोर्टर | वेंकटरमन कुमार (Securin) |