في خادم البريد Exim
في التكوين الافتراضي، يمكن تنفيذ الهجوم دون تعقيدات غير ضرورية من قبل مستخدم محلي، حيث يتم تطبيق قائمة التحكم بالوصول "التحقق = المستلم"، والتي تقوم بإجراء فحوصات إضافية للعناوين الخارجية. يمكن أن يحدث الهجوم عن بعد عند تغيير الإعدادات، مثل العمل كـ 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{...}}" كجذر.
ومن الجدير بالذكر أن الثغرة كانت
يتوفر حاليًا إصلاح للإصدارات السابقة التي يستمر استخدامها في التوزيعات فقط
المصدر: opennet.ru