
End-to-end reproduction and cross-layer detection of CVE-2026-53576, the unauthenticated RCE in Kestra - taken past the base PoC to show how a common Docker-socket misconfiguration turns container-root into full host compromise.
Kestra, एक ओपन-सोर्स वर्कफ़्लो ऑर्केस्ट्रेशन प्लेटफ़ॉर्म, ने एक ऑथेंटिकेशन फ़िल्टर भेजा जो यह तय करता था कि किसी अनुरोध को क्रेडेंशियल्स की आवश्यकता है या नहीं, यह जाँच करके कि URL /configs पर समाप्त होता है या नहीं - यह जाँच एक हानिरहित सार्वजनिक एंडपॉइंट को उजागर करने के लिए थी।
चूँकि जाँच केवल स्ट्रिंग के अंत को देखती थी, कोई भी अनुरोध जिसका URL उस तरह से समाप्त होता था, ऑथेंटिकेशन को पूरी तरह से छोड़ देता था, जिसमें वे एंडपॉइंट भी शामिल थे जो मनमाना कोड बनाते और चलाते हैं। परिणाम: कोई भी व्यक्ति जो नेटवर्क पर एक कमज़ोर Kestra इंस्टेंस तक पहुँच सकता है, शून्य क्रेडेंशियल्स के साथ root के रूप में कमांड चला सकता है, कोई फ़िशिंग नहीं, कोई पासवर्ड अनुमान नहीं, कोई विशेषाधिकार वृद्धि चरण आवश्यक नहीं।
इस अभ्यास में, उस एकल अंतराल को एक स्व-होस्टेड लैब इंस्टेंस के विरुद्ध शुरू से अंत तक निभाया गया:
प्रत्येक चरण को रक्षात्मक टेलीमेट्री (नेटवर्क IDS, होस्ट रनटाइम सुरक्षा, Linux ऑडिट, और सिस्टम लॉग) के विरुद्ध कैप्चर किया गया।
यदि अनपैच्ड छोड़ा जाए तो व्यावसायिक प्रभाव: Kestra चलाने वाले होस्ट का पूर्ण समझौता, केवल एप्लिकेशन का नहीं - और विस्तार से उस होस्ट से पहुँचने योग्य किसी भी अन्य चीज़ का भी।
समाधान: Kestra 1.0.45 / 1.3.21 या बाद के संस्करण में अपग्रेड करें (अकेला पैच प्राथमिक भेद्यता को बंद कर देता है; वृद्धि और दृढ़ता के चरणों के लिए एक अलग, स्वतंत्र समाधान की आवश्यकता होती है - Docker सॉकेट को एप्लिकेशन कंटेनरों में माउंट न करें, अनुभाग 8 देखें)।
यह रिपोर्ट CVE-2026-53576 का दस्तावेज़ीकरण करती है, जो Kestra ≤1.3.20 में एक CVSS 10.0 अनऑथेंटिकेटेड रिमोट कोड निष्पादन भेद्यता है, जो एक पाथ-सफ़िक्स ऑथेंटिकेशन बायपास (AuthenticationFilter.java, endsWith("/configs")) के कारण होती है।
एक हमलावर जो किसी वर्कफ़्लो का नेमस्पेस और ID configs नाम देता है, बिना क्रेडेंशियल्स के, Kestra कंटेनर के अंदर root के रूप में मनमाना शेल कमांड बना और चला सकता है। 1.0.45 और 1.3.21 में ठीक किया गया। यही बग स्वतंत्र रूप से CVE-2026-49869 के अंतर्गत भी रिपोर्ट किया गया था, जो CISA KEV-सूचीबद्ध संख्या है जो वास्तविक इन-द-वाइल्ड शोषण से जुड़ी है। दोनों को एक साथ उद्धृत किया जाना चाहिए, क्योंकि सार्वजनिक स्रोत और स्कैनर या तो किसी एक का संदर्भ दे सकते हैं।
| कमज़ोर | Kestra ≤ 1.3.20 (और 1.0.x लाइन पर pre-1.0.45) |
| ठीक किया गया | 1.0.45 / 1.3.21+ |
| CVE | CVE-2026-53576 |
| जुड़वाँ सलाह | CVE-2026-49869 - वही बग, CISA KEV-सूचीबद्ध (इन-द-वाइल्ड) |
| दिनांक | घटना |
|---|---|
| 2026-06-02 | Kestra 1.3.21 जारी; चेंजलॉग "ऑथेंटिकेशन फ़िल्टर में संभावित ऑथेंटिकेशन बायपास" का संदर्भ देता है |
| 2026-06-03 | Kestra 1.0.45 1.0.x लाइन पर जारी |
| 2026-09-02 | CVE-2026-49869 (जुड़वाँ सलाह) CISA KEV कैटलॉग में जोड़ा गया |
| 2026-09-22 से 09-24 | यह लैब प्रतिकृति, डिटेक्शन बिल्ड, और क्रॉस-लेयर सत्यापन |
स्व-होस्टेड होमलैब:
- Debian होस्ट (होस्टनाम docker, कर्नेल 6.12.107+deb13-amd64),
- Docker Engine 29.8.1।
- Kestra आधिकारिक kestra/kestra:v1.3.20 इमेज के रूप में तैनात, kestra.int.atlasvec.com पर एक Caddy रिवर्स प्रॉक्सी के माध्यम से पहुँच योग्य।
- परीक्षण के अंतर्गत टेलीमेट्री स्टैक: Falco (रनटाइम/eBPF, होस्ट-स्तर),
- Suricata 8.0.3 IDS (निष्क्रिय SPAN मिरर), Splunk की ओर अग्रेषित।
कुछ भी छूने से पहले, मैंने पुष्टि की कि लक्ष्य वास्तव में कमज़ोर था और टेलीमेट्री स्टैक सक्रिय था। मैंने हमले-पूर्व स्थिति का स्नैपशॉट भी लिया ताकि काम पूरा होने पर मैं वापस लौट सकूँ।
Kestra कमज़ोर संस्करण चला रहा है:

