34C3: Санта уже здесь! Часть 1.
(Части расположены так для удобства чтения)
Итак, уже два дня назад прошло выступление qlutoo, naehwert и derrek по поводу Nintendo Switch на 34C3. Выступление слегка поменяло название – теперь это Homebrew on Horizon, что одновременно является каламбуром по поводу названия ядра Switch OS – Horizon и в то же время просто красиво звучит – хоумбрю на горизонте.
Выступление прошло, видео появилось на YouTube, и быстро было удалено сами знаете кем (хотя потом и было перезалито добровольцами). На всякий – есть ссылка на Vimeo:
https://vimeo.com/249107036Выступление началось со стёба над SEGA, которая в японском релизе Puyo Puyo Tetris оставила на своём логотипе ссылку на свой сайт, что можно было использовать для подмены страницы через DNS – и соответственно атаки. Запуск эксплоита, правда не задался из-за нестабильной сети на мероприятии, поэтому хакеры перешли к основной части объяснений.
Начали с основ. Джой-коны не защищены, и могут быть перепрошиты чем угодно. Потом пошла разборка консоли, спасибо за модульную память Nintendo и ещё одно подтверждение тому, что перед нами абсолютно обычный Tegra X1, который снабжён убийственным по размеру мануалом в 3000 страниц. О такой документации могли только мечтать во время взлома 3DS.
Вернулись и к предохранителям. 32-битная защита от даунгрейда. Код защиты загрузки на 128 бит. И хэш публичного ключа на 256 бит. Ну и чтобы закончить картину – патчи загрузчика на 320 байт. В общем – полный фарш.
Вернёмся к процессору в полном его понимании – как студенты (спец-цена для университетов – 50% от реальной стоимости), они купили официальный девкит для разработки программного обеспечения для TX1 за 350 Евро под названием Jetson. Таким образом, стало возможным получить полный доступ ко всем интерфейсам.
Ещё раз сообщили о том, что операционная система Nintendo Switch – это не перекрашенная FreeBSD. Это разработка Nintendo – микроядро Horizon. Все драйвера и сервисы находятся в песочнице пользователя, то есть не используют права Root. К слову ко всей платформе не применимо слово Root. Его там просто нет и быть не может.
Для видеодрайвера используется единственная кастомная часть в TX1 – софт-прослойка NVN API специально написанный для консоли. Он похож на драйвер видеокарт NVIDIA для Linux’а, но многое переименовано и приведено к Vulcanоподобному стилю работы. Собственно под NVN API документации никакой нет, и грядущие годы будут направлены на её создание хакерами, если её просто не сольют, в конце концов.
После этого пошло сравнение с 3DS. Все процессы в юзер-песочнице теперь имеют рандомизацию в памяти (после каждой перезагрузки процесс будет занимать другое положение в виртуальном адресном пространстве – нельзя будет взломать по фиксированным местам). Раньше такое происходило только ядре, чтобы нельзя было получить самые важные данные, касающиеся ключей, обращений к сопроцессорам и деликатных частей файловой системы.
С новой архитектурой Horizon, когда все сервисы находятся в песочнице пользователя – рандомизируют положение в памяти теперь и в ней. Так что никаких вам NinjaHax, NoteHax и прочего, так как помимо бага приложения нужен будет баг рандомизатора.
Все сервисы были переименованы, но это не особая проблема. Криптопроцессор уступил своё место встроенной системе TrustZone от ARM. Это самая привилегированная зона, которая может только расшифровывать и зашифровывать. Не сильно отличается от SAMU в PS4 или f00d в PS Vita.
Далее пошло объяснение структуры защиты.
После траст-зоны идёт ядро, которое отвечает за память, изоляцию процессов. Потом идут макросервисы файловой системы(fs), сервис менеджера процессов(sm) – он осуществляет вайтлистинг (выполнение точного свода правил) обмена сообщениями между сервисами консоли, (pm) – запускает и выключает процессы, (spl) – сервис-интерфейс для общения с траст-зоной. После этого идут микросервисы с малыми привилегиями – это драйверы. Ну и совсем не доверяют играм и приложениям.
Им настолько не доверяют, что файловые системы у них появляются только в момент запуска – per-process filesystems. Более того – игра может обращаться только к своим данным и сохранению и не имеет малейшего права использовать карту памяти.
После этого пошёл процесс изучения песочниц у каждого уровня. Получили 65 из 103 системных вызовов, обнаружили, что у драйверов нет файловой системы как таковой, а некоторые функции, за которые должны были отвечать драйвера интерфейсов - насильно перенесены в ядро.
Как взломан Webkit вы все уже знаете – до 3.0.0 PegaSwitch. Ничего нового нет. Браузер встроенный в консоль всегда обращается по https:// даже если его на сайте нет. Дальнейшее увеличение привилегий идёт через сервис pre-load userspace (pl:u), который падает при больших значениях на него поданных. За счёт последнего стало возможным читать данные за границей массива и сдампить код сервисов микро-сервисов.
Следующий шагом стал отгремевший sm:hax. Сервис sm отвечает за разрешение общения между сервисами. Разграничение идёт по идентификационному номеру сервиса. Оказалось, что процесс выделения правила из списка можно пропустить, просто не дав сервису выполнить функцию инициализации. При этом сервис получает идентификационный номер 0, для которого просто нет списка правил. Таким образом, мы получаем доступ к обмену сообщениями между всеми макросервисами, то есть получаем контроль над ними.