Защита и взлом Xbox 360 (Часть 3)

в 17:07, , рубрики: Без рубрики

Защита и взлом Xbox 360 (Часть 3) - 1

В 2011 году, через 6 лет после выпуска игровой приставки Xbox 360, исследователями был обнаружен занимательный факт — если на вывод RESET центрального процессора на очень короткое время подать сигнал «0», процессор не сбросит своё состояние (как должно быть), но вместо этого изменит своё поведение! На основе этой «особенности» был разработан Reset Glitch Hack (RGH), с помощью которого удалось полностью скомпрометировать защиту Xbox 360, запустить неподписанный код, тем самым открыв путь к взлому самой системы и победе над «невзламываемыми» приводами DG-16D5S.

Давайте же рассмотрим в деталях, как работал RGH, как разработчики пытались залатать дыру и как эти заплатки смогли обойти!

Что вообще за глич атака?

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

Защита и взлом Xbox 360 (Часть 3) - 2

Действительно, компилируя код

i = i + 2;

вы полагаетесь на то, что значение переменной i увеличится ровно на 2, даже не представляя себе, как может быть иначе.

Глич-атаки нарушают эту уверенность — их цель направлена на то, чтобы процессор «сглючил» и повёл себя не так, как надо. Способов «глюкнуть» процессор несколько, например:

  • Просадить напряжение питания ЦПУ
  • Дать лишний импульс в опорную частоту ЦПУ
  • «Посветить» на проц радиацией

Есть специальные устройства для проведения подобных атак — например, ChipWhisperer предлагает широкий ассортимент атак по частоте и питанию:

Защита и взлом Xbox 360 (Часть 3) - 3

В случае же с Xbox 360, «глюк» происходит в результате воздействия на линию RESET. Процессор начинает процедуру сброса, но из-за очень краткой длительности сигнала, не успевает её завершить и продолжает работать как ни в чём ни бывало. Но именно на этот краткий миг, пока сигнал RESET активен, его поведение изменяется!

Глючим процессор

Защита Xbox 360 держится на том, что загрузчики проверяют друг друга по цепочке. В конечном итоге, проверка на каждом этапе сводится к вызову функции сравнения хеш-суммы с «образцом». Тут-то и применили глич-атаку, заставив процессор проигнорировать несовпадение. Импульс на линию RESET сразу после вызова процедуры memcmp заставляет процессор «пойти» по другой ветке и продолжить загрузку, даже если хеш-сумма неверна:

Защита и взлом Xbox 360 (Часть 3) - 4

Наилучшее место для атаки нашлось в загрузчике второго этапа, «CB». Более поздние этапы атаковать сложнее (да и легко пофиксят), а на первом этапе загрузки («1BL», ROM) из-за несколько иного построения программного кода атака не удалась.

Звучит просто, но на деле при попытке осуществить атаку, обнаружилось множество нюансов.

Для начала, чтобы успешно провести глич-атаку, необходимо очень точно определить момент времени, когда следует подавать RESET импульс. Если ошибиться хотя бы на микросекунду, послать слишком короткий или длинный импульс, атака не срабатывает.

К счастью, в Xbox 360 каждый этап загрузки сопровождается изменением значения на отладочной шине POST_OUT. Более того, отладочный вывод настолько часто расставлен, что новое значение POST задаётся сразу перед сравнением хеш-суммы:

Защита и взлом Xbox 360 (Часть 3) - 5

Настолько близкое расположение отладочного вывода от места атаки оказалось крайне удобным триггером. POST_OUT является параллельной шиной и выводится на 8 тестовых площадок на печатной плате, каждая из которых отвечает за один из битов значения. Удалось даже упростить схему подключения, используя только один бит и считая количество изменений его состояния с момента загрузки системы:

Защита и взлом Xbox 360 (Часть 3) - 6

Также выяснилось, что из-за высокой частоты работы процессора, почти невозможно попасть в нужный момент по точности и длительности. Время воздействия должно быть очень мало, порядка времени исполнения одной инструкции процессором. Но чем медленнее работает процессор, тем больший временной промежуток нас устраивает. Поэтому берём и замедляем процессор!

На обычном ПК частота CPU определяется как произведение внешней, «опорной» частоты и множителя:

Защита и взлом Xbox 360 (Часть 3) - 7

Так и в Xbox 360, к процессору подходят внешние линии опорной частоты, а внутри эта частота умножается с помощью PLL. И на старых, «толстых» ревизиях приставки механизм PLL можно было отключить, замедлив процессор аж в 128 раз:

Защита и взлом Xbox 360 (Часть 3) - 8

