Знаковый 16-битный счётчик из старого кода BSD дал исследователям root на OpenBSD

Форкните 259 процессов с подключённой разделяемой памятью, и счётчик переполнится до −32 643. Гонка с удалением сегмента заставит ядро освободить память, которая ещё используется.

Вкратце

Исследователи Calif связали это use-after-free с отдельной записью за границы буфера и получили root-шелл на OpenBSD с включёнными KARL, SMAP и SMEP и без утечки информации. Счётчик shm_nattch был знаковым short, унаследованным примерно 37 лет назад.

От переполнения до root-шелла

Материал Calif начинается с shm_nattch, счётчика подключений к разделяемой памяти System V, который объявлен как знаковый 16-битный short. Многократный форк процессов с подключёнными сегментами поднимает его выше 32 767, и он уходит в отрицательные значения; гонка состояний превращает это в use-after-free. В связке с отдельной записью за границы буфера в ядре это даёт локальное повышение привилегий до root. Исправления вышли в errata 026 и 018.

Эксплойт подключает 127 сегментов общей памяти, отключает их и форкает 259 процессов, чтобы довести счётчик до −32 643. Он раскладывает кучу ядра, используя статистику malloc из sysctl, выигрывает гонку, удаляя сегмент через IPC_RMID, пока вспомогательный процесс подключает новый, и затем размещает структуру ip_moptions сокета там, где запись за границы портит счётчики членства. Закрытие сокета запускает атомарные декременты, которые меняют самоссылающееся отображение таблицы страниц и дают ядру доступ к памяти пользователя. После этого эксплойт перезаписывает предсказуемый указатель на функцию ядра и восстанавливает его. Автор называет результат примитивом «записать что-то куда-то» (write-what-where).

Почему слабость — в детерминированности

Авторы считают, что детерминированные аллокаторы OpenBSD делают эксплуатацию надёжной, и предлагают проверки безопасного unlink, рандомизацию адреса самоссылающейся таблицы страниц и раскладки аллокатора, а также поддержку на уровне компилятора, например санитайзеры границ массивов и аллокационные токены.

Миф об аудите и что баг говорит о C

Один комментатор, который направил ИИ на два самых маленьких инструмента OpenBSD, `cat` и `find`, нашёл там тоже несколько багов:

«В истории никто не смог написать корректный C-код, и это включает разработчиков OpenBSD… Насколько я помню, эти баги существуют со времён раскола NetBSD и OpenBSD.»

Поправку дал вечный студент и иногда разработчик, как он себя называет, отвечая на шутку, что OpenBSD теперь должна поправить главную страницу. В заголовке обещано «только две удалённые дыры в установке по умолчанию», и «это не удалённая» — значит, утверждение остаётся в силе. Эксплойту нужно локальное выполнение кода, поэтому он угрожает общим и многопользовательским машинам, а не серверу с настройками по умолчанию. Установите errata 026 и 018 везде, где у ненадёжных пользователей есть шелл.

Получайте такие разборы каждый день

Главные истории Hacker News — на email, в Telegram или RSS.

Следующая новость · 10 из 13 Читать дальше
🚀Tech

Четыре Mac Studio на M5 Ultra по Thunderbolt 5 запускают модель на 816 млрд параметров

Muse Spark Open нужно около 493 ГБ только для 4-битных весов, поэтому ни один Mac такую модель не вместит. Ответ Apple — разделить её между несколькими машинами.

★ 269 · 💬 123 · machinelearning.apple.com · 2 мин