Патчи 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); }
Источник: http://www.opennet.ru/opennews/art.shtml?num=52942