На «Slim» версиях трюк с PLL провернуть нельзя (линия не разведена на плате), и раз на множитель в «Slim» мы повлиять не можем, то уменьшим «опорную» частоту!

Она генерируется чипом HANA, и его можно конфигурировать по шине I2C:

Защита и взлом Xbox 360 (Часть 3) - 9

К сожалению, сильно снизить не получилось, «на малых оборотах» итоговая частота процессора начинала сильно «плавать», что снижало шансы на успех. Самым стабильным вариантом оказалось замедление в 3.17 раз. Не 128 раз, но хоть что-то.

Всё? Нет, не всё. Далеко не факт, что атака сработает с первого раза (особенно на Slim). А при неудачном запуске, приставка перезагружается и пробует запуститься снова. На запуск даётся всего 5 попыток, после чего приставка останавливается и начинает моргать «красным кольцом смерти». Поэтому патчим ещё и прошивку южного моста (SMC), чтобы не страдала фигнёй и перезагружала приставку до посинения:

Защита и взлом Xbox 360 (Часть 3) - 10

Итак, получаем алгоритм:

  1. патчим SMC
  2. замедляем проц (через PLL или I2C)
  3. ждём триггера POST
  4. ждём N микросекунд
  5. шлём импульс на RESET
  6. ускоряем проц обратно

Для большей точности подсчётов, частоту берём с того же HANA (48 МГц):

Защита и взлом Xbox 360 (Часть 3) - 11

И получаем вот такую конструкцию на базе недорогого CPLD Xilinx XC2C64A:

Защита и взлом Xbox 360 (Часть 3) - 12

Не забудем пошаманить с длиной и расположением проводка на RESET (обратите внимание на «катушку» снизу фото) и вперёд, надеяться, что запуск получится в течение минуты.

Но это только с аппаратной стороны. Как же нам пропатчить загрузчик и запихнуть свой код?

Патчим загрузчики

Как я уже упоминал, атакуется загрузчик второго уровня, «CB». Этот загрузчик шифруется фиксированным ключом, одинаковым для всех приставок, но как раз «CB» модифицировать нельзя, его мы только атакуем. А вот следующий за ним уже зашифрован ключом CPU, уникальным для каждой приставки. И чтобы его модифицировать, нужно знать этот ключ…
Или нет?

В старых «толстых» ревизиях Xbox 360 в загрузчике «CB» поддерживался так называемый «Zero-Pairing» режим, использующийся на этапе производства приставки. В заголовке каждого загрузчика по смещению 0x10 находится случайный набор данных «Pairing Data», используемый как часть ключа при расшифровывании. И если этот набор данных состоял целиком из нулей («Zero-Pairing»), то ключ процессора игнорировался и вместо него использовался фиксированный, нулевой ключ!

Защита и взлом Xbox 360 (Часть 3) - 13

С помощью этого трюка можно было собрать образ с оригинальным «CB», зашифровать нулевым ключом следующий загрузчик, «CD» (уже со своим кодом) и запустить его с помощью RGH!

Защита и взлом Xbox 360 (Часть 3) - 14

В приставках «Slim» и этот трюк завернули, убрав «Zero-Pairing» режим и поделив «CB» на две части. Здесь «CB» делился на очень простой и небольшой «CB_A» и шифрованный ключом процессора «CB_B»:

Защита и взлом Xbox 360 (Часть 3) - 15

Но шифрование алгоритмом RC4 (а именно этим алгоритмом зашифрован «CB_B»), имеет одну особенность. В процессе шифрования на основе ключа генерируется псевдослучайный поток данных, который бинарно «складывается» (операция 'исключающее или', 'xor') с исходными данными. При расшифровывании, соответственно, происходит то же самое, сложение с этим же псевдослучайным потоком возвращает данные в исходное значение:

Защита и взлом Xbox 360 (Часть 3) - 16

Но операция бинарного сложения коммутативна и ассоциативна, что означает, что мы можем модифицировать зашифрованные данные, не зная ключа, просто заxor'ив зашифрованный код с нужным нам патчем!

Защита и взлом Xbox 360 (Часть 3) - 17

В итоге, мы можем зашифровать «CB_A», пропатчить зашифрованный «CB_B» (чтобы он не выполнял расшифровку вообще) и положить в открытом виде «CD» со своим кодом!

Защита и взлом Xbox 360 (Часть 3) - 18

Короче, если собрать воедино, то запуск выглядит как-то так:
(XeLL — загрузчик хоумбрю, линукса, а ещё он ключи CPU показывает)

Microsoft наносит ответный удар

