Интересно Взлом прошивок USB-устройств: Часть 1

Takeshi

Перо Дьявола
Команда форума
PR-group
CPA & Трафик
Регистрация
23 Янв 2019
Сообщения
1,351
Баллы
0
Общие продажи
0$
Общие покупки
0$
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Кто взламывает игровые приставки?
Производство пиратских, нелицензированных изделий — многомиллиардная индустрия и на рынке можно найти аксессуары практически для всех когда-либо вышедших игровых приставок. Здесь и устройства, позволяющие воспроизведение копий лицензионных игр из «бэкапов» с произвольных носителей, и контрафактные геймпады, и различные адаптеры для игровых контроллеров (в том числе дающие преимущество перед другим игроками), и гаджеты для применения читов в офлайн- и онлайн-играх. Разумеется, все эти устройства продаются вопреки желанию производителей игровых приставок.

Защита геймпада DualShock 4
В первые дни существования PlayStation 4 публично известная

Please Login or Register to view hidden text.

в ядре FreeBSD, на котором основано ядро этой приставки, позволила мне (и многим другим исследователям) приобщиться к архитектуре и принципам работы консоли Sony. Я провел множество исследований, в том числе, изучил принципы аутентификации игровой периферии и то, как PS4 отличает лицензированные устройства от нелегальных. Ранее я проводил подобные исследования

Please Login or Register to view hidden text.

, и авторизация периферийных устройств у PS4 оказалась хоть и проще чем у Xbox 360, но не менее эффективна.


Схема авторизации USB-аксессуаров PlayStation 4
PS4 посылает 0x100 случайных данных, в ответ на которые DualShock 4 генерирует подпись RSASSA-PSS SHA-256 и присылает её вместе с криптографическими константами N и E (публичный ключ), которые нужны для верификации этой подписи. Эти константы уникальны для каждого выпущенного геймпада. Также геймпад посылает подпись для верификации N и E, алгоритм тот же — RSASSA-PSS SHA-256, но криптографические константы едины для всех приставок и хранятся в ядре приставки.

Таким образом, чтобы авторизовать свое устройство недостаточно взломать ядро приставки — нужно иметь приватный ключ геймпада. И если кто-то всё-таки взломает геймпад и получит его, то у Sony остается возможность заблокировать ключ с обновлением прошивки. Также, если в течении 8 минут приставка не получает авторизационное сообщение от геймпада, то она прекращает «общение» с ним, и чтобы продолжить использование устройства нужно отключить его от консоли и подключить заново. Симуляция этого процесса очень раздражала владельцев первых нелегальных геймпадов.

Слухи о суперподделке DualShock 4
Схему аутентификации DualShock 4 не могли взломать довольно долго. Но в какой-то момент я услышал, что на рынке появились поддельные геймпады, которые выглядят и работают в точности, как оригинальные. Мне захотелось посмотреть на них своими глазами и, оформив несколько заказов на китайских торговых площадках, я стал ждать.

Время ожидания было решено скрасить поиском подробной информации о подделках. После некоторого количества поисковых запросов, я наткнулся на контроллер Gator Claw.


Неавторизированный геймпад Gator Claw
Интересным в нем было то, что, судя по обсуждению контроллера на Reddit, сначала он работал, как и другие неавторизованные геймпады — по 8 минут, но разработчики смогли это исправить в обновлении прошивки. На сайте магазина была доступна ссылка на файл обновления и руководство по его установке, которые я и скачал.


Инструкция по обновлению геймпада Gator ClawОсновы анализа embedded прошивок
Первым делом я решил взглянуть на секцию ресурсов программы, устанавливающей обновление прошивки и сразу сделал несколько интересных открытий.


Прошивка, найденная в ресурсах программы обновления Gator Claw
Читатели, знакомые с программированием embedded-устройств, наверняка узнают этот формат. Это файловый формат Intel HEX который часто применяется для программирования микроконтроллеров и многие компиляторы, например, GNU Compiler, могут выводить скомпилированную программу в таком формате. Также мы можем видеть, что начало этой прошивки не имеет большой энтропии и последовательности байтов легко различимы, что означает отсутствие шифрования или сжатия. После декодирования Intel HEX стрима и загрузки в редактор (010 Editor умеет открывать файлы прямо в таком формате) мы можем взглянуть на прошивку. Что это за архитектура? ARM Cortex-M настолько распространен что я различаю его с первого взгляда.


