Как 37-летняя ошибка открыла путь к root в OpenBSD 7.9?

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

Переполнение связано с функцией shmat(4), подключающей разделяемую память. Она использует счётчик shm_nattch, объявленный как знаковое 16-битное число типа short. Его максимум — 32 767. Такой тип присутствует в исходниках BSD ещё с 1988 года; OpenBSD унаследовала его и не расширила.
Чтобы вызвать переполнение, эксплойт отображает 127 сегментов разделяемой памяти и запускает 259 процессов через fork. Счётчик выходит за предел, оборачивается и принимает значение −32 643. Затем гонка приводит к use-after-free: из-за испорченного счётчика ядро освобождает память, которой всё ещё пользуются другие процессы.
Следующий этап использует отдельную запись за границы выделенной области. Она меняет счётчики членства в группах многоадресной рассылки ядра. Когда затронутый сокет закрывается, уменьшение этих счётчиков изменяет записи таблиц страниц. Отображение пользовательской памяти становится доступным в режиме супервизора, что позволяет обойти SMAP и SMEP. После этого эксплойт перезаписывает указатель на функцию по предсказуемому адресу ядра и запускает собственный код.
KARL — Kernel Address Randomized Link — перелинковывает ядро, меняя адреса функций и данных. Но распределители памяти ядра остаются детерминированными. Как написал исследователь Эндрю Гриффитс: «Хотя KARL в OpenBSD перелинковывает ядро, рандомизируя адреса функций и данных, распределители памяти ядра остаются детерминированными».
Ни загрузочный распределитель памяти, ни распределитель best-fit не рандомизируют базовые адреса. Поэтому структуры, создаваемые на раннем этапе загрузки, включая указатели на функции в обработчиках сетевых интерфейсов lo0 и enc0, после перезагрузки оказываются по тем же адресам на одном и том же оборудовании. Эксплойту не нужна уязвимость для раскрытия адресов.
Переполнение исправили в errata 018: обновление вышло 14 сентября как исправление надёжности. Оно также доступно для OpenBSD 7.8. Ошибку подсчёта ссылок, приводившую к use-after-free, закрыли в errata 026, опубликованной 30 сентября как исправление безопасности. Оба патча устанавливаются через syspatch и распространяются на все архитектуры.
На момент публикации ни одной из уязвимостей не присвоили CVE; свидетельств их использования в атаках не было. Calif сообщила OpenBSD об ошибках «ранее в этом году». После выхода патчей компания разместила подробный разбор и полный код proof of concept на GitHub.
Для дополнительного укрепления ядра Calif предложила безопасное удаление элементов из связанных списков — safe-unlinking, уже применяемое во FreeBSD и NetBSD. Среди других предложений — рандомизация самоссылочного отображения таблиц страниц, рандомизация распределителя памяти ядра и проверка границ массивов на уровне компилятора.


Новое на сайте

20865Как исследовательские модели OpenAI обходили ограничения и присваивали чужие данные 20864Атака на BeyondTrust: шпионская группа получила доступ к серверам поддержки 20863Как пакет imgdecode превращает npm-зависимость в загрузчик вредоносного кода? 20862Как PEERSTITCH обходит проверки VPN-сессий FortiOS? 20861Что происходит, когда ИИ-агент выходит за пределы тестовой среды? 20860Как 37-летняя ошибка открыла путь к root в OpenBSD 7.9? 20859ИИ-модели для SOC: точный ответ зависит от улик 20858Как одна учётная запись ConnectWise открыла доступ к 173 арендаторам Microsoft 365? 20857Пять минут до заражения: как подменили обновления AOMEI Backupper 20856Ловушка под видом регистрации: как UAT-11985 крадёт аккаунты Google 20855Может ли виртуальная машина прочитать память хоста? 20854Как дешёвые Android-смартфоны превращаются в чужие прокси? 20853В Индии имя звонящего появится на экране вместе с номером 20852Как проверить готовность команды к звонку с клонированным голосом? 20851Уязвимости MarkLogic: делегированные права могли открыть путь к администраторскому...
Ссылка