пятница, 29 января 2010 г.

Детали взлома PS3 в деталях

GeoHot, которому я и так до глубины души благодарен за раскрытие истинного потенциала iPod'а,  в своём блоге недавно написал, что поигрался подобным образом и с железом PS3. Причём, есть неплохая статья на уже полюбившемся мне Eurogamer, описывающая в общих чертах успехи geohot'а и возможную пользу от них людям. А есть другая, в которой люди попытались наиболее полно разжевать, как же таки он пробил защиту самой защищёной игровой приставки всех времён и народов и почему Sony не сможет пресечь на корню его достижения, убрав ещё какуй-нибудь красивый значок из прошивки и заменив его заплаткой. Итак.



Джордж Хотц, известный ранее как хакер iPhone, заявил, что взломал PlayStation 3, а затем предоставил подробности эксплойта. Об этом было написано множество статей, но ни в одной из них, по-видимому, не анализировался непосредственно код. Из-за многих зачастую противоречащих друг другу мнений на этот счёт, а также дабы помочь понять истинную суть эксплойта, и родилась эта статья.

PS3, как и Xbox360, в плане безопасности опирается на гипервизор. Но, в отличие от 360, PS3 позволяет пользователям при желании запускать Linux, который в свою очередь работает под управлением гипервизора.  Гипервизор не позволяет ядру Linux получить непосредственный доступ к различным физическим устройствам, таким как центральный процессор. Если бы удалось получить разрешение гипервизора, стал бы возможным прямой доступ к аппаратным ресурсам и атакующий мог бы сам контролировать и отслеживать свой низкоуровневый код.

Тем не менее, взлом гипервизора - не единственный шаг, необходимый для запуска пиратских игр. У каждой игры есть защитный ключ, хранимый в области диска, называемой ROM Mark. Микропрограмма привода считывает ключ и передаёт его гипервизору, который использует его для декодирования игры во время загрузки. Практически, гипервизор должен быть разобран для того, чтобы получить ключ игры. С другой стороны, можно было бы получить разрешение микропрограммы привода Blu-ray на доступ к ключу или вовсе пропустить шаг с расшифровкой ключа, подставляя готовый ключ для каждой игры. После этого ещё нужно отключить все программные механизмы защиты игры. А какие механизмы самозащиты могут скрываться под зашифровкой игры, неизвестно. Некоторые разработчики могут положиться исключительно на шифрование, в то время как другие могут встроить нечто подобное SecuROM.

Код гипервизора выполняется  и на главном ядре (PPE), и на остальных семи сопроцессорах Cell (SPE). Поток SPE, по-видимому, запускается в изолированном режиме, при котором доступ к его закрытому коду и памяти данных запрещён даже для гипервизора. Корневые аппаратные ключи, используемые для расшифровки загрузчика и гипервизора находятся только в железе, возможно с использованием eFUSE. Это может также означать, что у каждого процессора Cell есть уникальный ключ и вся дешифрация не опирается на один глобальный корневой ключ (в опровержение некоторых статей, которые утверждали, что есь только один ключ, корневой).

Метод Джорджа получает доступ к гипервизору после запуска Linux в режиме "Другая ОС". Он использовал эксплойт, чтобы добавить несколько функций произвольного доступа к памяти на чтение/запись, а также для получения дампов гипервизора. Доступ к lv1 - это первый необходимый шаг для выполнения других атак на прошивку или игры.

Его способ очень грамотен и известен как глитчинг памяти. Этот тип аппаратных атак подразумевает послание точно выверенных электрических импульсов, чтобы железо "проглючило" таким образом, как этого и ждёт хакер. Это давно используется хакерами смарт-карт для их разблокировки. Обычно хакер посылает импульс в бесконечном цикле и сбрасывает содержимое секретного носителя на доступную шину. Часто атакуется шина синхроимпульсов, однако иногда бывает полезно проглитчить линии данных. Выверять импульс по времени зачастую необязательно, так как в железе продумана обработка исключительных ситуаций и атака обычно может повторяться до тех пор, пока не завершится успешно.

