Jailbreak для Windows RT

в 16:39, , рубрики: jailbreak, microsoft, surface, windows, Windows 8, Windows RT, метки: , , , ,

Jailbreak для Windows RT
Спустя чуть более 2 месяцев в сети появился долгожданный jailbreak для Windows RT. Была найдена уязвимость в ядре Windows, позволяющая запускать неподписанные Desktop-приложения. К сожалению, данный jailbreak является привязанным, т.к. после перезагрузки превращается в тыкву.
Забавно, что уязвимость была найдена на настольной Windows 8, а оттуда уже перекочевала на Windows RT. Подробнее об этом процессе написано здесь.

Установка

Сам процесс jailbreak'а нетривиален, необходим компьютер с Windows 8 и Visual Studio 2012. Но умелец с XDA позволил делать это прямо на устройстве.

  • Скачайте архив и распакуйте его на устройстве
  • Запустите runExploit.bat
  • Следуйте инструкциям на экране
  • Когда на экране появится «Please press VOLUME DOWN now.» нажмите кнопку уменьшения громкости

Напомню, что Windows RT является редакцией Windows 8 для ARM девайсов, таких как Microsoft Surface.

А как это всё собственно работает?

Текст ниже является вольным переводом пересказом Circumventing Windows RT’s Code Integrity Mechanism. Я опустил множество подробностей, ибо это пятничный пост :)


В ядре Windows минимальная необходимая цифровая подпись задается переменной. В Windows 8 её значение равно 0 (=Unsigned), т.е. Windows не требует цифровой подписи для выполнения приложения. Но на Windows RT её значение равно 8 (=Microsoft). Весь jailbreak сводится к банальному обнулению этой переменной. На вид все просто.
На деле это сделать очень сложно, т.к. Windows Store приложения могут использовать только подписанные бинарники, да и из такого приложения нельзя получить security context, необходимый для прикрепления к другим процессам.
Но здесь Microsoft пошла на встречу и выпустила удаленный отладчик для Windows RT, который прекрасно цепляется к Desktop приложениям. С его помощью можно прицепиться к
CSRSS процессу и изменять напрямую его память. Последняя, в свою очередь, вызывает уязвимую функцию ядра (NtUserSetInformationThread).
Один из таких вызовов (найден в winsrv.dll):

TerminalServerRequestThread+0x230
MOVS R3, #0xC
ADD R2, SP, #0x58
MOVS R1, #9
MOV R0, 0xFFFFFFFE
BL NtUserSetInformationThread

Используя брейкпоинт мы можем изменить структуру по адресу R2, непосредственно перед вызовом NtUserSetInformationThread.
Также необходим базовый адрес ядра. Его можно получить вызовом NtQuerySystemInformation. Эта функция возвращает список всех загруженных драйверов и их базовый адрес.
Теперь остается только сделать инъекцию в winsrv.dll (для этого использовать полупустую страницу со смещением 0×10800) и после срабатывания брейкпоинта изменить IP регистр на начало нашего кода.
На этом все :)

Заключение

Для тех, кто все же дочитал до конца, даю ссылку на пост с коллекцией собранных для ARM программ. Notepad++, 7-Zip и VNC-клиент уже есть.
Вы также можете собирать софт сами, читайте это. Если потребуются статические библиотеки, которых нет в Windows SDK, то вы можете воспользоваться этим инструментом.

Автор: Useless_guy

Источник

Поделиться

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