Проблемы с безопасностью в патчах, предложенных сотрудником 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, ‘\0’, 10);

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

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

Источник: opennet.ru

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