
ProFTPD 1.3.9d - उच्च - रिमोट - क्रैश - RewriteMap int:utf8trans BSS ओवरफ़्लो
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · proftpd-rewrite-utf8trans
राइट-अप: https://abraxaslabs.tech/research/proftpd-rewrite-utf8trans
वर्ग: क्रैश पहुँच: रिमोट
ProFTPD 1.3.9d (f59f248) - ProFTPD (proftpd.org)
contrib mod_rewrite में RewriteMap int:utf8trans शामिल है। यह बिल्टइन क्लाइंट FTP आर्ग्युमेंट (अधिकतम CommandBufferSize, 512 KiB) को दो 1024-स्लॉट BSS बफ़र्स में कॉपी करता है, बिना किसी डेस्टिनेशन कैप के। एक लंबा ASCII STOR नाम ASan global-buffer-overflow WRITE of size 8 उत्पन्न करता है। सत्र चाइल्ड एबॉर्ट हो जाता है। डेमॉन चालू रहता है। वर्ग क्रैश। RCE नहीं।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | क्रैश |
| पहुँच | रिमोट (int:utf8trans को दिया गया FTP आर्ग्युमेंट) |
| CWE | CWE-120 |
| CVSS | उच्च: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H यदि RewriteRule प्री-ऑथ है। लैब ने लॉगिन के बाद STOR का उपयोग किया, इसलिए उस रन के लिए PR:L उचित है (AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H)। |
| उत्पाद | ProFTPD |
| प्रभावित | 1.3.9d (f59f248e26bdfa514443e42bf72a145641df635d) contrib mod_rewrite |
| प्रमाणीकरण | लैब प्रमाणीकृत STOR है। USER या इसी तरह पर प्री-ऑथ RewriteRule PR:N होगा। |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
RewriteEngine कॉन्फ़िगर होने तक बंद रहता है। प्रलेखित पैटर्न RewriteRule (.*) ${map:$1} है। एक बार जब कोई RewriteRule क्लाइंट आर्ग्युमेंट को int:utf8trans के माध्यम से भेजता है, तो 1024 बाइट्स से लंबी कोई भी कुंजी सत्र चाइल्ड में दो स्टैटिक बफ़र्स को ओवरफ़्लो कर देती है।
| विधि | सिंक | विशेषाधिकार |
|---|---|---|
| FTP कमांड जिसका आर्ग्युमेंट utf8trans मैप कुंजी है, लंबाई > 1024 | rewrite_utf8_to_ucs4 फिर utf8_val[i] = ucs4_longs[i] | उपलब्धता (लैब-प्रमाणित): सत्र चाइल्ड को क्रैश करें। ASan: global-buffer-overflow WRITE of size 8, फिर ABORTING। Prefork: एक नया लॉगिन अभी भी काम करता रहा; डेमॉन चालू रहा। 200 ASCII बाइट्स का छोटा STOR बच गया। आस-पास की rewrite BSS अखंडता अनुमानित और कंपाइलर-लेआउट पर निर्भर है। |
| RIP / कोड निष्पादन | कोई दावा नहीं | बंद। कोई पेलोड नहीं। वर्ग क्रैश। RCE नहीं। |
RewriteMap का .ftpaccess प्लांट | CONF_DYNDIR | बंद। .ftpaccess में RewriteMap की अनुमति नहीं है। |
prg: शेल | ऐसा कोई मैप प्रकार नहीं | बंद। FIFO लाइन I/O है। |
लैब-प्रमाणित बनाम अनुमानित: ASan WRITE of size 8, सत्र-चाइल्ड एबॉर्ट, बचने वाला शॉर्ट-आर्ग्युमेंट कंट्रोल, और ट्रिगर के बाद लॉगिन लैब-प्रमाणित हैं। RIP/RCE का दावा नहीं किया गया है।
Issue 2173 ने इस पिन पर int:unescape के एक-बाइट OOB को पैच किया। यह शेष int:utf8trans है। अलग बिल्टइन। अलग बग।
मैंने proftpd/proftpd टैग v1.3.9d को पिन किया। 2026 की CVE फ़सल और उस टारबॉल में अभी भी मौजूद सार्वजनिक GitHub इश्यूज़ (2170, 2173, 2175, 2180, 2095, 2256, 2286, 2319, 2330, 2301) स्किप लिस्ट थे। नमूना basic.conf के साथ डिफ़ॉल्ट कोर FTP ने मुझे कोई अप्रकाशित Crit/High नहीं दिया। contrib rewrite ने दिया।
rewrite_map_int_utf8trans (contrib/mod_rewrite.c) में है:
static unsigned char utf8_val[PR_TUNABLE_BUFFER_SIZE]; /* 1024 */
static unsigned long ucs4_longs[PR_TUNABLE_BUFFER_SIZE]; /* 1024 */
ucs4strlen = rewrite_utf8_to_ucs4(ucs4_longs, strlen(key), (unsigned char *) key);
rewrite_utf8_to_ucs4 प्रत्येक ASCII बाइट के लिए एक unsigned long लिखता है, बिना किसी सीमा के। PR_TUNABLE_CMD_BUFFER_SIZE 512 KiB है। Issue 2173 ने पहले ही unescape को ठीक कर दिया था। यह मैप उस फिक्स में शामिल नहीं था।
गलत रास्ते: 2173 को इस बग के रूप में मानना; ASan द्वारा size 8 का WRITE बताए जाने पर RIP होने का दावा करना; यह उम्मीद करना कि .ftpaccess RewriteMap लगा सकता है। पहला एक अलग फंक्शन है। दूसरा अभी भी Crash है। तीसरा CONF_DYNDIR है।
ASan के साथ-साथ स्टॉक libcrypt, rewrite sink से पहले PASS पर SIGSEGV करता है। लैब एक छोटा crypt(3) स्टब प्रीलोड करता है ताकि लॉगिन काम करे। वह स्टब कोई एक्सप्लॉइट नहीं है।
python3 proftpd-rewrite-utf8trans-Abraxas-Labs.py
या:
cd lab
./run.sh
Loopback 127.0.0.1:18740 के साथ-साथ passive 18741-18750। Compose प्रोजेक्ट proftpd-rewrite-utf8trans। Witness PROFTPD-REWRITE-UTF8TRANS-WITNESS। Image 1.3.9d mod_rewrite का ASan build है। 200 ASCII बाइट्स के STOR का नियंत्रण सफल होता है। 2048 ASCII बाइट्स के STOR में size 8 का ASan global-buffer-overflow WRITE होता है और session child abort हो जाता है। ट्रिगर के बाद नया login अभी भी काम करता है।
SUCCESS PROFTPD-REWRITE-UTF8TRANS asan=global-buffer-overflow write=yes child-dead=yes PROFTPD-REWRITE-UTF8TRANS-WITNESS
rewrite_utf8_to_ucs4 की गंतव्य लंबाई को PR_TUNABLE_BUFFER_SIZE-1 तक सीमित करें। ucs4_longs / utf8_val से आगे लिखना बंद करें। ऐसी मैप कुंजी को अस्वीकार करें या काटें जो फ़िट नहीं होती।
f59f248e26bdfa514443e42bf72a145641df635d)contrib/mod_rewrite.c rewrite_utf8_to_ucs4 / rewrite_map_int_utf8transint:unescapeGNU Affero GPL v3.0. देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।