
ProFTPD 1.3.9d - عالي - عن بُعد - انهيار - تجاوز سعة BSS في RewriteMap int:utf8trans
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)
تتضمن وحدة mod_rewrite المساهمة الخريطة RewriteMap int:utf8trans. تنسخ هذه الخريطة المدمجة وسيطًا من وسائط FTP الخاص بالعميل (حتى CommandBufferSize، أي 512 KiB) إلى مخزنَي BSS بسعة 1024 خانة دون حد أقصى للوجهة. اسم STOR طويل من ASCII يؤدي إلى كتابة WRITE بحجم 8 عبر global-buffer-overflow في ASan. تنهار عملية الجلسة الفرعية. ويبقى الخادم الخفي (daemon) قائمًا. الفئة: انهيار. وليست RCE.
| المعرّف | لا يوجد CVE بعد |
| الفئة | انهيار |
| الوصول | عن بُعد (وسيط FTP يُمرَّر إلى int:utf8trans) |
| 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) وحدة mod_rewrite المساهمة |
| المصادقة | المختبر يستخدم STOR بعد المصادقة. قاعدة RewriteRule تعمل قبل المصادقة على USER أو ما شابه ستكون 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: ظل تسجيل دخول جديد يعمل؛ وبقي الخادم الخفي قائمًا. نجح STOR قصير بطول 200 بايت من ASCII. سلامة بيانات BSS الخاصة بـ rewrite المجاورة مستنتجة وتعتمد على تخطيط المترجم. |
| RIP / تنفيذ شيفرة | لا شيء مُدّعى | مغلق. لا توجد حمولة. الفئة: انهيار. وليست RCE. |
زرع RewriteMap في .ftpaccess | CONF_DYNDIR | مغلق. RewriteMap غير مسموح به في .ftpaccess. |
صدفة prg: | لا يوجد نوع خريطة كهذا | مغلق. FIFO هو إدخال/إخراج سطري. |
مُثبت في المختبر مقابل مستنتج: كتابة ASan بحجم 8، وانهيار عملية الجلسة الفرعية، وضابط الوسيط القصير الناجي، وتسجيل الدخول بعد التحفيز كلها مُثبتة في المختبر. أما RIP/RCE فغير مُدّعى.
أصلحت المسألة 2173 تجاوز حدود بمقدار بايت واحد في int:unescape على هذا الإصدار المثبّت. هذا المتبقي هو int:utf8trans. وحدة مدمجة مختلفة. وخلل مختلف.
ثبّتُّ وسم v1.3.9d في proftpd/proftpd. كانت حصيلة CVEs لعام 2026 وقضايا GitHub العامة التي لا تزال قائمة في ذلك الأرشيف (2170، 2173، 2175، 2180، 2095، 2256، 2286، 2319، 2330، 2301) هي قائمة التجاهل. لم يمنحني FTP الأساسي الافتراضي مع basic.conf النموذجي ثغرة حرجة/مرتفعة غير منشورة. أما وحدة 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 يكتب unsigned long واحدًا لكل بايت ASCII بدون حد أقصى. قيمة PR_TUNABLE_CMD_BUFFER_SIZE هي 512 KiB. العدد 2173 أصلح بالفعل إلغاء الهروب. لم تكن هذه الخريطة ضمن ذلك الإصلاح.
المنعطفات الخاطئة: اعتبار 2173 هو هذا العلة؛ الادعاء بوجود RIP لأن ASan قال WRITE of size 8؛ الأمل في أن .ftpaccess يمكنه زرع RewriteMap. الأول دالة مختلفة. الثاني لا يزال Crash. الثالث هو CONF_DYNDIR.
ASan مع libcrypt القياسي يسببان SIGSEGV عند PASS قبل مصرف إعادة الكتابة. يقوم المختبر بتحميل stub صغير لـ crypt(3) مسبقًا حتى يعمل تسجيل الدخول. ذلك الـ stub ليس استغلالًا.
python3 proftpd-rewrite-utf8trans-Abraxas-Labs.py
أو:
cd lab
./run.sh
Loopback 127.0.0.1:18740 بالإضافة إلى النطاق السلبي 18741-18750. مشروع Compose proftpd-rewrite-utf8trans. الشاهد PROFTPD-REWRITE-UTF8TRANS-WITNESS. الصورة عبارة عن بناء ASan لـ 1.3.9d mod_rewrite. نجاح التحكم في STOR لـ 200 بايت ASCII. STOR لـ 2048 بايت ASCII هو ASan global-buffer-overflow WRITE بحجم 8 وتُجهض عملية الابن للجلسة. تسجيل الدخول الجديد بعد المحفّز لا يزال يعمل.
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. مختبر loopback فقط. دون أي ضمان.