Один 0day — и Apple решила перестроить ядро iOS с нуля

leer en español

Один 0day — и Apple решила перестроить ядро iOS с нуля

Как триллионная корпорация проиграла в регрессионный тест.

image

Пять лет назад, 23 мая 2020 года, в сообществе джейлбрейкеров произошёл исторический прецедент: в публичный доступ попал эксплойт tachy0n — полноценный 0Day в iOS 13.5, позволявший получить привилегии ядра. Это стало последним случаем, когда современная версия iOS была взломана до выхода исправления. Через девять дней Apple выпустила обновление безопасности, а ещё через полтора месяца появился форк эксплойта под названием tardy0n. Сегодня эта история рассматривается как граница между старым и новым подходом Apple к защите системы.

Tachy0n эксплуатировал уязвимость в системном вызове lio_listio, обрабатывающем асинхронные файловые операции. Ошибка заключалась в гонке между двумя потоками, которые могли попытаться освободить одну и ту же структуру lio_context. Если операция завершалась слишком быстро, структура могла быть освобождена дважды, что позволяло атакующему повторно занять это место в памяти под собственные нужды и провести подмену содержимого.

Интересно, что баг не был новой находкой. До публикации как 0day он уже использовался той же командой для 1day-эксплуатации в джейлбрейке Spice , нацеливавшемся на iOS 11. Там он применялся в двух вариантах — в приложении и в системном процессе racoon. Именно racoon оказался особенно интересен благодаря расширенным правам и доступу к системным функциям, таким как sysctl, что облегчало получение адресов объектов в ядре.

Сам эксплойт был реализован по всем канонам эпохи до iOS 14: с использованием гонок, перехвата структуры mach_port, подмены дескрипторов и контролируемого спрея объектов через IOSurface::setValue. Ядро можно было обмануть, заставив два разных объекта OSData указывать на один и тот же буфер, а затем постепенно заменять его содержимое — сначала на указатели, затем на поддельные структуры ядра.

Одним из нестандартных шагов стало использование IOBufferMemoryDescriptor, получаемого через интерфейс AGX (IOAcceleratorFamily2), для получения предсказуемого участка памяти с известным адресом. С его помощью удавалось размещать поддельные структуры task и mach port в ядре, обеспечивая полный контроль над системой. Чтобы эта память стала резидентной в ядре, автор вызвал особый метод processSidebandBuffer с корректной заглушкой в структуре — приём, вызвавший фолт и физическую инициализацию страниц.

Публикация эксплойта вызвала моментальную реакцию сообщества и специалистов по безопасности. Уже через четыре часа после выхода кода Брендон Азад из Project Zero нашёл и описал уязвимость, а спустя девять дней Apple выпустила специальное обновление, исправляющее именно этот баг. Примечательно, что баг вернулся из-за попытки Apple устранить старую утечку памяти — ошибку, ранее зафиксированную и устранённую в iOS 12. Всё указывает на то, что повторное появление уязвимости стало следствием небрежности при слиянии веток XNU без должного тестирования на регрессии.

Сама история tachy0n показала системные пробелы в подходах Apple того времени. Пока одни разработчики пытались вручную найти и исправить баги, другие, вроде автора unc0ver , добивались успеха простыми, но трудоёмкими методами — например, регрессионным тестированием старых уязвимостей. Именно так и был найден этот баг.

Однако уже в iOS 14 ситуация изменилась кардинально. Apple отказалась от точечных латок и начала защищать не баги, а целые подходы к эксплуатации. Аллокаторы kalloc и zalloc были полностью переработаны, появились kheaps — разные зоны памяти для данных пользователя и объектов ядра, была введена концепция «sequestering» для изоляции типов объектов, а также внедрены случайные страницы-защиты и дополнительная рандомизация. Это фактически уничтожило возможность надёжного перекрытия объектов между зонами и превратило эксплуатацию в куда более сложный и нестабильный процесс.

Дополнительно Apple начала адресно усиливать защиту конкретных объектов, часто используемых в эксплойтах. Структуры сообщений ядра были подписаны, буферы пайпов стали защищены PAC-механизмом, а попытки использовать чужие типы объектов стали приводить к немедленным паникам системы. В результате разработка эксплойтов стала настолько трудоёмкой, что публичная информация практически перестала появляться — со времён iOS 14 до сих пор не опубликован ни один полноценный эксплойт для версий 17 и 18, несмотря на фиксируемые атаки в дикой природе.

История tachy0n теперь воспринимается как финальный аккорд эпохи, когда jailbreak был массовым увлечением , а kernel LPE можно было получить, просто изучив багтрекеры. Сегодня, в преддверии iOS 19, даже исследователи с опытом десятилетий сталкиваются с почти непроходимой стеной из изоляций, подписей, PAC и перезапускаемых рантайм-проверок.

Но именно поэтому подробные рассказы о таких эксплойтах, несмотря на их возраст, остаются невероятно ценными — как памятник ушедшей эпохе и как энциклопедия старых техник, которые всё ещё могут чему-то научить.

Красная или синяя таблетка?

В Матрице безопасности выбор очевиден.