कंटेनर स्वयं, चालू और पहुँच योग्य:

होस्ट पर लोड किए गए Falco के यूनिट:

Falco सक्रिय रूप से इवेंट उत्सर्जित कर रहा है (आधुनिक eBPF मोड):

Suricata की सेवा सक्रिय:

और इसका eve.json लाइव इवेंट लिख रहा है:

यह दो गलतियाँ हैं जो एक साथ मिलती हैं, एक नहीं।
पहला, ऑथेंटिकेशन फ़िल्टर यह तय करता है कि कोई अनुरोध ऑथ को छोड़ सकता है या नहीं, यह अनुरोध पथ के अंत से मिलान करके करता है:```java // AuthenticationFilter.java — the vulnerable check, confirmed against the self-hosted v1.3.20 source if (path.endsWith("/configs")) { // treated as a public, unauthenticated path }
यह जाँच एक हानिरहित एंडपॉइंट, सार्वजनिक इंस्टेंस कॉन्फ़िग को उजागर करने के लिए मौजूद है। चूँकि `endsWith` केवल स्ट्रिंग के अंत को पढ़ता है, यह एक सुरक्षित पथ को किसी अन्य पथ से अलग नहीं बता सकता जो संयोगवश उसी तरह समाप्त होता है।
दूसरा, Kestra का राउटर अभी भी उन मिलते-जुलते पथों को उनके वास्तविक, संवेदनशील हैंडलरों तक पहुँचाता है। `/api/v1/main/flows/configs` फ़्लो-क्रिएट हैंडलर तक पहुँचता है। `/api/v1/main/executions/configs/configs` एक्ज़ीक्यूशन हैंडलर तक पहुँचता है। फ़िल्टर दोनों को सार्वजनिक के रूप में पास कर देता है, और राउटर उन्हें वैसे भी चलाता है। किसी फ़्लो के namespace और ID को `configs` नाम दें, और एक कोड-निष्पादक एंडपॉइंट अब `/configs` पर समाप्त होता है, इसलिए यह सार्वजनिक पथ के मुफ़्त पास को विरासत में ले लेता है।
कैप्चर किया गया अनुरोध युग्म इसे स्पष्ट रूप से दिखाता है। बिना क्रेडेंशियल के `GET /api/v1/main/flows/search` `401` लौटाता है। उसी खाली auth हेडर के साथ `POST /api/v1/main/flows/configs` `200` लौटाता है और फ़्लो को संग्रहीत करता है (§5.1 देखें)।
## 5. हमला सिमुलेशन