В ядре Linux выявлено несколько опасных уязвимостей, позволяющих локальному пользователю повысить свои привилегии в системе. Для всех рассматриваемых проблем подготовлены рабочие прототипы эксплоитов.
- Уязвимость(CVE-2022-0995) в подсистеме отслеживания событий watch_queue, приводящая к записи данных в области памяти ядра за пределом выделенного буфера. Атака может быть совершена любым непривилегированным пользователем и привести к запуску своего кода с правами ядра. Уязвимость присутствует в функции watch_queue_set_size() и связана с попыткой очистки всех указателей в списке, даже если для них не была выделена память. Проблема проявляется при сборке ядра с опцией “CONFIG_WATCH_QUEUE=y”, которая используется в большинстве дистрибутивов Linux.
Уязвимость устранена в изменении, добавленном в ядро 11 марта. Проследить за публикаций обновления пакетов в дистрибутивах можно на данных страницах: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Прототип эксплоита уже доступен публично и позволяет получить root-доступ при запуске в Ubuntu 21.10 с ядром 5.13.0-37.
- Уязвимость (CVE-2022-27666) в модулях ядра esp4 и esp6 с реализацией ESP-преобразований (Encapsulating Security Payload) для IPsec, применяемых при использовании IPv4 и IPv6. Уязвимость позволяет локальному пользователю с обычными привилегиями перезаписать объекты в памяти ядра и повысить свои привилегии в системе. Проблема вызвана отсутствием сверки выделенного размера памяти и фактически полученных данных при том, что максимальный размер сообщения мог превышать максимальный размер памяти, выделяемый для структуры skb_page_frag_refill.
Уязвимость устранена в ядре 7 марта (исправлена в 5.17, 5.16.15 и т.п.). Проследить за публикаций обновления пакетов в дистрибутивах можно на данных страницах: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Рабочий прототип эксплоита, позволяющий обычному пользователю получить root-доступ в Ubuntu Desktop 21.10 в конфигурации по умолчанию, уже размещён на GitHub. Утверждается, что при незначительных изменениях эксплоит также будет работоспособен в Fedora и Debian. Примечательно, что эксплоит изначально был подготовлен для соревнований pwn2own 2022, но разработчики ядра выявили и исправили связанную с ним ошибку, поэтому было решено раскрыть детали уязвимости.
- Две уязвимости (CVE-2022-1015, CVE-2022-1016) в подсистеме netfilter в модуле nf_tables, обеспечивающем работу пакетного фильтра nftables. Первая проблема позволяет локальному непривилегированному пользователю добиться записи за пределы выделенного буфера в стеке. Переполнение возникает при обработке определённым образом оформленных выражений nftables, обрабатываемых на этапе проверки индексов, заданных пользователем, имеющем доступ к правилам nftables.
Уязвимость вызвана тем, что разработчики подразумевали, что значение “enum nft_registers reg” является одним байтом, в то время как при включении определённых оптимизаций компилятор в соответствии со спецификацией C89 может использовать для него 32-разрядное значение. Из-за указанной особенности используемый при проверке и выделении памяти размер не соответствует фактическому размеру данных в структуре, что приводит к наложению хвоста структуры на указатели в стеке.
Проблема может быть эксплуатирована для выполнения своего кода на уровне ядра, но для успешной атаки требуется наличие доступа к nftables, который можно получить в отдельном сетевом пространстве имён (network namespaces) при наличии прав CLONE_NEWUSER или CLONE_NEWNET. Уязвимость также тесно связана с применяемыми компилятором оптимизациями, которые, например, включаются при сборке в режиме “CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y”. Эксплуатация уязвимости возможна начиная с ядра Linux 5.12.
Вторая уязвимость вызвана обращением к уже освобождённой области памяти (use-after-free) в обработчике nft_do_chain и может привести к утечке неинициализированных областей памяти ядра, которые можно прочитать через манипуляции с выражениями nftables и использовать, например, для определения адресов указателей при разработке эксплоитов для других уязвимостей. Эксплуатация уязвимости возможна начиная с ядра Linux 5.13.
Уязвимости устранены в сегодняшних корректирующих обновлениях ядра 5.17.1, 5.16.18, 5.15.32, 5.10.109, 5.4.188, 4.19.237, 4.14.274 и 4.9.309. Проследить за публикаций обновления пакетов в дистрибутивах можно на данных страницах: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Выявивший проблемы исследователь заявил о подготовке рабочих эксплоитов для обеих уязвимостей, которые планируется опубликовать через несколько дней, после того как дистрибутивы выпустят обновления пакетов с ядром.