ثغرة خطيرة في Exim تسمح بتنفيذ التعليمات البرمجية على الخادم كجذر

في خادم البريد Exim المحددة حرج عالي التأثر (CVE-2019-10149)، مما قد يؤدي إلى تنفيذ تعليمات برمجية عن بعد على الخادم باستخدام حقوق الجذر عند معالجة طلب معد خصيصًا. تمت ملاحظة إمكانية استغلال المشكلة في الإصدارات من 4.87 إلى 4.91 ضمناً أو عند البناء باستخدام خيار EXPERIMENTAL_EVENT.

في التكوين الافتراضي، يمكن تنفيذ الهجوم دون تعقيدات غير ضرورية من قبل مستخدم محلي، حيث يتم تطبيق قائمة التحكم بالوصول "التحقق = المستلم"، والتي تقوم بإجراء فحوصات إضافية للعناوين الخارجية. يمكن أن يحدث الهجوم عن بعد عند تغيير الإعدادات، مثل العمل كـ MX ثانوي لمجال آخر، أو إزالة قائمة التحكم بالوصول (ACL) "التحقق=المستلم"، أو إجراء تغييرات معينة على local_part_suffix). من الممكن أيضًا حدوث هجوم عن بعد إذا كان المهاجم قادرًا على إبقاء الاتصال بالخادم مفتوحًا لمدة 7 أيام (على سبيل المثال، إرسال بايت واحد في الدقيقة لتجاوز المهلة). وفي الوقت نفسه، من الممكن أن تكون هناك نواقل هجوم أبسط لاستغلال المشكلة عن بعد.

سبب الثغرة الأمنية هو التحقق غير الصحيح من عنوان المستلم في وظيفة Delivery_message() المحددة في الملف /src/deliver.c. من خلال معالجة تنسيق العنوان، يمكن للمهاجم تحقيق استبدال بياناته في وسيطات أمر يتم استدعاؤه من خلال الدالة execv() بحقوق الجذر. لا تتطلب العملية استخدام تقنيات معقدة تستخدم لتجاوز سعة المخزن المؤقت أو تلف الذاكرة، ويكفي استبدال الأحرف البسيط.

تتعلق المشكلة باستخدام البنية لتحويل العنوان:

Delivery_localpart = توسيع_سلسلة (
string_sprintf("${local_part:%s}", new->address));
Delivery_domain = توسيع_سلسلة (
string_sprintf("${domain:%s}", new->address));

تعد الدالة Extend_string() أداة مجمعة معقدة للغاية، بما في ذلك التعرف على الأمر "${run{command وسيطات}"، مما يؤدي إلى تشغيل معالج خارجي. وبالتالي، للهجوم خلال جلسة SMTP، يحتاج المستخدم المحلي فقط إلى إرسال أمر مثل 'RCPT TO "username+${run{...}}@localhost"'، حيث يكون المضيف المحلي أحد المضيفين من قائمة النطاقات المحلية، واسم المستخدم هو اسم مستخدم محلي موجود.

إذا كان الخادم يعمل كمرحل بريد، فيكفي إرسال الأمر 'RCPT TO "${run{...}}@relaydomain.com"' عن بعد، حيث يكون Relaydomain.com أحد المضيفين المدرجين في Relay_to_domains قسم الإعدادات. نظرًا لأن Exim لا يقوم افتراضيًا بإسقاط وضع الامتياز (deliver_drop_privilege = false)، فسيتم تنفيذ الأوامر التي تم تمريرها عبر "${run{...}}" كجذر.

ومن الجدير بالذكر أن الثغرة كانت مستبعد في الإصدار 4.92 الذي تم إصداره في فبراير، دون التأكيد على أن الإصلاح قد يؤدي إلى مشكلات أمنية. ولا يوجد سبب للاعتقاد بأنه كان هناك إخفاء متعمد للثغرة الأمنية من قبل مطوري Exim، حيث تم إصلاح المشكلة أثناء تصحيح الفشل الذي يحدث عند إرسال عناوين غير صحيحة، وتم تحديد الثغرة الأمنية بواسطة Qualys أثناء تدقيق التغييرات في Exim.

يتوفر حاليًا إصلاح للإصدارات السابقة التي يستمر استخدامها في التوزيعات فقط رقعة. من المقرر إطلاق الإصدارات التصحيحية للفروع السابقة لإصلاح المشكلة في 11 يونيو. تحديثات الحزمة جاهزة ديبيان, أوبونتو, زحمة. قوس لينكس и فيدورا أنها توفر الإصدار 4.92، حيث لا تظهر المشكلة. مشكلة RHEL وCentOS غير عرضة، نظرًا لعدم تضمين Exim في مستودع الحزم العادي الخاص بهم.

المصدر: opennet.ru

إضافة تعليق