Прошивка Gator Claw (слева) и векторная таблица ARM Cortex-M (справа)
Согласно

Please Login or Register to view hidden text.

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

Помимо этого, в ресурсах был найден файл конфигурации с описанием различных микроконтроллеров. Скорее всего, разработчики программы для обновления задействовали некий общедоступный код от производителя микроконтроллера и наиболее вероятно, что этот файл конфигурации шел вместе с этим публичным кодом.


Файл конфигурации с описанием различных микроконтроллеров
После поиска идентификаторов из файла конфигурации мы находим сайт производителя этих микроконтроллеров – Nuvoton. Продуктовая линейка, техническая документация и SDK свободно доступны на сайте, и, более того, для их скачивания не нужно принимать какое-либо соглашение.


Сайт производителя микроконтроллеров Nuvoton
Благодаря этому у нас есть прошивка, мы знаем архитектуру и производителя микроконтроллера, у нас есть сведения о базовом адресе, вершине стека и точке входа. Доступной информации более чем достаточно, чтобы загрузить прошивку в IDA Pro и приступить к анализу.

В процессорах ARM поддерживаются два режима исполнения кода с различными инструкциями: ARM (32-битные инструкции) и Thumb (16-битные инструкции, дополненные Thumb-2 32-битными инструкциями). Cortex-M0 поддерживает только режим Thumb, поэтому мы установим переключатель в Processor options – Edit ARM architecture options – Set ARM instructions на NO во время загрузки прошивки.

Мы видим, что прошивка хорошо загрузилась по базовому адресу 0, автоматический анализ распознал практически все функции. И теперь встает вопрос – как правильно анализировать прошивки?


Одна из функций, присутствующих в прошивке
Если изучить эту прошивку, то мы увидим, что она совершает большое количество операций чтения и записи к памяти с базовым адресом 0x40000000. Это базовый адрес где находится память, отведенная под ввод-вывод (memory mapped input output — MMIO). Через эти адреса предоставляется доступ ко всем периферийным компонентам, которые есть у микроконтроллера. Все что делает прошивка происходит через доступ к MMIO-регистрам.


Схема адресов периферийных устройств
Найдя в документации адрес 0x40000000 мы узнаем, что этот микроконтроллер серии M451. Зная семейство микроконтроллера, можем скачать SDK и образцы кода для этой платформы. Внутри SDK мы находим заголовочный файл с объявлением всех MMIO-адресов, всех битовых полей и структур. Так же мы можем скомпилировать образцы кода и все библиотеки, а затем сравнить их с функциями в нашей IDB, или мы можем просто искать имена MMIO адресов в исходном коде и сравнивать их с нашим ассемблерным кодом. Это превращает процесс обратной разработки прошивки в простой и легкий процесс. Анализ был бы намного сложнее если бы у нас не было информации об архитектуре и модели микроконтроллера, и MMIO-регистрах. К слову, именно поэтому многие производители делятся SDK только после подписи NDA.


Процесс нахождения библиотечных функций в коде прошивки
Но что по-настоящему заинтересовало меня в этой прошивке — одна неиспользуемая строка с именем крупного производителя электроники (наиболее известного своими логическими анализаторами, но, как оказалось, имеющего и игровое подразделение). Судя по всему, она должны была быть частью USB Device Descriptor, но этот дескриптор не был использован.

В тени гиганта
Мне удалось найти магазин с огромным ассортиментом игровых аксессуаров, продаваемых под единой торговой маркой. Среди продаваемых аксессуаров числились два десятка различных адаптеров для подключения геймпадов одной приставки к другой. К примеру, отдельный продукт для подключения геймпада Xbox 360 к приставке PS4, отдельный продукт для подключения геймпада PS3 к приставке Xbox One, и многие другие, включая «все в одном». Также ассортимент продукции включает адаптеры для подключения клавиатуры и мыши к консолям PS4, Xbox One и Nintendo Switch, различные игровые геймпады и печатные платы для создания своих аркадных контроллеров для приставок. Все продукты шли с обновлениями, аналогичными тому, которое шло с Gator Claw, но с существенным отличием – все прошивки были зашифрованы.


