
ProFTPD 1.3.9d - عالي - عن بُعد - انهيار - تجاوز سعة BSS في RewriteMap int:utf8trans
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · proftpd-rewrite-utf8trans
الفئة: انهيار الوصول: عن بُعد
ProFTPD 1.3.9d (f59f248) - ProFTPD (proftpd.org)
يوفّر contrib mod_rewrite الخريطة RewriteMap int:utf8trans. تنسخ هذه الخريطة المدمجة وسيط FTP قادمًا من العميل (حتى CommandBufferSize، 512 KiB) إلى مخزنَي BSS بحجم 1024 خانة دون حدّ أقصى للوجهة. اسم STOR طويل من ASCII يؤدي إلى global-buffer-overflow WRITE بحجم 8 في ASan. تنهار عملية الجلسة الفرعية. تبقى الخدمة الخلفية قائمة. الفئة انهيار. ليس 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) contrib 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: shell | لا يوجد نوع خريطة كهذا | مغلق. FIFO هو إدخال/إخراج سطري. |
مُثبت مختبريًا مقابل مُستنتج: WRITE بحجم 8 في ASan، وانهيار عملية الجلسة الفرعية، وضابط الوسيط القصير الناجي، وتسجيل الدخول بعد التحفيز كلها مُثبتة مختبريًا. RIP/RCE غير مُدّعى.
Issue 2173 رقّع int:unescape من OOB بحجم بايت واحد على هذه النسخة. هذه البقايا هي int:utf8trans. مدمج مختلف. خطأ مختلف.
ثبّتت proftpd/proftpd على الوسم v1.3.9d. كانت حصيلة CVE لعام 2026 وقضايا GitHub العامة التي لا تزال قائمة في ذلك الأرشيف (2170، 2173، 2175، 2180، 2095، 2256، 2286، 2319، 2330، 2301) هي قائمة التخطي. لم يمنحني FTP الأساسي الافتراضي مع basic.conf النموذجي ثغرة 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 قيمة unsigned long واحدة لكل بايت ASCII دون حدّ أقصى. قيمة PR_TUNABLE_CMD_BUFFER_SIZE هي 512 KiB. القضية 2173 أصلحت unescape بالفعل. لم تكن هذه الخريطة ضمن ذلك الإصلاح.
المنعطفات الخاطئة: اعتبار 2173 هو هذا الخطأ؛ ادعاء RIP لأن ASan قال WRITE of size 8؛ الأمل في أن .ftpaccess يمكنه زرع RewriteMap. الأول دالة مختلفة. الثاني لا يزال انهيارًا. الثالث هو CONF_DYNDIR.
ASan مع libcrypt القياسي يسببان SIGSEGV عند PASS قبل نقطة وصول rewrite. يحمّل المختبر مسبقًا كعبًا صغيرًا لـ 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. الشاهد PROFTPD-REWRITE-UTF8TRANS-WITNESS. الصورة عبارة عن بناء ASan للإصدار 1.3.9d من mod_rewrite. STOR الضابط بحجم 200 بايت ASCII ينجح. STOR بحجم 2048 بايت ASCII هو global-buffer-overflow WRITE of size 8 في ASan وتنهار عملية الجلسة الفرعية. تسجيل الدخول الجديد بعد التحفيز لا يزال يعمل.
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 فقط. دون أي ضمان.