
CVE-2026-46716 के लिए पुनरुत्पादनीय प्रयोगशाला वातावरण, जो Nezha Monitoring में क्रॉन API प्राधिकरण बायपास के माध्यम से एक महत्वपूर्ण क्रॉस-टेनेंट RCE है। इसमें Nuclei डिटेक्शन टेम्पलेट और Docker-आधारित असुरक्षित/पैच किए गए क्लस्टर शामिल हैं।
Nezha Monitoring में CVE-2026-46716 को पुनरुत्पादित और पहचानने के लिए एक प्रयोगशाला वातावरण, यह एक गंभीर भेद्यता है जहां POST /api/v1/cron एंडपॉइंट में व्यवस्थापक विशेषाधिकार जाँच का अभाव है, जिससे RoleMember उपयोगकर्ता क्रॉस-टेनेंट रिमोट कोड निष्पादन प्राप्त कर सकते हैं।
| क्षेत्र | विवरण |
|---|---|
| CVE ID | CVE-2026-46716 |
| GHSA | GHSA-99gv-2m7h-3hh9 |
| CVSS | 9.9 (गंभीर) — AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
| प्रभावित संस्करण | nezhahq/nezha >= 1.4.0, < 1.14.15-0.20260517022419-d7526351cf97 |
| पैच किया गया | v1.14.15-0.20260517022419-d7526351cf97 (कमिट d7526351cf97, 2026-05-17) |
| CWE | CWE-862 (अनुपस्थित प्राधिकरण), CWE-269 (अनुचित विशेषाधिकार प्रबंधन), CWE-78 (OS कमांड इंजेक्शन) |
भेद्य पथ:
POST /api/v1/cron → commonHandler (केवल JWT प्रमाणीकरण, कोई भूमिका जाँच नहीं)
→ CheckPermission(servers=[])
→ खाली सूची पर पुनरावृत्ति → बिना शर्त true लौटाता है
→ CronTrigger सभी सर्वरों पर ServerShared मैप के माध्यम से कमांड भेजता है
❌ कोई व्यवस्थापक जाँच नहीं, कोई स्वामित्व सत्यापन नहीं → क्रॉस-टेनेंट RCE
पैच किया गया पथ:
POST /api/v1/cron → commonHandler (वही — सदस्यों के लिए अभी भी HTTP 200 लौटाता है)
→ CheckPermission(servers=[]) → true (अपरिवर्तित)
→ CronTrigger: cronCanSendToServer(cr, s) यह जाँचता है कि cr.UserID == s.UserID
✅ कमांड केवल क्रोन निर्माता के स्वामित्व वाले सर्वरों को भेजे जाते हैं
| # | शर्त | विवरण |
|---|---|---|
| 1 | प्रभावित Nezha संस्करण | < 1.14.15-0.20260517022419 |
होस्ट मशीन
├── localhost:8008 ──→ Docker: nezha-vuln (v1.14.14 ⚠ भेद्य)
└── localhost:8009 ──→ Docker: nezha-patched (कमिट d7526351cf97 ✓ पैच किया गया, स्रोत से निर्मित)
| उपकरण | स्थापना |
|---|---|
| Docker Desktop | docker.com |
| nuclei | brew install nuclei |
| curl, python3 | macOS पर पूर्व-स्थापित |
bash scripts/01-setup.sh
पूरा होने पर:
══════════════════════════════════════════════════════
प्रयोगशाला तैयार!
══════════════════════════════════════════════════════
भेद्य (v1.14.14) : http://localhost:8008
पैच किया गया (नवीनतम) : http://localhost:8009
व्यवस्थापक : admin / admin
सदस्य : member / Memberpass123!
══════════════════════════════════════════════════════
नोट: यदि सदस्य खाता निर्माण API अपेक्षित से भिन्न है, तो इसे Nezha UI (
http://localhost:8008, Settings → Users) के माध्यम से मैन्युअल रूप से बनाएँ।
bash scripts/03-trigger-cve.sh
अपेक्षित आउटपुट — भेद्य (v1.14.14):
HTTP 200 — क्रोन बनाया गया (आईडी: 1)
⚠ परिणाम: व्यवस्थापक जाँच बायपास हुई — भेद्य
अपेक्षित आउटपुट — पैच किया गया:
HTTP 403 — पहुँच अस्वीकृत
✓ परिणाम: व्यवस्थापक जाँच लागू — पैच किया गया
# भेद्य क्लस्टर → [critical] निष्कर्ष देना चाहिए
nuclei -duc -t nuclei/CVE-2026-46716.yaml \
-u http://localhost:8008 \
-var username=admin \
-var password=admin
# पैच किया गया क्लस्टर → कोई निष्कर्ष नहीं देना चाहिए
nuclei -duc -t nuclei/CVE-2026-46716.yaml \
-u http://localhost:8009 \
-var username=admin \
-var password=admin
bash scripts/99-teardown.sh
nezha-cve-2026-46716-lab/
├── README.md
├── LAB_SETUP_GUIDE.md # प्रयोगशाला सेटअप गाइड (अंग्रेज़ी)
├── VULNERABILITY_ANALYSIS.md # कोड-स्तरीय भेद्यता विश्लेषण (अंग्रेज़ी)
├── NUCLEI_TEMPLATE_GUIDE.md # Nuclei टेम्पलेट डिज़ाइन और परीक्षण परिणाम (अंग्रेज़ी)
├── docker-compose.yaml
│
├── REPORT/ # कोरियाई रिपोर्ट
│ ├── LAB_REPORT_KR.md
│ ├── Nuclei_Template_Report_KR.md
│ └── Vulnerability_Analysis_KR.md
│
├── nuclei/
│ └── CVE-2026-46716.yaml # Nuclei पहचान टेम्पलेट
│
└── scripts/
├── 01-setup.sh # कंटेनर शुरू करें, सदस्य खाता बनाएँ
├── 03-trigger-cve.sh # PoC: प्राधिकरण बायपास ट्रिगर करें, परिणाम सत्यापित करें
└── 99-teardown.sh # सभी प्रयोगशाला संसाधनों को रोकें और हटाएँ
चरण 1 POST /api/v1/login (व्यवस्थापक क्रेडेंशियल)
→ प्रमाणित करें और JWT टोकन निकालें
चरण 2 GET /api/v1/setting
→ संस्करण फ़ील्ड को भेद्य सीमा (1.4.x – 1.14.14) से मिलाया गया
→ मिलान → निष्कर्ष: भेद्य संस्करण पाया गया
→ कोई मिलान नहीं (>= 1.14.15 या "debug") → कोई निष्कर्ष नहीं
भेद्य और पैच किए गए दोनों संस्करण POST /api/v1/cron के लिए servers:[], cover:1 के साथ HTTP 200 लौटाते हैं — व्यवहारिक पहचान संभव नहीं है। पैच केवल निष्पादन समय पर CronTrigger के अंदर स्वामित्व सत्यापन जोड़ता है, API स्तर पर नहीं। व्यवस्थापक क्रेडेंशियल आवश्यक हैं क्योंकि GET /api/v1/setting केवल RoleAdmin उपयोगकर्ताओं के लिए version फ़ील्ड लौटाता है।
चेतावनी: इस प्रयोगशाला में सभी क्रेडेंशियल केवल सुरक्षा अनुसंधान उद्देश्यों के लिए नकली परीक्षण डेटा हैं। उत्पादन में कभी उपयोग न करें।
| 2 | प्रमाणित खाता | RoleMember (न्यूनतम विशेषाधिकार स्तर) |
| 3 | खाली सर्वर सूची | "servers":[], "cover":1 CheckPermission को बायपास करता है |