Джордж подключил ПЛИС к каналу шины памяти его PS3. Он зашил в чип очень простую программу: посылать 40-нс импульс через выходной контакт по нажатии кнопки. Это обычно реализуется парочкой строк на Verilog. Когда длина импульса относительно мала (но всё ещё на уровне 100 тактов памяти PS3), глитч маловероятен. Однако Джордж написал программку для управления оперативной памятью, чтобы повысить вероятность его появления.

Его целью было получить доступ к хеш-таблице страниц (HTAB), чтобы впоследствии получить доступ на чтение/запись главного сегмента, который адресует всю память, включая гипервизор. Эксплойт - это модуль ядра Linux, который вызывает различные системные запросы гипервизора, связанные с управлением памятью. Он выделяет, освобождает память, а потом пытается использовать освобождённую память как HTAB для виртуального сегмента. При успешной рассинхронизации гипервизора с действительным состоянием оперативной памяти, глитч позволит атакующему переписать активную HTAB и таким образом самому управлять доступом к любой области памяти. На этом остановимся поподровнее.

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

Следующий шаг - освободить буфер, предварительно не открепляя все отображения на него. Это нормально, потому что гипервизор сам пройдёт по всем отображениям и разрушит их, прежде чем закончит процедуру. Непосредственно после вызова функции lv1_release_memory(), эксплойт выводит запрос пользователю о нажатии кнопки, запускающей глитч. Из-за того что на этот буфер создано огромное количество отображений HTAB, у пользователя есть приличный шанс запустить глитч, пока ещё гипервизор удаляет отображение. Глитч, вероятно, не даёт одному или более циклам записи гипервизора изменить память. Эти циклы записи назначались для удаления очередного отображения, но если они не пройдут, отображение останется невредимым.

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

Далее эксплойт создаёт виртуальный сегмент и проверяет, расположена ли связанная с ним HTAB в области памяти, покрывающей адрес осовобождённого буфера. Если нет, он продолжает создавать виртуальные сегменты до тех пор, пока наконец не попадётся нужная область памяти. Теперь у пользователя есть возможность записи прямо в эту HTAB, в противоположность исключительному контролю гипервизора над ней. Эксплойт задаёт некоторые значения HTAB, которые открывают полный доступ к главному сегменту, который в свою очередь имеет отображение на всю память. Как только гипервизор переключается на этот виртуальный сегмент, атакующему предоставляется возможность управлять всей памятью и, таким образом, самим гипервизором. Эксплойт добавляет два системных вызова, которые дают непосредственный доступ на чтени/запись к любому адресу в памяти, а затем возвращается в ядро.

Вполне возможно, что кто-нибудь встроит эту атаку в модчип, ведь глитч хоть сам по себе и довольно тонкий, но не требует точно выверенного по времени старта. С микроконтроллером и капелькой аналоговой схемотехники для импульса он может стать довольно-таки надёжным. Тем не менее, похоже на то, что в сброшенном в память гипервизоре после его реверс-инжиниринга всё-таки найдётся программный баг, и уже он будет выпущен в массы.



Sony проделала великую работу по безопасности PS3. Всё очень логично и связанно, без  очевидных слабых мест. Как бы то ни было, низкоуровневый доступ, данный ядру гостевой ОС, означает, что любой баг гипервизора очень может быть доступен из хакерского кода благодаря общему API гипервизора. Хотя одна простая заплатка могла бы послужить для чтения состояния каждого отображения непосредственно после его изменения. Если запись по какой-то причине не удалась, гипервизор бы отследил это и приостановил всю работу. Будет интересно увидеть, что Sony предпримет в своих будущих обновлениях для предотвращения такого рода атак.

Блог GeoHot'а о PS3: http://geohotps3.blogspot.com.
А вот та самая статья, которую нужно читать сразу после (если не вместо) этой: http://www.eurogamer.net/articles/digitalfoundry-ps3hacked-article

2 комментария:

  1. Сони отреагировала. С версии firmware 3.21 функция OtherOS более недоступна. :(

    ОтветитьУдалить
  2. Геохот уже что-то придумал. Можно будет даже на PS3 Slim вернуть OtherOS (правда, если прошивка на ней не обновлялась довольно давно). В любом случае, за играми - в магазин :)

    ОтветитьУдалить