20.09.2020

Проблемы с безопасностью в патчах, предложенных сотрудником Huawei для защиты ядра Linux


Разработчики проекта Grsecurity обратили внимание на наличие тривиально эксплуатируемой уязвимости в наборе патчей HKSP (Huawei Kernel Self Protection), несколько дней назад предложенных для повышения защиты ядра Linux. Ситуация напоминает случай с Samsung, в котором попытка повышения безопасности системы привела к появлению новой уязвимости и упростила компрометацию устройств.

Патчи HKSP были опубликованы сотрудником компании Huawei, включают упоминание Huawei в профиле GitHub и используют слово Huawei в расшифровке названия проекта (HKSP — Huawei Kernel Self Protection). При этом педставители Huawei опровергли связь проекта HKSP с компанией и заявили, что код разработан по личной инициативе работника, не является официальным проектом Huawei и не используется в продуктах данной компании. На GitHub-странице HKSP задним числом после обнаружения уязвимости также было добавлено примечание, что проект развивается в свободное время в исследовательских целях.

HKSP включает такие изменения, как рандомизация смещений в структуре cred, защита от атак на пространство имён идентификаторов пользователей (pid namespace), отделение стека процессов от области mmap, выявление двойного вызова функции kfree, блокирование утечек через псевдо-ФС /proc (/proc/{modules, keys, key-users}, /proc/sys/kernel/* и /proc/sys/vm/mmap_min_addr, /proc/kallsyms), улучшение рандомизации адресов в пространстве пользователя, дополнительная защита Ptrace, усиление защиты smap и smep, возможность запрета отправки данных через raw-сокеты, блокирование некорректных адресов в UDP-сокетах и проверка целостности запускаемых процессов. В состав также входит модуль ядра Ksguard, нацеленный на определение попыток внедрения типовых руткитов.

Патчи вызвали интерес у Грега Кроа-Хартмана (Greg Kroah-Hartman), отвечающего за поддержку стабильной ветки ядра Linux, который попросил автора разбить монолитный патч на части для упрощения рецензировния и продвижения в основной состав ядра. Кеса Кука (Kees Cook), возглавляющий проект по продвижению в ядро Linux технологии активной защиты, также положительно отозвался о патчах и из проблем обратил внимание на привязку к архитектуре x86 и уведомительный характер многих режимов, которые лишь выводят в лог сведения о проблеме, но не пытаются её блокировать.

Изучение патча разработчиками Grsecurity выявило множество ошибок и слабых мест в коде, а также показало отсутствие модели угроз, позволяющей адекватно судить о возможностях проекта. Для наглядной демонстрации того, что код написан без применения методов безопасного программирования, приведён пример тривиальной уязвимости в обработчике файла /proc/ksguard/state, который создаётся с правами 0777, подразумевающими открытие доступа всем на запись. В функции ksg_state_write, используемой для разбора команд, записываемых в /proc/ksguard/state, создаётся буфер tmp[32], в который данные записываются на основании размера переданного операнда, без учёта размера целевого буфера и без проверки параметра с размером строки. Т.е. для перезаписи части стека ядра атакующему достаточно записать специально оформленную строку в /proc/ksguard/state.

     static ssize_t ksg_state_write(struct file *file, const char __user *buf,                        size_t len, loff_t *offset)     {  	u64 value;  	char tmp[32];  	size_t n = 0;            if (copy_from_user(tmp, buf, len))                  return -1;    	value = simple_strtoul(tmp, '', 10);          ...    

Прототип эксплоита:

         char buf[4096] = { };          int fd = open("/proc/ksguard/state", O_WRONLY);          if (fd >= 0) {  		write(fd, buf, sizeof(buf));  		close(fd);  	}  

Источник: https://www.opennet.ru/opennews/art.shtml?num=52942

Добавить комментарий