Пример инструкции и зашифрованной прошивки из ресурсов программы обновления к одному из продуктов
Теперь попробуем найти фотографии печатных плат аркадных контроллеров, что позволит оценить схему устройства, не покупая и не разбирая его. Скорее всего их дизайн идентичен дизайну Gator Claw. На найденных фотографиях мы можем видеть два микроконтроллера: один из них должен быть Nuvoton M451, а другой – вспомогательный, для секретов: производители понимают, что конкуренты могут изучить их прошивку, и чтобы предотвратить это используют второй микроконтроллер. Забегая вперед, скажу, что в нашем случае он тоже присутствовал. Данные для аутентификации передаются в него по протоколу I2C и после получения отправляются обратно на приставку.

Поскольку все дорожки идут к микроконтроллеру под черной эпоксидной смолой, мы можем заключить, что это главный микроконтроллер. А микроконтроллер с четырьмя желтыми ножками соответствует требованиям для работы по протоколу I2C и является вспомогательным.


Примеры внутреннего дизайна выпускаемой продукцииВнутри контроллера
К этому моменту я наконец получил посылку из Шэньчжэня, и надо сказать, что контрафактный гаджет очень сложно отличить от оригинального DualShock 4: геймпад выполнен из качественных материалов, touchpad работает, динамик и гарнитура тоже.


Контрафактный DualShock 4 (вид снаружи)
С помощью комбинации клавиш из инструкции я проверил, что геймпад переходит в DFU-режим, и приступил к разборке. Отмечу, что при этом на ПК геймпад определился как другое устройство, с иными идентификаторами и характеристиками.


Контрафактный DualShock 4 (вид на главную плату)
Я припаял провода к отладочным площадкам и подключил программатор. Программатор определил устройство, но security lock был установлен.


Программатор определил микроконтроллер и включенный Security LockМетод взлома прошивок USB-устройств
Дизайн USB-протокола определяет две сущности — хост и остальные устройства, которые подключаются к нему. Они, в свою очередь, разделяются на классы: hub, human interface, printer, imaging, mass storage device и другие.


Схема подключения USB устройств
Общение между устройствами и хостом происходит посредством односторонних и двухсторонних каналов. Под каналом мы подразумеваем передачу данных между программой на хосте и конкретным «конечной точкой» на устройстве. Таких точек может быть несколько для передачи различных данных.


Схема типов передачи данных
Существует четыре типа передачи данных:

  • Control Transfers (используется для конфигурации)
  • Bulk Data Transfers (большие количества последовательных данных)
  • Interrupt Data Transfers (используются для своевременной и точной передачи данных)
  • Isochronous Data Transfers (беспрерывный поток данных)
Все USB-устройства должны иметь особый канал на нулевой конечной точке, зарезервированный для конфигурации устройства.

Эти типы передачи данных осуществляются посредством пакетов, представленных на рисунке ниже:


Пакеты, задействованные в протоколе USB
По факту, USB-протокол — это машина состояния, и в этой статье мы не будем останавливаться на каждом из этих пакетов. Ниже представлен пример осуществления Control Transfer:


Control Transfer
Устройства могут содержать уязвимости в каждом из четырех типов передачи данных, но эти типы опциональны, к тому же их наличие и применение будет сильно отличаться от устройства к устройству. Но все устройства поддерживают Control Transfers и формат, по большей части, един для всех устройств, что делает данный тип передачи данных наиболее интересным для анализа на наличие уязвимостей.

Диаграмма ниже изображает формат SETUP-пакета, который используется для выполнения Control Transfer.


Формат SETUP-пакета
SETUP-пакет занимает 8 байт и может предоставлять различные данные в зависимости от типа запроса. Некоторые из них едины для всех устройств (например, дескрипторы), другие зависят от класса устройства или желания производителя. Размер передаваемых/получаемых данных задается 16-битным словом и также передается в SETUP-пакете.


Примеры запросов
Подводя итог: Control Transfers используют простой протокол, поддерживаемый всеми USB-устройствами, которые могут иметь множество дополнительных команд, и мы контролируем размер данных. Все это делает Control Transfers идеальной целью для фаззинга и глитчинга.