37-летний баг в коде BSD помог обойти все защиты OpenBSD одновременно
37-летний баг в коде BSD помог обойти все защиты OpenBSD одновременно Есть что-то завораживающее в том, как ошибка, написанная ещё в восьмидесятых, продолжает аукаться системе, которая славится словом "secure by default". Исследователь Эндрю Гриффитс из Calif показал рабочий эксплойт Big Fish, поднимающий права обычного пользователя до root в OpenBSD. Корень проблемы уходит прямиком в код старой BSD, где счётчик подключений к разделяемой памяти System V сделали 16-битным знаковым. Казалось бы, мелочь, но если подключений больше 32 767, счётчик уходит в минус, и учёт ссылок на объекты памяти начинает врать. На практике это выглядело так: создать 127 сегментов общей памяти, запустить 259 дочерних процессов, и готово, счётчик падает до минус 32 643, открывая состояние гонки между удалением сегмента и новым подключением к памяти. Ядро обращается к уже освобождённому объекту, и вот тут начинается самое интересное — одного этого бага не хватило бы, поэтому Гриффитс связал его ещё с одной ошибкой записи за пределами выделенной памяти, подменил данные в структуре сетевого сокета и через это добрался до таблиц страниц памяти. В итоге он выполнил код на уровне ядра, и всё это при включённых KARL, SMAP и SMEP, которые как раз для того и придуманы, чтобы такое не прокатывало. Самое неприятное даже не сама цепочка багов, а то, как её обошли защитные механизмы без единой дополнительной уязвимости для утечки адресов. KARL должен рандомизировать расположение функций и данных ядра, но распределители памяти OpenBSD не всегда выбирают адреса случайно, и после перезагрузки на одном железе некоторые структуры оседают на предсказуемых местах. То есть защита технически работает, но у неё остаются слепые пятна, которыми и воспользовался эксплойт через обработчики интерфейсов lo0 и enc0. Патчи вышли ещё до публикации исследования (обновления 018 и 026 от сентября), так что для OpenBSD 7.9 всё уже закрыто через syspatch. Плохая новость в том, что релиз 7.9 буквально недавно разбирали с другим 27-летним багом, и похоже, в этом древнем коде ещё есть что искать. @linux0ids
Канал в каталоге Максиметера
2 504 подписчиков · IT и технологии