Спустя чуть более 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, то вы можете воспользоваться этим инструментом.
ссылка на оригинал статьи http://habrahabr.ru/post/165507/
Добавить комментарий