vsftpd 3.0.5 - عالي - عن بُعد - بقايا صلاحيات - بيانات FTPS تقبل أي تذكرة مستأنفة
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vsftpd-ssl-data-any-ticket
التصنيف: صلاحية متبقية الوصول: عن بُعد
vsftpd 3.0.5 (Chris Evans) - ملف tarball الرسمي SHA-256 26b602ae454b0ba6d99ef44a09b6b9e0dfa7f67228106736df1f278c70bc91d3. تُصرّف توزيعات FTPS مع #define VSF_BUILD_SSL (بينما tarball الأصلي #undef) ويضبط المشغّلون ssl_enable=YES. الوضع المستقل listen=YES هو الافتراضي المُصرّف والنموذجي.
ssl_accept (ssl.c:494-501) هو نقطة ربط قناة البيانات. يتحقق فقط من SSL_session_reused(). لا يوجد مقارنة SSL_SESSION مع SSL قناة التحكم. لا يوجد FTP USER/PASS في SSL البيانات. يعمل ssl_init المستقل في المستمع قبل fork (main.c:147-150)، لذا ترث العمليات الفرعية SSL_CTX واحدًا. SSL_CTX_set_timeout(INT_MAX) (ssl.c:182-186). لا يوجد SSL_OP_NO_TICKET. تعني SSL_session_reused()==1 أن هذا ClientHello حمل تذكرة يمكن لهذه العملية فك تشفيرها، وليس أنها جلسة تحكم Alice.
تقول صفحة الدليل الخاصة بـ require_ssl_reuse إن إعادة الاستخدام تُثبت نفس المفتاح الرئيسي لقناة التحكم. لكن كود C لا يفعل ذلك. يختلف هذا عن إصلاح Tim Kosse في 3.0.3 الذي يقتل عند فشل إعادة الاستخدام (ftpdataio.c:184-187)، والذي لا يزال يُرجع 522 لمصافحة جديدة ولا يمنع Mallory من استئناف تذكرة صادرة على قناة تحكم مختلفة.
هذه الصلاحية المتبقية هي نقل FTPS واحد. ليست تجاوزًا لـ USER/PASS، وليست shell، وليست هروبًا من chroot.
| المعرّف | لا يوجد CVE بعد |
| التصنيف | صلاحية متبقية (بيانات FTPS تقبل أي تذكرة مستأنفة) |
| الوصول | عن بُعد (PASV من نفس IP؛ NAT المشترك هو AC:H) |
| CWE | CWE-345، CWE-287 |
| CVSS | مرتفع: 7.4 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N |
| المنتج | vsftpd (Chris Evans) |
| المتأثر | 3.0.5 مع VSF_BUILD_SSL و ssl_enable=YES. require_ssl_reuse=YES (افتراضي). require_cert=NO (افتراضي) |
| المصادقة | Mallory: AUTH TLS فقط (بدون USER/PASS). Alice: anonymous PBSZ/PROT P |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1:18700 للتحكم، PASV 18701-18708. Compose vsftpd-ssl-data-any-ticket |
من: عميل FTPS آخر (أو على المسار) يشارك عنوان IP المصدر الخاص بـ Alice. لا يزال accept في PASV يتطلب IP نظير التحكم (privops.c:212-218) ما لم يكن pasv_promiscuous. NAT المشترك هو الحالة المعتادة في FTPS التي أُضيف require_ssl_reuse لإيقافها. لا يسجّل Mallory الدخول أبدًا.
| الطريقة + الهدف | الصلاحية |
|---|---|
Mallory AUTH TLS فقط، TLS 1.2 ALPN ftp، يحتفظ بتذكرة الجلسة من SSL_CTX الخاص بالمستمع. Alice anonymous PBSZ/PROT P، PASV، RETR secret.txt محجوب في get_remote_transfer_fd حتى accept. Mallory PASV من نفس IP، يستأنف تذكرته (session_reused=True) | فك تشفير عملية RETR تلك. المختبر: مقبس البيانات 35 بايت VSFTPD-SSL-DATA-ANY-TICKET-WITNESS. Alice 150 ثم 226. يبقى TLS التحكم وكلمة المرور ملكًا لـ Alice. لا تجوال في الأدلة بعد ذلك النقل. |
ssl_accept؛ المختبر كان سرقة RETR)| الطريقة + الهدف | الصلاحية |
|---|---|
استئناف نفس التذكرة أثناء STOR / APPE من Alice | يُكتب ملف Alice المسمّى من النص الصريح لـ TLS الخاص بـ Mallory، بصلاحية uid الخاص بـ Alice / uid ftp المجهول، داخل chroot القائم |
| الطريقة + الهدف | الصلاحية |
|---|---|
مصافحة بيانات جديدة (reused=False) | 522 session reuse required (قتل 3.0.3). يموت ذلك النقل. يبقى التحكم ملكًا لـ Alice |
privops.c:212-218)require_cert=YES مع شهادة مقدَّمة تربط ملخصات SHA-256PROT C بنص صريح للمستخدمين المحليين (force_local_data_ssl افتراضي YES)ssl_init من المستمع)ftp (vsftpd يُصدر FATAL)ثبّتت tarball vsftpd 3.0.5 الرسمي بدلًا من نسخة GitHub أو شجرة Debian/Fedora. تسعة عشر بحثًا في المصدر. توقف بحث SSL عند ssl_accept: إعادة الاستخدام قيمة منطقية، وليست ربطًا بـ SSL_SESSION الخاص بقناة التحكم هذه. SSL_CTX الخاص بالمستمع مع عمر تذكرة INT_MAX هو الباقي.
مسارات خاطئة: يجب أن يكون ALPN هو ftp وإلا يُصدر vsftpd FATAL (صلاحية ALPACA المتبقية في 3.0.4 مغلقة بالفعل). احتاج ربط Arm64 إلى -lpam -lcap صراحةً؛ فسكربت vsf_findlibs.sh الأصلي يفحص مسارات x86_64 فقط. اعتبار قتل Tim Kosse في 3.0.3 هو هذا الخطأ: فهو يُرجع 522 لمصافحة جديدة على مقبس بيانات Alice ولا يمنع تذكرة صادرة على قناة تحكم مختلفة.
cd lab
./run.sh
3.0.5 الرسمي مع #define VSF_BUILD_SSL. الإعداد: ssl_enable=YES، allow_anon_ssl=YES، force_anon_logins_ssl=YES، force_anon_data_ssl=YES، require_ssl_reuse=YES، require_cert=NO. Docker على loopback. عميلان من نفس IP. تذاكر TLS 1.2. ALPN ftp. التحكم 127.0.0.1:18700، PASV 18701-18708. Compose vsftpd-ssl-data-any-ticket. الشاهد VSFTPD-SSL-DATA-ANY-TICKET-WITNESS. السطر الأخير:
SUCCESS vsftpd-ssl-data-any-ticket reused-ticket=yes fresh-handshake=522 VSFTPD-SSL-DATA-ANY-TICKET-WITNESS
اربط SSL_SESSION للبيانات بـ SSL_SESSION للتحكم (قارن معرّفات الجلسة / المفتاح الرئيسي). حدّد عمر التذكرة بعمر اتصال التحكم. أو SSL_OP_NO_TICKET مع ذاكرة تخزين مؤقت للجلسات مفهرسة حسب التحكم. يقارن ProFTPD 1.3.9d الجلسات.
استقبال المورّد هو [email protected] (security.appspot.com/vsftpd.html). لا تفتح issue عامًا على GitHub في أي نسخة من vsftpd.
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]