Проблемы с безопасностью в патчах, предложенных сотрудником Huawei для защиты ядра Linux
13 мая 2020 года
Разработчики проекта 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); }
Источники
правитьЛюбой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.