
CVE-2026-39275 - Cockpit CMS में खाता अधिग्रहण की ओर ले जाने वाला Stored XSS
| CVE ID | CVE-2026-39275 |
| भेद्यता | संग्रहीत क्रॉस-साइट स्क्रिप्टिंग (XSS) → खाता अधिग्रहण |
| CWE | CWE-79 |
| प्रभावित | Cockpit CMS <= 2.13.5 |
| पैच किया गया | d70dc50 |
| CVSS 3.1 | 8.4 (AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N) |
| रिपोर्टकर्ता | Rohith - सुरक्षा सलाहकार @ SecurifyAI |
सामग्री संग्रह सूची दृश्य में एक संग्रहीत XSS भेद्यता किसी भी उपयोगकर्ता को, जिसके पास सामग्री लेखन पहुँच है (एक API key या प्रमाणित संपादक सत्र), मनमाना JavaScript इंजेक्ट करने की अनुमति देती है, जो प्रभावित संग्रह की वस्तु सूची देखने वाले किसी भी व्यवस्थापक या संपादक के ब्राउज़र में निष्पादित होता है।
Cockpit के सत्र टोकन JavaScript से पूर्णतः सुलभ हैं - सत्र कुकी HttpOnly फ्लैग के बिना सेट की जाती है, और CSRF JWT वैश्विक App.csrf चर तथा <html> पर data-csrf विशेषता में उजागर होता है। यह इंजेक्टेड स्क्रिप्ट को दोनों टोकन पढ़ने और उन्हें बाह्य रूप से पुनः चलाने की अनुमति देता है, जिससे CSRF सुरक्षा विफल हो जाती है और पूर्ण सत्र अपहरण तथा खाता अधिग्रहण संभव हो जाता है।
फ़ील्ड render() आउटपुट को आउटपुट एन्कोडिंग के बिना Vue के v-html निर्देश में पारित किया जाता है।
| फ़ाइल | पंक्ति(याँ) | भूमिका |
|---|---|---|
modules/App/assets/vue-components/fields/field-tags.js | 25 - 34 | टैग रेंडरर - कोई एन्कोडिंग नहीं |
modules/App/assets/vue-components/fields/field-select.js | 26 | सेलेक्ट रेंडरर - कोई एन्कोडिंग नहीं |
modules/Content/views/collection/items.php | 149 | v-html सिंक |
curl -X POST "http://localhost:8080/api/content/item/posts" \
-H "Content-Type: application/json" \
-H "api-key: USR-<attacker-api-key>" \
-d '{
"data": {
"title": "Innocent Looking Post",
"tags": [
"",
""
],
"body": "Just a regular post.",
"_state": 1
}
}'
एक व्यवस्थापक या संपादक /content/collection/items/posts पर नेविगेट करता है। टैग रेंडरर संग्रहीत स्ट्रिंग लौटाता है, v-html इसे एक वास्तविक `` तत्व में पार्स करता है, नकली src विफल हो जाता है, और onerror हैंडलर सक्रिय हो जाता है।
अब दोनों टोकन पठनीय हैं - सत्र कुकी document.cookie के माध्यम से और CSRF JWT App.csrf / document.documentElement.getAttribute('data-csrf') के माध्यम से। एक हथियारबंद पेलोड दोनों को बाह्य रूप से निकाल लेता है:

हमलावर चुराई गई कुकी और CSRF टोकन को पुनः चलाकर पूर्ण प्रमाणित व्यवस्थापक पहुँच प्राप्त कर लेता है - और फिर व्यवस्थापक खाते बना सकता है, क्रेडेंशियल बदल सकता है, या सामग्री संशोधित कर सकता है।
एक निम्न-विशेषाधिकार संपादक (या कोई भी सामग्री लेखन API key धारक) पूर्ण व्यवस्थापक स्तर तक पहुँच बढ़ा लेता है। पेलोड संग्रहीत होता है और सूची देखने वाले प्रत्येक व्यवस्थापक/संपादक के लिए सक्रिय हो जाता है, जिससे यह एक स्थायी, बहु-पीड़ित समझौता बन जाता है।
प्राथमिक समाधान - मौजूदा App.utils.stripTags() सहायक का उपयोग करके v-html तक पहुँचने से पहले रेंडर आउटपुट को सैनिटाइज़ करें।
field-tags.js:
value = App.utils.stripTags(value); // sanitize before v-html
field-select.js:
return App.utils.stripTags(value); // sanitize before v-html
गहराई में रक्षा - सत्र कुकी को कठोर बनाएं:
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', 1); // over HTTPS
ini_set('session.cookie_samesite', 'Strict');
अकेले HttpOnly अपर्याप्त है - XSS अभी भी पीड़ित के प्रमाणित ब्राउज़र संदर्भ के भीतर कार्य कर सकता है - इसलिए आउटपुट एन्कोडिंग ही आवश्यक समाधान है।
| दिनांक | घटना |
|---|---|
| 2026-03-29 | भेद्यता Cockpit CMS अनुरक्षकों को सूचित की गई |
| 2026-03-29 | अनुरक्षकों द्वारा समाधान जारी किया गया |
| 2026-04-04 | CVE अनुरोध किया गया |
| 2026-06-23 | CVE-2026-39275 निर्धारित किया गया |
<pub date> | सार्वजनिक प्रकटीकरण |
यह सामग्री समन्वित प्रकटीकरण के बाद शैक्षिक और रक्षात्मक उद्देश्यों के लिए प्रकाशित की गई है। इसका उपयोग केवल उन्हीं प्रणालियों पर करें जिनके आप स्वामी हैं या जिनके परीक्षण के लिए आप स्पष्ट रूप से अधिकृत हैं।