Перейти к содержанию
Tech Threat Lab
TTL

В OpenBSD 7.9 закрыли цепочку локального повышения привилегий до root

В OpenBSD 7.9 закрыли цепочку локального повышения привилегий до root

Исследовательская компания Calif опубликовала доказательство концепции локального повышения привилегий до root в OpenBSD 7.9. По описанию исследователей, цепочка объединяет переполнение целого числа в механизме разделяемой памяти с ошибкой use-after-free в ядре и обходит KARL, SMAP и SMEP.

OpenBSD выпустила исправления для обеих проблем в сентябре. Переполнение в функции присоединения разделяемой памяти shmat(4) закрыто патчем 018 от 14 сентября, классифицированным как исправление надёжности. Ошибка use-after-free, связанная с подсчётом ссылок и завершающая цепочку эксплуатации, устранена в security-errata 026 от 30 сентября.

Обновления доступны через syspatch и распространяются на все архитектуры. Для OpenBSD 7.8 также выпущен патч от переполнения целого числа. По состоянию на 16 октября 2026 года CVE этим недостаткам не назначены, публичных сведений об их использовании в атаках нет.

Как возникает переполнение

Отправной точкой служит поле shm_nattch — счётчик присоединений к сегменту разделяемой памяти. В исходном коде BSD 1988 года оно задано знаковым 16-битным типом short с максимальным значением 32 767. Как отмечает Calif, OpenBSD унаследовала этот тип без изменения размера.

Для демонстрации исследователи отображают 127 сегментов разделяемой памяти и запускают 259 процессов. Счётчик превышает допустимый максимум и переполняется до отрицательного значения −32 643. Затем условие гонки приводит к use-after-free: повреждённый счётчик ссылок заставляет ядро освободить память, на которую продолжают ссылаться другие процессы.

При планировании таких работ можно отдельно изучить в разделе услуг ИТБ по информационной безопасности доступные направления и сопоставить их с задачами своей организации.

Как цепочка получает выполнение кода в ядре

Следующий этап, по данным Calif, использует отдельную запись за допустимые границы для перезаписи счётчиков членства в многоадресной рассылке ядра. После закрытия затронутого сокета дальнейшие операции уменьшения счётчиков меняют записи таблиц страниц. Это переводит отображение пользовательской памяти в привилегированный режим и, согласно описанию компании, позволяет обойти аппаратные механизмы SMAP и SMEP.

После этого доказательство концепции перезаписывает указатель на функцию по предсказуемому адресу в ядре и запускает собственный код. KARL в OpenBSD перекомпилирует ядро с рандомизацией адресов функций и данных. Однако исследователь Calif Эндрю Гриффитс указал, что аллокаторы памяти ядра остаются детерминированными: аллокатор, работающий при загрузке, и аллокатор best-fit не рандомизируют базовый адрес.

Поэтому структуры, созданные на раннем этапе загрузки, включая указатели на функции в обработчиках сетевых интерфейсов lo0 и enc0, получают одинаковые адреса при каждой перезагрузке на одном оборудовании. По выводу Calif, отдельная уязвимость раскрытия информации для этой цепочки не нужна. Полный код доказательства концепции компания разместила в GitHub уже после выхода исправлений. OpenBSD, по её данным, уведомили о проблемах в начале 2026 года.

Помимо выпущенных патчей, Calif предложила четыре направления дальнейшего усиления OpenBSD: безопасное удаление ссылок в связных списках ядра, рандомизацию самореференциального отображения таблиц страниц, рандомизацию аллокатора ядра и проверки границ на уровне компилятора. Безопасное удаление ссылок в ядре уже применяется во FreeBSD и NetBSD.

Практический вывод для администраторов — установить актуальные обновления через syspatch и проверить наличие патчей 018 и 026. В ветке 7.8 необходимо как минимум применить исправление переполнения shmat(4). Публично описанная эксплуатация локальная, а данных об атаках с её использованием пока нет.