
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 कुंजियों तक पहुँच
शोषण की समयरेखा दिखाती है कि आधुनिक खतरे वाले अभिनेता कितनी तेज़ी से काम करते हैं:```
┌──────────────────────────────────────────────────────────────┐
│ CVE-2026-39987 Timeline │
├──────────────────────────────────────────────────────────────┤
│ │
│ T+0h Advisory published │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ T+9h First exploit built from advisory │
│ T+10h Exploitation in the wild confirmed │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ T+10h 0m Attacker connects to /terminal/ws │
│ T+10h 1m Full PTY shell obtained │
│ T+10h 2m .env file located and read │
│ T+10h 3m AWS keys exfiltrated │
│ Total attack time: ~3 minutes │
└──────────────────────────────────────────────────────────────┘
हमला स्वयं तुच्छ रूप से सरल है:``` Step 1: Attacker opens WebSocket connection to /terminal/ws (No authentication needed, no special tools required)
Step 2: Server creates a PTY (pseudo-terminal) session Attacker now has an interactive shell
Step 3: Attacker runs commands: $ cat .env AWS_ACCESS_KEY_ID=AKIA... AWS_SECRET_ACCESS_KEY=... DATABASE_URL=postgres://... OPENAI_API_KEY=sk-...
Step 4: Credentials exfiltrated Attacker now has cloud access, database access, and API keys for AI services
Total time: under 3 minutes Authentication required: none Tools required: any WebSocket client
कोई एक्सप्लॉइट डेवलपमेंट ज़रूरी नहीं। कोई शेलकोड नहीं। कोई मेमोरी करप्शन नहीं। बस एक WebSocket क्लाइंट और एक गायब auth जांच।
---
## प्रभाव विश्लेषण
**Marimo होस्ट पर तत्काल प्रभाव:**
- Marimo प्रोसेस के विशेषाधिकारों के साथ पूर्ण इंटरैक्टिव शेल
- प्रोसेस द्वारा पठनीय सभी फ़ाइलों तक पहुंच (सोर्स कोड, डेटा, क्रेडेंशियल)
- API कुंजियों और रहस्यों वाले पर्यावरण चरों तक पहुंच
- होस्ट सिस्टम पर मनमाने कमांड निष्पादित करने की क्षमता
**क्रेडेंशियल एक्सपोज़र (प्राथमिक हमले का लक्ष्य):**
- `.env` फ़ाइलों या पर्यावरण चरों से AWS एक्सेस कुंजियाँ और गुप्त कुंजियाँ
- GCP/Azure सेवा खाता क्रेडेंशियल
- पासवर्ड के साथ डेटाबेस कनेक्शन स्ट्रिंग्स
- OpenAI, Anthropic, और अन्य AI सेवा API कुंजियाँ
- SSH कुंजियाँ और अन्य प्रमाणीकरण सामग्री
**डाउनस्ट्रीम प्रभाव (चुराए गए क्रेडेंशियल के माध्यम से):**
- क्लाउड इंफ्रास्ट्रक्चर तक अनधिकृत पहुंच (EC2, S3, Lambda, आदि)
- क्लाउड स्टोरेज और डेटाबेस से डेटा एक्सफ़िल्ट्रेशन
- संसाधन दुरुपयोग (क्रिप्टोमाइनिंग, AI API क्रेडिट चोरी)
- क्लाउड और ऑन-प्रिमाइसेस नेटवर्क में पार्श्व गति
**जोखिम प्रवर्धन कारक:**
- नोटबुक वातावरण मनमाना कोड निष्पादित करने के लिए डिज़ाइन किए गए हैं (यही उनका उद्देश्य है)
- डेटा साइंस वातावरण में आमतौर पर प्रशिक्षण कार्यों के लिए व्यापक क्लाउड एक्सेस होता है
- कई Marimo इंस्टेंस सहयोग और दूरस्थ कार्य के लिए इंटरनेट पर उजागर होते हैं
- शोध/प्रयोग वातावरण में सुरक्षा सख्ती अक्सर एक बाद का विचार होती है
---
## प्रभावित संस्करण
| संस्करण | स्थिति |
|---------|--------|
| Marimo 0.23.0+ | **पैच किया गया** |
| Marimo 0.20.5 से 0.22.x | **संभावित रूप से कमजोर** (सलाहकार सीमा और फिक्स के बीच) |
| Marimo <= 0.20.4 | **कमजोर** (पुष्टि की गई सीमा) |
---
## बड़ी तस्वीर: AI/ML टूलचेन पर हमला
CVE-2026-39987 कोई अलग-थलग घटना नहीं है। यह एक स्पष्ट पैटर्न का हिस्सा है जो अप्रैल 2026 में उभरा:
| CVE | उत्पाद | प्रकार | स्थिति |
|:---|:---|:---|:---|
| **CVE-2026-39987** | Marimo | Pre-Auth RCE (WebSocket) | 10 घंटे में एक्सप्लॉइट किया गया |
| **CVE-2026-33017** | Langflow | RCE | CISA KEV (मार्च 26) |
| **CVE-2026-5059** | aws-mcp-server | Command Injection RCE | सार्वजनिक सलाहकार |
| **TorchGeo** | TorchGeo | eval() RCE | सार्वजनिक सलाहकार |
एक ही महीने में चार AI/ML डेवलपमेंट टूल गंभीर RCE कमजोरियों से प्रभावित हुए। AI/ML डेवलपमेंट पाइपलाइन नया शैडो IT बन रही है: व्यापक पहुंच, न्यूनतम सुरक्षा निगरानी, और समृद्ध क्रेडेंशियल स्टोर के साथ तैनात किए गए उपकरण।```
┌─────────────────────────────────────────────────┐
│ Why AI/ML Tools Are Prime Targets │
├─────────────────────────────────────────────────┤
│ │
│ 1. DESIGNED to execute arbitrary code │
│ (that's literally what notebooks do) │
│ │
│ 2. Run with elevated privileges │
│ (GPU access, cloud SDKs, network access) │
│ │
│ 3. Contain high-value credentials │
│ (AWS keys, API tokens, DB connections) │
│ │
│ 4. Often exposed to the network │
│ (for collaboration and remote access) │
│ │
│ 5. Security hardening is an afterthought │
│ (focus on features and UX, not security) │
│ │
│ 6. Users are researchers, not security experts │
│ (default configs, weak passwords, no VPN) │
└─────────────────────────────────────────────────┘
Python स्क्रिप्ट बहु-चरणीय विश्लेषण के माध्यम से कमजोर Marimo इंस्टेंस का पता लगाती है।
यह कैसे काम करता है:
/api/status, /api/health, और / को क्वेरी करता है/terminal/ws पर एक सुरक्षित HTTP अपग्रेड अनुरोध भेजता है (कनेक्शन के माध्यम से कोई डेटा प्रसारित नहीं होता)/terminal/ws (प्रमाणीकरण की आवश्यकता होनी चाहिए) बनाम /ws (प्रमाणीकरण की आवश्यकता के लिए जाना जाता है) के व्यवहार की तुलना करता हैलक्ष्य प्रणालियों पर कोई कमांड निष्पादित नहीं की जाती है। WebSocket हैंडशेक का परीक्षण किया जाता है लेकिन कनेक्शन के माध्यम से कोई डेटा नहीं भेजा जाता। यह जांच पूरी तरह से निष्क्रिय और उत्पादन के लिए सुरक्षित है।
उपयोग:```bash
pip install -r requirements.txt
python CVE-2026-39987_Marimo_RCE_detector.py -t http://marimo-host:2718
python CVE-2026-39987_Marimo_RCE_detector.py -t https://marimo-host:443
python CVE-2026-39987_Marimo_RCE_detector.py -f targets.txt -o results.json -v
python CVE-2026-39987_Marimo_RCE_detector.py -t http://10.0.0.5:2718 --timeout 15
**विकल्प:**
| फ़्लैग | विवरण | डिफ़ॉल्ट |
|------|-------------|---------|
| `-t`, `--target` | एकल लक्ष्य URL (जैसे, `http://host:2718`) | — |
| `-f`, `--file` | लक्ष्य URL वाली फ़ाइल, प्रति पंक्ति एक (`#` टिप्पणियाँ समर्थित) | — |
| `-o`, `--output` | परिणाम JSON फ़ाइल में सहेजें | — |
| `--timeout` | कनेक्शन टाइमआउट सेकंड में | `10` |
| `--verify-ssl` | SSL प्रमाणपत्र सत्यापन सक्षम करें | अक्षम |
| `-v`, `--verbose` | पूर्ण विवरण के साथ विस्तृत आउटपुट | बंद |
**उदाहरण आउटपुट:**```
[*] CVE-2026-39987 Marimo Pre-Auth RCE Scanner
[*] Scanning 1 target(s)...
[*] NOTE: This scanner only checks for endpoint exposure.
[*] No commands are executed on target systems.
======================================================================
Target: http://10.0.0.5:2718
Scan Time: 2026-04-14T16:00:00Z
Risk Level: CRITICAL
======================================================================
Is Marimo: YES
Marimo Version: 0.19.2
/terminal/ws Open: YES — UNAUTHENTICATED
Vulnerable: YES
*** CRITICAL: Pre-authenticated RCE is possible! ***
*** An attacker can get a full PTY shell without any auth ***
Details:
- Marimo instance detected via /api/status
- Marimo version: 0.19.2
- WebSocket upgrade accepted — /terminal/ws accessible WITHOUT auth
- CONFIRMED: /terminal/ws accepts unauthenticated connections while
/ws requires auth — classic CVE-2026-39987 signature
- Version 0.19.2 <= 0.20.4 — VULNERABLE to pre-auth RCE
======================================================================
[*] Scan Complete: 1 targets scanned
[*] Marimo Instances: 1 | Vulnerable: 1 | Critical: 1
======================================================================
sudo cp CVE-2026-39987_Marimo_RCE.nse /usr/share/nmap/scripts/ sudo nmap --script-updatedb
nmap -p 2718 --script CVE-2026-39987_Marimo_RCE
nmap -p 2718,8080,8443,443 --script CVE-2026-39987_Marimo_RCE
nmap -p 2718 --script CVE-2026-39987_Marimo_RCE 10.0.0.0/24
nmap -p 2718 --script CVE-2026-39987_Marimo_RCE -iL targets.txt
nmap -sV -p 2718 --script CVE-2026-39987_Marimo_RCE
**Nmap आउटपुट का उदाहरण:**```
PORT STATE SERVICE
2718/tcp open http
| CVE-2026-39987_Marimo_RCE:
| VULNERABLE:
| Marimo Pre-Auth RCE (CVE-2026-39987)
| State: VULNERABLE
| Risk level: CRITICAL
| Marimo Version: 0.19.2
| /terminal/ws: accessible without authentication
| Description:
| The Marimo /terminal/ws WebSocket endpoint accepts connections
| without authentication, enabling pre-authenticated RCE.
| An attacker can obtain a full PTY shell without any credentials.
| References:
|_ https://nvd.nist.gov/vuln/detail/CVE-2026-39987
यदि आपके पास Marimo इंस्टेंस तक पहुंच है:```bash
curl -s http://:2718/api/status | python3 -m json.tool
curl -s -o /dev/null -w "%{http_code}"
-H "Upgrade: websocket"
-H "Connection: Upgrade"
-H "Sec-WebSocket-Key: dGVzdC1rZXktMTIzNDU2Nzg="
-H "Sec-WebSocket-Version: 13"
http://:2718/terminal/ws
curl -s -o /dev/null -w "%{http_code}"
-H "Upgrade: websocket"
-H "Connection: Upgrade"
-H "Sec-WebSocket-Key: dGVzdC1rZXktMTIzNDU2Nzg="
-H "Sec-WebSocket-Version: 13"
http://:2718/ws
यदि `/terminal/ws` 101 लौटाता है जबकि `/ws` 401/403 लौटाता है, तो यह क्लासिक CVE-2026-39987 सिग्नेचर है।
---
## समझौते के संकेतक
अपने वातावरण में इन संकेतों पर नज़र रखें:
| संकेतक | कहाँ जाँचें | क्या देखें |
|:---|:---|:---|
| अनधिकृत WebSocket कनेक्शन | सर्वर/प्रॉक्सी लॉग | अप्रत्याशित IP से `/terminal/ws` पर कनेक्शन |
| PTY सत्र निर्माण | प्रोसेस मॉनिटरिंग | Marimo सर्वर द्वारा स्पॉन किए गए अप्रत्याशित शेल प्रोसेस |
| फ़ाइल एक्सेस | फ़ाइल ऑडिट लॉग | `.env`, क्रेडेंशियल फ़ाइलों, या SSH कुंजियों का पठन |
| क्रेडेंशियल उपयोग | क्लाउड प्रदाता ऑडिट लॉग | Marimo वातावरण में संग्रहीत कुंजियों का उपयोग करके API कॉल |
| आउटबाउंड डेटा ट्रांसफर | नेटवर्क मॉनिटरिंग | Marimo होस्ट से असामान्य ईग्रेस ट्रैफ़िक |
**जाँच कमांड:**```bash
# Check for active WebSocket connections
ss -tnp | grep <MARIMO_PORT>
# Review process tree for unexpected shells
ps aux --forest | grep -A5 marimo
# Check if .env or credential files were recently accessed
stat .env
stat ~/.aws/credentials
# Review cloud provider activity logs for unauthorized access
aws cloudtrail lookup-events --lookup-attributes AttributeKey=AccessKeyId,AttributeValue=<KEY_ID>
# Check for unauthorized outbound connections
netstat -tnp | grep ESTABLISHED | grep -v 127.0.0.1
तत्काल कार्रवाई (अभी करें):
pip install --upgrade marimo)अल्पकालिक (इस सप्ताह):
.env फ़ाइलों और पर्यावरण चरों की समीक्षा करें जो उजागर हो सकते हैंदीर्घकालिक:
केरेम ओरुक (Kerem Oruç) — साइबर सुरक्षा इंजीनियर