
استغلال إثبات المفهوم لثغرة فساد سجلات التصحيح في ptrace بنواة لينكس (CVE-2018-1000199)، يُظهر معالجة أخطاء غير صحيحة في محاكاة نقاط التوقف.
يقوم كود ptrace في Linux بظاهري الوصول إلى سجلات التصحيح، ويحتوي كود الظاهرية على معالجة أخطاء غير صحيحة. وهذا يعني أنه إذا قمت بكتابة قيمة غير قانونية، على سبيل المثال، إلى DR0، فإن الحالة الداخلية لتتبع نقاط التوقف في النواة يمكن أن تصبح فاسدة على الرغم من أن استدعاء ptrace() سيعيد -EINVAL.
على سبيل المثال، يمكنك العثور على عنوان do_debug في /proc/kallsyms على نواة x86 وتمرير هذا العنوان إلى PoC المرفق. أشتبه في أن البنى الأخرى غير x86 متأثرة أيضًا، لكني لم أحاول استغلاله. الخطأ نفسه منتشر في كل مكان في النواة في الكود العام و arch.
لم أجد طريقة واضحة للحصول على تصعيد الامتيازات باستخدام هذا الخطأ، لكنها قد توجد. على سبيل المثال، من المعقول أن استخدام هذا الخطأ لاستهداف معالج مقاطعة perf NMI يمكن أن يؤدي إلى تجاوز مكدس NMI، مما ينتج عنه أشكال مختلفة من الفساد. لم أحاول تحليل التأثير على البنى غير x86 لأنني أعرف فقط كيفية عمل نقاط التوقف في x86، لكن تأثيرات الخطأ قد تكون مختلفة جدًا.
لقد أصلح لينوس هذا إلى حد كبير في المنبع في الالتزام f67b15037a7a50c57f72e69a6d59941ad90a0f0f. مع تطبيق هذا الالتزام، لا تزال معالجة الأخطاء خاطئة لكن الخلل يؤدي إلى نقطة توقف معطلة بدلاً من نقطة توقف غير صحيحة.
http://man7.org/linux/man-pages/man2/ptrace.2.html
مثال الاستخدام: $ ./PoC.exe ffffffff81b44400