
CVE-2017-7173: حرمان محلي من الخدمة لنظام iOS يتطلب صلاحيات الجذر.
تستخدم الدالة sysctl_coalition_get_pid_list في bsd/kern/sys_coalition.c الدالة
coalition_get_pid_list لجمع قائمة بالـ PIDs داخل ائتلاف (coalition). تُعيد هذه الدالة
عدد الـ PIDs في حال النجاح أو قيمة errno سالبة عند الفشل. ومع ذلك، فإن الدالة
sysctl_coalition_get_pid_list لا تتحقق بشكل صحيح من حالة الخطأ، مما يعني
أنها ستحاول إرسال عدد سالب من الـ PIDs إلى مساحة المستخدم عبر SYSCTL_OUT. وبما أن معامل
الطول هو size_t، فإن النتيجة تكون استدعاءً لـ copyout بقيمة كبيرة جدًا.
اعتقدت في البداية أن هذا سيكون تسريبًا لمعلومات النواة، لأن النواة ستحاول
النسخ من المكدس إلى مخزن مؤقت في مساحة المستخدم ولكنها ستصل في النهاية إلى صفحة غير معيّنة
وإحباط عملية النسخ. ومع ذلك، فإن SYSCTL_OUT لا ينسخ القيم الجزئية، وعلى macOS تُنهي copyio
العملية مبكرًا إذا كان العنوان زائد الحجم يلتف (wraps around). هذا يجعل هذا الخطأ غير قابل
للاستغلال على macOS.
ومع ذلك، على iOS (أو على الأقل على iOS 10.1.1) تُطلق دالة copyio حالة ذعر (panic) إذا كان العنوان زائد الحجم يلتف. هذا يعني أن هذا الخطأ يمكن استخدامه لتعطيل الخدمة (denial-of-service).
يتطلب الاستغلال صلاحيات الجذر (root).
أبلغت Apple بهذه المشكلة في 21 سبتمبر 2017. تم تخصيص CVE-2017-13833
CVE-2017-7173 لها. أصلحت Apple المشكلات في macOS 10.13.2 و iOS 11.2.
(اكتشفت Apple منذ ذلك الحين أن CVE-2017-13833 كان مخصصًا سابقًا لمشكلة مختلفة و أعادت تخصيص هذه المشكلة إلى CVE-2017-7173.)
كود sysctl_coalition_get_pid_list-dos مُتاح في النطاق العام (public domain). وكمجاملة، أطلب أنك إذا أشرت إلى أو استخدمت أيًا من هذا الكود فتنسبه إليّ.