vsftpd 3.0.5 - عالي - عن بُعد - بقايا صلاحيات - تجاوز deny_file لـ .private/secret
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vsftpd-deny-file-brace-child
الفئة: صلاحية متبقية الوصول: عن بُعد
vsftpd 3.0.5 - Chris Evans
مثال صفحة الدليل (vsftpd.conf.5) هو deny_file={*.mp3,*.mov,.private}. الأسماء المطابقة "يجب ألا تكون قابلة للوصول بأي شكل"، بما في ذلك "التنزيل، والدخول إلى الدليل، والتأثير على شيء داخل الدليل". تستدعي vsf_access_check_file (access.c:16-43) الدالة vsf_filename_passes_filter على مسار العميل كما هو مُعطى، ثم str_locate_str على كامل الإعداد القابل للضبط ذي الأقواس. يطابق الفلتر المكوّن الأخير / البادئة؛ يفشل المتبقي /secret؛ ويخطئ البحث الفرعي عن {*.mp3,*.mov,.private}.
يُرفض CWD .private (الاسم الأساسي يطابق). وينجح RETR .private/secret و RETR dir/.private. هذا "داخل الدليل" هو ما يكسره هذا المتبقي.
CVE-2015-1419 هو تصحيح realpath/basename خاص بتوزيعة عامة. الإصدار الرسمي 3.0.5 لم يأخذه أبدًا. لا يزال فرع الأقواس في Debian يطابق المسار الكامل، لذا يبقى هذا التجوال الفرعي قائمًا حتى على حزم التوزيعات المُرقّعة. لا تُعِد تقديم 2015-1419.
هذا المتبقي هو إخفاق في قائمة الرفض مقيّد بالإعداد. ليس RCE بدون مصادقة، وليس هروبًا من chroot، وليس قراءة /etc على المضيف.
| المعرّف | لا يوجد CVE بعد |
| الفئة | صلاحية متبقية |
| الوصول | عن بُعد (FTP مُصادَق عليه) |
| CWE | CWE-863، CWE-22 |
| CVSS | مرتفع: 7.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| المنتج | vsftpd (Chris Evans) |
| المتأثر | vsftpd 3.0.5 الحزمة الرسمية SHA-256 26b602ae454b0ba6d99ef44a09b6b9e0dfa7f67228106736df1f278c70bc91d3 |
| المصادقة | FTP USER/PASS مُصادَق عليه (مجهول في المختبر). deny_file مضبوط على قائمة أقواس (غير مضبوط افتراضيًا) |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط. مجهول للقراءة فقط. ملف شاهد. |
من: مستخدم FTP مُصادَق عليه (مجهول ftp في المختبر). UID الجلسة بعد الإسقاط المعتاد في vsftpd. deny_file هي السياسة الإضافية التي كان يُفترض أن تسحب الصلاحيات من ذلك UID. وصفات المستخدم الافتراضي التي تذكرها صفحة الدليل تتشارك guest_username، لذا لا يفصلها DAC في Unix. الإصدار 3.0.5 الأصلي مع tunable_deny_file NULL ليس هذا المتبقي.
| الطريقة + المخرج | الصلاحية |
|---|---|
RETR .private/secret مع deny_file={*.mp3,*.mov,.private} الموثّق بالأقواس | handle_retr str_open لملف اسم دليله على قائمة الرفض، بصلاحية uid الجلسة. المختبر: 150/226، 37 بايت، المحتوى VSFTPD-DENY-FILE-BRACE-CHILD-WITNESS |
RETR dir/.private | نفس المخرج. ملف باسم .private تحت دليل آخر (must_match_at_current_pos يرفض تطابقًا عند فهرس > 0). المختبر: 150/226، المحتوى DIRDOT-VSFTPD-DENY-FILE-BRACE-CHILD-WITNESS |
vsf_access_check_file؛ كان المختبر للقراءة فقط)| الطريقة + المخرج | الصلاحية |
|---|---|
STOR / APPE لنفس المسار عند write_enable=YES | handle_upload_common إنشاء / استبدال بصلاحية uid الجلسة |
DELE / RNTO لنفس المسار | str_unlink / إعادة تسمية لاسم كان يُفترض أن تمنعه قائمة الرفض |
| الطريقة + المخرج | الصلاحية |
|---|---|
LIST .private/x (أو LIST داخل الشجرة المرفوضة) | handle_dir_common يفحص الوصول للوسيط الكامل (يخطئ)، ثم str_opendir للبادئة .private بعد تقسيم الشرطة المائلة. الأسماء فقط. لا يزال DAC في Unix مطبّقًا |
| الطريقة + المخرج | النتيجة |
|---|---|
CWD .private | 550 Permission denied. الاسم الأساسي .private يطابق الأقواس |
RETR song.mp3 | 550. *.mp3 نمط للمكوّن الأخير وهو يطابق فعلًا |
CWD .private نفسه (الاسم الأساسي يطابق)hide_file LIST للمُدخل (الاسم الأساسي من readdir؛ RETR لاسم مخفي موثّق كمقصود)/etc على المضيف من chroothttp_enable معطّل افتراضيًا؛ GET في وضع FTP يقتل الجلسة)deny_file=.private بدون أقواس يُنقَذ بواسطة الاحتياط الفرعي (str_locate_str لـ .private في .private/secret)ثبّتُّ الإصدار الرسمي vsftpd 3.0.5 (SHA-256 26b602ae...c91d3) بدلًا من نسخة GitHub أو شجرة Debian/Fedora. تسعة عشر بحثًا في المصدر. الخادم المُصرّف افتراضيًا لا يحتوي على متبقٍ حرج/مرتفع غير منشور. هذا يحتاج إلى أن ينسخ المشغّل مثال الأقواس من صفحة الدليل.
تطابق vsf_filename_passes_filter (ls.c) * / ? / {,} غير المتداخلة وتعمل بشكل مفيد فقط على نمط المكوّن الأخير. للاسم .private/secret مقابل {*.mp3,*.mov,.private}:
*.mp3، *.mov، .private عند بداية .private/secret. يفشل المتبقي /secret إلا إذا كانت العلامة *.{*.mp3,*.mov,.private} ويخطئ.منعطف خاطئ منشور بالفعل: CVE-2015-1419 هو realpath خاص بالتوزيعة فقط. لا يحتوي سجل التغييرات الرسمي على مثل هذا الإصلاح. حتى فرع الأقواس في Debian ينسخ المسار المُطبّع الكامل، لذا لا يزال الأبناء يتجولون.
cd lab
./run.sh
تحكم Loopback 127.0.0.1:18710، PASV 18711-18718. مشروع Compose vsftpd-deny-file-brace-child. حزمة 3.0.5 الرسمية، مجهول للقراءة فقط، deny_file={*.mp3,*.mov,.private}. الشاهد VSFTPD-DENY-FILE-BRACE-CHILD-WITNESS. السطر الأخير:
SUCCESS vsftpd-deny-file-brace-child cwd-dotprivate=550 retr-child=yes retr-dir-dotprivate=yes mp3=550 VSFTPD-DENY-FILE-BRACE-CHILD-WITNESS
طابِق بدائل الأقواس مقابل كل مكوّن من مكوّنات المسار، أو استخدم realpath / basename قبل الفلتر (مع تحذيرات الروابط الرمزية المعتادة). يجب أن يرفض المثال الموثّق الأبناء فعلًا.
استقبال المورّد هو [email protected] (vsftpd). لا تفتح مشكلة عامة على GitHub في أي نسخة vsftpd.
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]