
CVE-2026-22738 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो Spring AI SimpleVectorStore में एक गंभीर SpEL इंजेक्शन RCE है, जो बिना प्रमाणीकरण के OS कमांड निष्पादन को प्रदर्शित करता है।
SimpleVectorStore.similaritySearch() में Spring Expression Language (SpEL) इंजेक्शन के माध्यम से बिना प्रमाणीकरण के रिमोट कोड निष्पादन।
| Artifact | Vulnerable | Fixed |
|---|
org.springframework.ai:spring-ai-core | 1.0.0 – 1.0.4 | 1.0.5 |
org.springframework.ai:spring-ai-core | 1.1.0-M1 – 1.1.3 | 1.1.4 |
फिक्स कमिट: ba9220b22383e430d5f801ce8e4fa01cf9e75f29
SimpleVectorStore.similaritySearch() कॉलर द्वारा आपूर्ति किए गए फ़िल्टर कुंजी नाम को शब्दशः एक SpEL टेम्पलेट में पास करता है जिसका मूल्यांकन StandardEvaluationContext द्वारा किया जाता है। चूंकि StandardEvaluationContext पूर्ण JVM रिफ्लेक्शन API को उजागर करता है, एक हमलावर इंजेक्ट कर सकता है:
T(java.lang.Runtime).getRuntime().exec(...)
फ़िल्टर कुंजी में, जिससे बिना प्रमाणीकरण के OS कमांड निष्पादन प्राप्त होता है।
सीधा इंजेक्शन तुरंत काम नहीं करता — दो पार्सर विशेषताओं को पार करना आवश्यक है:
' से शुरू होने वाली कुंजी को उद्धृत स्ट्रिंग माना जाता है; बाहरी उद्धरण हटा दिए जाते हैं, जिससे पेलोड विकृत हो जाता है।"..." में लपेटने से पार्सर बाहरी डबल-कोट हटा देता है, जिससे आंतरिक SpEL एक्सप्रेशन #metadata['<KEY>'] को पास किए गए कुंजी मान के रूप में बरकरार रहता है।#metadata[''] का उपयोग करना (अपरिभाषित चर के बजाय) unknown variable SpEL त्रुटि से बचाता है जबकि exec() को ट्रिगर करता रहता है।परिणामी मूल्यांकित एक्सप्रेशन निम्न रूप लेता है:
#metadata[''] + T(java.lang.Runtime).getRuntime().exec(new String[]{'/bin/bash','-c','<cmd>'}) + #metadata[''] == 'x'
HTTP प्रतिक्रिया बॉडी में EL1030E — SpEL रनटाइम त्रुटि शामिल होगी:
operator ADD not supported between null and java.lang.ProcessImpl
यह त्रुटि exec() लौटने के बाद उठाई जाती है, जो बिना आउट-ऑफ-बैंड कॉलबैक के OS-स्तरीय कमांड निष्पादन की पुष्टि करती है।
पूर्वापेक्षाएँ:
pip install requests
एक्सप्लॉइट चलाएँ:
python3 exploit.py [--target http://localhost:8082] [--wait]

Docker Desktop (macOS/Windows): कॉलबैक पेलोड के लिए 127.0.0.1 के बजाय host.docker.internal का उपयोग करें।
PoC पाँच क्रमिक चरण चलाता है:
| Step | Description |
|---|---|
| 1 | बेसलाइन जाँच — पुष्टि करें कि एंडपॉइंट पहुंच योग्य है और सीडेड डेटा लौटाता है |
| 2 | ब्लाइंड SpEL प्रोब — इंजेक्शन बिंदु की पुष्टि के लिए T(java.lang.System) के माध्यम से java.version पढ़ें |
| 3 | RCE: कंटेनर के अंदर touch /tmp/pwned_cve_2026_22738 |
| 4 | RCE: id / uname / hostname आउटपुट को /tmp/rce_proof.txt में लिखें |
| 5 | docker exec के माध्यम से सत्यापित करें — प्रूफ़ फ़ाइल की सामग्री प्रिंट करें |
यह प्रूफ-ऑफ-कॉन्सेप्ट केवल शैक्षिक और अधिकृत सुरक्षा परीक्षण उद्देश्यों के लिए प्रदान किया गया है। उन प्रणालियों के विरुद्ध उपयोग न करें जिनके स्वामी आप नहीं हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति नहीं है।