Cайт программиста Ruby, веб-разработчика Ruby on Rails ESV Corp. Екатеринбург, Москва, Санкт-Петербург, Новосибирск, Первоуральск

37 лет в исходном коде. Древняя ошибка позволила получить root в OpenBSD

Ошибка, пережившая почти четыре десятилетия развития BSD, помогла получить полный контроль над современной OpenBSD. Специалист компании Calif Эндрю Гриффитс показал рабочий эксплойт Big Fish, который повышает права обычного локального пользователя до root. Для атаки потребовалась цепочка из нескольких ошибок ядра, а не один древний дефект.

История началась со счётчика подключений к общей памяти System V. Разработчики старой BSD задали для него 16-битный знаковый тип, допускающий значения лишь до 32 767. Когда число подключений превышает предел, счётчик становится отрицательным. Ошибка сохранилась в унаследованном коде и позволила нарушить учёт ссылок на объекты памяти. В демонстрации Calif создала 127 сегментов общей памяти и запустила 259 дочерних процессов. Такое сочетание довело значение счётчика до минус 32 643. Затем эксплойт использовал состояние гонки между удалением сегмента и новым подключением к памяти. Ядро могло обратиться к уже освобождённому объекту, открыв путь к следующему этапу атаки.

Одного переполнения счётчика для получения root было недостаточно. Авторы связали ошибку освобождения памяти с отдельной записью за пределами выделенного участка. Подмена данных в структуре сетевого сокета позволила повлиять на таблицы страниц памяти, изменить права доступа к отображению и подготовить выполнение кода на уровне ядра.

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

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

Разработчики OpenBSD выпустили исправления ещё до публикации Big Fish. Обновление 018 от 14 сентября 2026 года устраняет ошибку в shmat, а обновление 026 от 30 сентября закрывает проблему со счётчиком ссылок, способную вызвать обращение к освобождённой памяти. Для OpenBSD 7.9 доступны патчи через syspatch. Оценка CVSS и версия методики для цепочки не опубликованы.

Опубликованный код подтверждает возможность локального повышения привилегий, но не свидетельствует о реальных атаках через Big Fish. Для эксплуатации необходим доступ к выполнению программ на целевой машине. Ранее релиз OpenBSD 7.9 уже сопровождался обсуждением другой ошибки, прожившей 27 лет. Новая цепочка показала, что даже несколько уровней защиты ядра не устраняют риск из-за старого кода.

SecurityLab