Конечно, Microsoft постарались всё залатать.

В новом системном обновлении все старые приставки перевели на «раздельную» загрузку с «CB_A» и «CB_B», тем самым окончательно закрыв «Zero-Paired» режим. На «Slim» загрузчики тоже подверглись обновлению. Новые загрузчики серьёзно доработали для защиты от RGH, наибольший упор при этом был сделан на защиту «CB_A»:

  • Полностью убрали отладочный вывод в POST
  • Проверку хеш-суммы переделали и продублировали для надёжности
  • По всему коду расставили sleep() на случайное время (зависящее от ключа CPU!!)
  • Добавили проверку фьюза CBLDV для возможности отзыва «CB_A»

Защита и взлом Xbox 360 (Часть 3) - 19

Список нововведений не оставляет ни одного шанса для RGH. Но обратим внимание на последний пункт списка — до этого в «CB_A» не было проверки фьюзов! Фатальный недостаток. Более того, как мы помним, в расшифровке «CB_A» ключ процессора не участвует. А это значит, что уязвимый к RGH загрузчик «CB_A» можно запустить на любой приставке, и запретить это нельзя.

А вот чтобы что-то запустить с помощью этого уязвимого «CB_A», нужно несколько извернуться. Если мы не знаем ключа CPU, всё, что нам остаётся — патчить существующий «CB_B». Но что, если вместо модификации единичных участков, мы заXOR’им весь загрузчик целиком? И за счёт этого «запишем» старый загрузчик, который мы уже умеем патчить, на место нового? Так и поступили:

  1. Шифруем уязвимый «CB_A» точно так же, как в исходном образе
  2. XOR’им наш «CB_B» с новым, получая «разницу»
  3. Накладываем её на шифрованный «CB_B»!

Защита и взлом Xbox 360 (Часть 3) - 20

Всё, мы снова, не зная ключа, успешно подменили шифрованное содержимое, ещё и уязвимый загрузчик засунули. Приставки взламываются, Microsoft удивляются.

Разработчики напряглись, и в очередном системном обновлении … чуть изменили метод шифрования «CB_B», теперь ключ шифрования стал зависеть ещё и от версии «CB_A»:

Защита и взлом Xbox 360 (Часть 3) - 21

Теперь при попытке заxor’ить и подсунуть данные уязвимому «CB_A» старой версии, загрузчик расшифровывал мусор из-за различий в ключах. А новый загрузчик взломать нельзя, он хорошо защищён от глич атак. Пока что победа за Microsoft!

Проблем подкинула Corona

Тем временем, на рынок вышла новая ревизия Xbox 360 — Corona, и принесла она моддерам проблем:

Защита и взлом Xbox 360 (Часть 3) - 22

Маловато чипов на плате, не находите? Всё верно, чип HANA «спрятали» в южный мост. Больше неоткуда брать частоту 48 MHz для мод-чипа, прежние команды замедления по I2C не срабатывают. Да что уж там, NAND-флеш на 16 MB, все эти годы служившую в качестве системного хранилища Xbox 360, вероломно заменили на 4 GB чип с интерфейсом eMMC! (правда, только в более дешёвой версии приставки, но всё же):

Защита и взлом Xbox 360 (Часть 3) - 23

Но ничего, со всем справились. Придумали как читать/писать флеш-память через картридер:

Защита и взлом Xbox 360 (Часть 3) - 24

Нашли новые I2C команды замедления, внешний 48 MHz кварцевый генератор заменил HANA:

Защита и взлом Xbox 360 (Часть 3) - 25

Доделали скрипты для сборки, добавили поддержку 4 GB NAND…

Защита и взлом Xbox 360 (Часть 3) - 26

Но Microsoft продолжали вставлять палки в колёса. Например, на новых платах пропали некоторые резисторы, без которых мод-чип переставал работать:

Защита и взлом Xbox 360 (Часть 3) - 27

Правда, исправлялось это установкой перемычек паяльником:

Защита и взлом Xbox 360 (Часть 3) - 28

Серьёзнее дела пошли, когда с платы пропали дорожки POST_OUT:

Защита и взлом Xbox 360 (Часть 3) - 29

Но и здесь Microsoft не повезло, нужные для RGH «шары» CPU находились на крайнем ряду:

Защита и взлом Xbox 360 (Часть 3) - 30

И, естественно, к ним смогли подключиться. Сначала самые рукастые, чуть подсверлив край процессора и подпаявшись проводком прямо к шарику:

Защита и взлом Xbox 360 (Часть 3) - 31

Защита и взлом Xbox 360 (Часть 3) - 32

