Уязвимости в ядре Linux, позволяющие поднять свои привилегии через nf_tables и ksmbd
В Netfilter, подсистеме ядра Linux, используемой для фильтрации и модификации сетевых пакетов, выявлена уязвимость (CVE-2024-1086), позволяющая локальному пользователю выполнить код на уровне ядра и поднять свои привилегии в системе. Проблема вызвана двойным освобождением памяти (double-free) в модуле nf_tables, обеспечивающем работу пакетного фильтра nftables. Выявивший уязвимость исследователь безопасности разработал и опубликовал рабочий прототип эксплоита.Работа эксплоита продемонстрирована в актуальных выпусках Debian и Ubuntu с ядрами Linux 5.14 - 6.6, а также в окружении с ядром KernelCTF (Capture the Flag), включающем дополнительные патчи для блокирования типовых методов работы эксплоитов и используемом компанией Google в программе выплаты вознаграждений за поиск уязвимостей. Степень успешности работы эксплоита оценивается в 99.4%. В сопроводительной статье детально разобран процесс создания сложного многоуровневого эксплоита и обход присутствующих в ядре механизмов защиты и противодействия работе эксплоитов.
Проблема связана с ошибкой в функции nft_verdict_init(), которая допускает использования положительных значений в качестве кода ошибки отбрасывания пакетов (DROP) в hook-ах, что может быть использовано для вызова в функции nf_hook_slow() повторной операции освобождения памяти для буфера, для которого уже была вызвана функция free(). Проблема возникает, когда операция NF_DROP формируется с ошибкой и ядро вначале интерпретирует NF_DROP, но затем освобождает буфер и возвращает статус NF_ACCEPT. Данная ситуация приводит к тому, что несмотря на освобождение связанного с пакетом буфера, его обработка не прекращается, а передаётся в другой обработчик, который в свою очередь второй раз вызывает функцию освобождения памяти.
Уязвимость проявляется начиная с версии ядра Linux 3.15, но эксплоит работает с ядрами начиная с версии 5.14. Исправление уязвимости предложено в выпуске ядра Linux 6.8-rc1 и в конце февраля перенесено в стабильные ветки 5.15.149, 6.1.76 и 6.6.15. В дистрибутивах проследить за исправлением уязвимости можно на страницах: Debian, Ubuntu, Gentoo, RHEL, SUSE, Fedora, Arch.
Дополнительно можно отметить серию уязвимостей в модуле ksmbd, предлагающем встроенную в ядро Linux реализацию файлового сервера на базе протокола SMB: Уязвимость CVE-2024-26592 позволяет удалённо без прохождения аутентификации добиться выполнения своего кода с правами ядра на системах с активированным модулем ksmbd. Проблема вызвана состоянием гонки в коде обработки TCP-соединения, которое возникает из-за отсутствия выставления должных блокировок при работе с объектом.
Уязвимость CVE-2023-52440 также позволяет удалённо добиться выполнения своего кода с правами ядра, но вызвана переполнением буфера при обработке некорректных сессионных ключей из-за отсутствия должной проверки размера данных, полученных от пользователя, перед их копированием в буфер фиксированного размера.
Уязвимости (1, 2, 3) CVE-2024-26594, CVE-2023-52442 и CVE-2023-52441 в ksmbd дают возможность удалённо без прохождения аутентификации определить содержимое памяти ядра. Уязвимость CVE-2024-26594 вызвана некорректной проверкой данных при обработке поступивших токенов SMB2 Mech, что приводит к возвращению данных из области за границей буфера. Уязвимость CVE-2023-52442 вызвана отсутствием должной проверки входных данных при обработке связанных в цепочку (chained) запросов. Уязвимость CVE-2023-52441 вызвана отсутствием необходимой проверки входных данных при обработке запросов согласования соединения SMB2.
Уязвимости CVE-2024-26594 и CVE-2024-26592 устранены в ядре 6.8 и корректирующих обновлениях прошлых стабильных веток 6.1.75, 6.6.14, 6.7.2. Остальные уязвимости устранены в ядре 6.5 и обновлениях 5.15.145, 6.1.53, 6.4.16.
В заключение можно упомянуть активацию работы новой команды разработчиков ядра Linux, созданной для анализа наличия уязвимостей и оценки связи вносимых в ядре исправлений с проблемами безопасности. В феврале разработчиками ядра была создана собственная служба CNA (CVE Numbering Authority), которая получила полномочия самостоятельного присвоения CVE-идентификаторов уязвимостям. До этого присвоение CVE и анализ связи исправлений с возможными уязвимостями ложился на плечи разработчиков дистрибутивов, а в ядре потенциальные уязвимости не оставались выделены и фигурировали наравне с обычными исправлениями. Результаты работы новой службы превзошли все ожидания - ежедневно в ядре помечается до нескольких десятков новых уязвимостей, которые ранее не были помечены как проблемы с безопасностью. Например, 26 марта новые CVE-идентификаторы присвоены 14 уязвимостям, которые ранее не рассматривались как проблемы с безопасностью, а 25 марта - 41 уязвимости.
Источник: https://www.opennet.ru/opennews/art.shtml?num=60860