
استغلال محلي للحصول على صلاحيات الجذر في لينكس لـ CVE-2014-0038
استدعاء النظام recvmmsg الخاص بـ X86_X32 لا يعقّم مؤشر المهلة المُمرَّر من مساحة المستخدم بشكل صحيح.
مرّر مؤشرًا إلى عنوان نواة كمهلة لـ recvmmsg، إذا كانت البايتة الأصلية في ذلك العنوان معروفة، يمكن استبدالها ببيانات معروفة. إذا كانت البايتة الأقل أهمية هي 0xff، فإن الانتظار 255 ثانية سيحوّلها إلى 0x00.
يجب أن تكون أول قيمة long في العنوان المُمرَّر (tv_sec) موجبة ويجب أن تكون ثاني قيمة long (tv_nsec) أصغر من 1000000000.
استهدف مؤشر دالة release في بنية ptmx_fops الموجودة في ذاكرة نواة غير مهيأة (وبالتالي قابلة للكتابة). صفِّر البايتات الثلاث الأكثر أهمية وبذلك تحوّله إلى مؤشر إلى عنوان يمكن تعيينه في مساحة المستخدم. يُستخدم مؤشر release لأنه يتبعه 16 بايتًا من الأصفار (وبالتالي تكون tv_nsec صالحة). افتح /dev/ptmx، أغلقه، واستمتع.
إنها ليست أنيقة جدًا لكن ينبغي أن تكون موثوقة إلى حدٍّ معقول إذا أمكن حلّ الرموز.
تم اختبارها على Ubuntu 13.10
انظر أيضًا http://blog.includesecurity.com/2014/03/exploit-CVE-2014-0038-x32-recvmmsg-kernel-vulnerablity.html
استخرج العناوين من /proc/kallsyms ثم شغّل الاستغلال:
./build.sh && ./timeoutpwn
إذا أردت بناء الملف التنفيذي لخادم بعيد، جرّب ما يلي:
ssh user@host 'cat /proc/kallsyms' > syms.txt
CFLAGS=-static ./build.sh syms.txt
scp timeoutpwn user@host:
...
إذا تعذّر العثور على ptmx_fops في kallsyms، فحاول استخراجه من vmlinux كما هو متوفر في حزمة الرؤوس (linux-headers على Arch Linux):
nm /lib/modules/$(uname -r)/build/vmlinux > syms.txt