А затем китайцы выпустили рамки с подпружиненной иглой, точно упирающейся в шарик, и проблема решилась для всех остальных:

Защита и взлом Xbox 360 (Часть 3) - 33

Последний рубеж

После того, как одолели «корону», осталась одна проблема — новые версии системы так и не поддавались взлому. Чтобы запустить RGH, нужно знать ключ CPU, а чтобы узнать ключ CPU, нужно хотя бы раз запустить RGH. Проблема курицы и яйца, в общем.

И тут возникла мысль — а давайте не только проверку подлинности «глюкнем», но и расшифровку пропустим! Если получится, то нам не нужно знать ключа, положим «CB_B» в открытом виде, да и всё. Именно эта идея легла в основу Double Glitch Hack (DGX):

Защита и взлом Xbox 360 (Часть 3) - 34

Этот чип «глючил» проц дважды, первым импульсом пропускался этап расшифровки загрузчика, а уже второй импульс пропускал проверку подлинности. Работало куда менее стабильно, благо требовался хотя бы один успешный запуск — дальше получаем ключ CPU и действуем по-старинке.

Актуален DGX был недолго, спустя 3 месяца китайцы вбросили релиз «DGX R.I.P» с образами, которые запускались на любых приставках, работали со стандартным RGH и, естественно, запускались куда стабильнее:

Защита и взлом Xbox 360 (Часть 3) - 35

Эти образы содержали специальную версию загрузчика «CB_A», используемую на производстве Xbox 360 и, по сути, являющуюся полным аналогом старого доброго «Zero-Pairing» режима. Вместо ключа процессора, этот «CB_A_mfg» расшифровывал «CB_B» фиксированным нулевым ключом:

Защита и взлом Xbox 360 (Часть 3) - 36

И вот здесь Microsoft всё. В этом «сервисном» варианте «CB_A» тоже не было проверки фьюз и забанить его было невозможно. Достаточно было записать образ согласно ревизии Xbox 360, припаять чип — и всё работало.

Защита и взлом Xbox 360 (Часть 3) - 37

Winchester!

Полностью пофиксили RGH только в новой ревизии приставки под кодовым именем Winchester. Впервые процессоры CPU и GPU совместили в одном кристалле, плату максимально упростили:

Защита и взлом Xbox 360 (Часть 3) - 38

Дорожки POST_OUT не просто убрали. Даже если подпаяться на площадки под процессором:

Защита и взлом Xbox 360 (Часть 3) - 39

Защита и взлом Xbox 360 (Часть 3) - 40

И даже, если запаять процессор на специальную версию платы для разработчиков, XDK, где эти дорожки всё ещё есть:

Защита и взлом Xbox 360 (Часть 3) - 41

На POST_OUT виден только один импульс при запуске приставки. Шина заблокирована:

Защита и взлом Xbox 360 (Часть 3) - 42

Более того, она блокируется только на этапе производства. Если взять «чистый» процессор с фабрики, где ещё не успели прожечь фьюзы — на нём POST_OUT работает!

Защита и взлом Xbox 360 (Часть 3) - 43

Но вот RGH на нём уже не срабатывает. Как бы вы ни пытались подать RESET импульс, процессор корректно выполняет сброс, или же игнорирует ваш сигнал из-за слишком малой длительности. По-видимому, в процессор добавили специальный логический модуль, фильтрующий линию RESET и тем самым окончательно исправили аппаратную ошибку.

Post Scriptum

Выходит, последнюю ревизию Xbox 360 взломать невозможно?

И да, и нет. На данный момент известен только один способ запустить модифицированную систему на ревизии Winchester.

В наборе ПО для разработчиков (XDK) есть различные приватные ключи для подписи скомпилированного кода. И так вышло, что среди них затесался ключ подписи «shadowboot», загрузчика третьего уровня для XDK систем. И с его помощью можно собрать легитимный подписанный образ с модифицированной прошивкой. Вот только работать на обычных, «магазинных» приставках он не будет. Нужен процессор с XDK версии приставки, либо «чистый» CPU с непрожжёными фьюзами (можно было встретить на Aliexpress):

Защита и взлом Xbox 360 (Часть 3) - 44

И только тогда у вас будет возможность лицезреть в «сведениях о системе» кастомной оболочки такую вот надпись:

Защита и взлом Xbox 360 (Часть 3) - 45

А на этом всё! Как обычно, готов ответить на ваши вопросы в комментариях :)

Защита и взлом Xbox 360, Часть 1
Защита и взлом Xbox 360, Часть 2
Защита и взлом Xbox 360, Часть 3

Автор: Алексей Шалпегин

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js