Компания Calif, специализирующаяся на исследованиях в области безопасности, опубликовала подробности уязвимости в OpenBSD, которая восходит примерно к 37 годам назад, к исходным кодам BSD. Счётчик подключений разделяемой памяти был определён как знаковое 16-битное short. Многократный fork процесса с записями подключения разделяемой памяти мог вывести этот счётчик за максимальное значение 32 767, из-за чего он переполнялся и принимал отрицательное значение. Это целочисленное переполнение могло привести к использованию после освобождения через состояние гонки. В сочетании с отдельной записью за границами буфера в ядре оно позволяло локально повысить привилегии до root. Проблемы были устранены в errata 026 и 018.
Исследователи описали путь эксплуатации, который обеспечил локальный root в OpenBSD при включённых KARL, SMAP и SMEP, без использования уязвимости раскрытия информации. Метод включал отображение 127 сегментов разделяемой памяти System V, их отключение и создание 259 процессов через fork для переполнения счётчика подключений. Затем с помощью grooming кучи и состояния гонки выравнивались выделения памяти, повреждалась структура multicast и в конечном итоге получалось выполнение кода ядра путём перезаписи предсказуемого указателя ядра.
Эксплуатация опиралась на примитив write-what-where: запись выполнялась операцией TAILQ_REMOVE, целью была пользовательская память, сделанная доступной в режиме супервизора, а местом записи был предсказуемый указатель ядра. KARL в OpenBSD рандомизирует адреса функций и данных, однако аллокаторы памяти ядра остаются детерминированными, поэтому некоторые выделения на раннем этапе загрузки стали надёжными целями.
Чтобы снизить риск подобных атак, авторы предлагают такие меры, как safe-unlinking: проверку инвариантов двусвязных списков перед операциями отвязывания с последующим аварийным завершением через abort или panic при их нарушении. Компания Calif заявила, что регулярно сообщает об уязвимостях разработчикам проектов с открытым исходным кодом, часто с предлагаемыми исправлениями.
Источник: Hacker News · Сводку подготовил HeadlinesBriefing