
CVE-2026-39987 के लिए पता लगाने और शोषण टूलकिट, जो Marimo नोटबुक में प्री-ऑथ RCE है। इसमें Python स्कैनर और Nmap NSE स्क्रिप्ट शामिल है, जो WebSocket एंडपॉइंट जांच के माध्यम से कमजोर इंस्टेंस की पहचान करती है।
Marimo में एक प्री-ऑथेंटिकेटेड रिमोट कोड एक्सीक्यूशन भेद्यता पाई गई है, जो डेटा साइंस और AI/ML के लिए एक ओपन-सोर्स Python नोटबुक है। टर्मिनल WebSocket एंडपॉइंट (/terminal/ws) पूरी तरह से ऑथेंटिकेशन वैलिडेशन को छोड़ देता है, जबकि पड़ोसी नोटबुक एंडपॉइंट (/ws) इसे सही ढंग से लागू करता है। एक अनऑथेंटिकेटेड हमलावर /terminal/ws से कनेक्ट होकर बिना किसी क्रेडेंशियल के होस्ट सिस्टम पर पूर्ण इंटरैक्टिव PTY शेल प्राप्त कर सकता है।
खुलासे के 10 घंटे के भीतर वास्तविक दुनिया में इसका शोषण किया गया। हमलावरों ने 3 मिनट से भी कम समय में AWS क्रेडेंशियल चुरा लिए।
Marimo <= 0.20.4 को प्रभावित करता है। Marimo 0.23.0 में ठीक किया गया।
| फ़ील्ड | विवरण |
|---|---|
| CVE ID | CVE-2026-39987 |
| विक्रेता | Marimo प्रोजेक्ट |
| उत्पाद | Marimo (Python नोटबुक) |
| प्रभावित संस्करण | <= 0.20.4 |
| CVSS v3.1 | 9.3 (क्रिटिकल) |
| CWE | CWE-306 — महत्वपूर्ण फ़ंक्शन के लिए ऑथेंटिकेशन का अभाव |
| हमला वेक्टर | नेटवर्क |
| ऑथेंटिकेशन | कोई आवश्यकता नहीं |
| उपयोगकर्ता इंटरैक्शन | कोई नहीं |
| शोषण परिपक्वता | वास्तविक दुनिया में सक्रिय रूप से शोषित |
| शोषण का समय | खुलासे के ~10 घंटे बाद |
| पैच किया गया | Marimo 0.23.0 |
Marimo एक ओपन-सोर्स रिएक्टिव Python नोटबुक है जिसे Jupyter के आधुनिक विकल्प के रूप में डिज़ाइन किया गया है। इसे डेटा साइंस, AI/ML प्रयोग और इंटरैक्टिव डेटा विश्लेषण के लिए बनाया गया है। इसकी प्रमुख विशेषताओं में स्वचालित डिपेंडेंसी ट्रैकिंग, प्रतिलिपि योग्य निष्पादन, और पारंपरिक नोटबुक की तुलना में एक स्वच्छ डेवलपर अनुभव शामिल है।
Marimo Python और AI/ML समुदाय में तेजी से लोकप्रियता प्राप्त कर रहा है, विशेष रूप से उन प्रैक्टिशनरों के बीच जो Jupyter की तुलना में अधिक संरचित नोटबुक वर्कफ़्लो चाहते हैं।
सभी नोटबुक वातावरणों की तरह, Marimo इंस्टेंस के पास आमतौर पर संवेदनशील संसाधनों तक पहुंच होती है: क्लाउड क्रेडेंशियल (AWS, GCP, Azure), डेटाबेस कनेक्शन स्ट्रिंग, AI सेवाओं के लिए API कीज़ (OpenAI, Anthropic, आदि), और आंतरिक नेटवर्क एक्सेस। पारंपरिक वेब एप्लिकेशन के विपरीत, नोटबुक मनमाना कोड निष्पादित करने के लिए डिज़ाइन किए गए हैं। यही उनका मूल उद्देश्य है।
यह संयोजन नोटबुक वातावरण में किसी भी ऑथेंटिकेशन बायपास को विशेष रूप से विनाशकारी बनाता है।``` Typical Marimo Deployment:
┌──────────────┐ ┌────────────────────────────────┐ │ │ HTTP │ Marimo Server │ │ Browser │────────>│ │ │ (User) │ │ ┌──────────────────────────┐ │ │ │<────────│ │ /ws (Notebook) │ │ └──────────────┘ WS │ │ ✅ validate_auth() │ │ │ └──────────────────────────┘ │ │ │ │ ┌──────────────────────────┐ │ │ │ /terminal/ws │ │ │ │ ❌ NO AUTH CHECK │ │ │ └──────────────────────────┘ │ │ │ │ ┌──────────────────────────┐ │ │ │ Python Environment │ │ │ │ .env files │ │ │ │ AWS credentials │ │ │ │ API keys │ │ │ └──────────────────────────┘ │ └────────────────────────────────┘
---
## भेद्यता का गहन विश्लेषण
### दो WebSocket एंडपॉइंट
Marimo का सर्वर विभिन्न सुविधाओं के लिए कई WebSocket एंडपॉइंट लागू करता है। दो मुख्य एंडपॉइंट के बीच महत्वपूर्ण अंतर एक प्रमाणीकरण जांच की उपस्थिति (या अनुपस्थिति) है:```
Authentication Flow Comparison:
/ws (Notebook WebSocket):
┌─────────┐ ┌───────────────┐ ┌──────────┐ ┌───────────┐
│ Connect │───>│ validate_auth │───>│ Accept │───>│ Notebook │
└─────────┘ └───────┬───────┘ └──────────┘ └───────────┘
│
❌ Reject if
not authenticated
/terminal/ws (Terminal WebSocket):
┌─────────┐ ┌───────────────┐ ┌──────────┐ ┌───────────┐
│ Connect │───>│ Check mode & │───>│ Accept │───>│ PTY Shell │
└─────────┘ │ platform only │ └──────────┘ └───────────┘
└───────────────┘
⚠️ No auth check!
Anyone gets a shell!
नोटबुक एंडपॉइंट (/ws) WebSocket कनेक्शन स्वीकार करने से पहले उपयोगकर्ता की पहचान सत्यापित करने के लिए सही ढंग से validate_auth() को कॉल करता है। यह अपेक्षित सुरक्षा व्यवहार है।
टर्मिनल एंडपॉइंट (/terminal/ws) केवल यह जाँचता है कि सर्वर रनिंग मोड में है या नहीं और क्या प्लेटफ़ॉर्म टर्मिनल कार्यक्षमता का समर्थन करता है। यह कभी भी validate_auth() को कॉल नहीं करता। इन बुनियादी जाँचों को पास करने के बाद, यह कनेक्शन स्वीकार करता है और एक पूर्ण PTY (pseudo-terminal) सत्र बनाता है।```python
async def websocket_connect(self, message): await self.validate_auth() # ✅ Checks authentication await self.accept() # ... notebook communication
async def websocket_connect(self, message): if not self.is_running_mode(): # Only checks mode await self.close() return if not self.is_platform_supported(): # Only checks platform await self.close() return await self.accept() # ❌ No auth! Anyone gets a shell # ... PTY shell creation
यह **CWE-306: Missing Authentication for Critical Function** है। सर्वर पर सबसे खतरनाक एंडपॉइंट (जो एक इंटरैक्टिव शेल प्रदान करता है) पर कोई प्रमाणीकरण नहीं है।
### हमला: 3 मिनट में AWS कुंजियों तक पहुँच