Пользователи айфонов прекрасно знают, зачем нужен джейлбрейк. Доступ к файловой системе в iOS позволяет устанавливать приложения из сторонних репозиториев и гибко менять настройки, которые обычно недоступны. До недавнего времени джейла для iOS 13 не существовало. Точнее, до тех пор, пока хакер axi0mX не обнаружил уязвимость checkm8 и не объяснил, как можно заюзать ее на благо прогрессивной общественности. А сегодня мы расскажем об этой находке тебе и покажем, как с ней обращаться.
Коррозия железа
Название уязвимости checkm8 произносится по-английски примерно как checkm-eight, что созвучно со словом checkmate — «шах и мат», символизирующим окончание шахматной партии. Отсюда и характерный логотип одноименного эксплоита в виде опрокинутой фигуры шахматного короля. «Игра окончена, ребята из Купертино, — как бы намекают нам авторы сплоита, — you lose».
Самое интересное во всей этой истории с checkm8 то, что уязвимость была обнаружена не на программном, а на аппаратном уровне яблочной техники, причем охватывает она очень большой диапазон моделей, начиная с самых древних устройств на чипе А5 вроде iPhone 4S и заканчивая вполне современным iPhone X.
Дыра прячется в механизме BootROM, который играет ключевую роль в процессе загрузки айфонов и айпадов. Причем пофиксить ее программными заплатками невозможно: для того чтобы решить проблему, нужно пересмотреть аппаратную конфигурацию самого девайса, чего, как ты понимаешь, за пару месяцев никак не сделать. На мой взгляд, checkm8 — это крупнейший факап Apple со времен трояна Flashback, заразившего и объединившего в ботнет почти 500 тысяч маков под управлением OS X по всему миру. Но тогда, в 2012 году, все успешно разрешилось обновлением Java-машины в macOS, уязвимость в которой и использовал трой. Сейчас у Apple уже не получится соскочить столь же легко и элегантно.
История с географией
О checkm8 известно уже давненько. Первые упоминания об уязвимости в BootROM яблочных мобильных устройств появились в Сети 27 сентября 2019 года, когда axi0mX публично сообщил в твиттере о своей находке. Горячую новость тут же подхватили многочисленные сайты и даже авторитетные СМИ, громко заявившие о появлении универсального джейлбрейка для целого зоопарка смартфонов от Apple. На самом деле полноценного джейла на тот момент еще не существовало: экспериментируя с DFU, axi0mX обнаружил аппаратную уязвимость, которую потенциально можно использовать для взлома файловой системы iOS.
Сперва с помощью checkm8 нельзя было сделать практически ничего, кроме замены стандартной загрузочной картинки iPhone в виде надкусанного яблока на что-то более оригинальное. Полноценный джейлбрейк с возможностью установки Cydia был представлен только 8 ноября на конференции POC2019 в Сеуле, да и тот пока еще находится в состоянии бета-тестирования.
В разработке джейла на основе checkm8 принимала участие целая команда исследователей, объединенная под общим названием checkra1n. В нее, помимо самого axi0mX и известного iOS-исследователя и талантливого хакера Луки Тодеско (qwertyoruiop), входит еще как минимум десяток человек, о чем красноречиво свидетельствует раздел Credits на сайте этой банды.
Вот эти крутые ребята сделали джейлбрейк на основе checkm8
На сегодняшний день бета-версия разработанного командой checkra1n джейлбрейка позволяет взломать устройства с установленной iOS 13, начиная с iPhone 6S и заканчивая Х — на более ранних девайсах утилита не тестировалась. Как происходит этот взлом и на каких принципах он основан? Давай разбираться.
Раз, два, три, четыре, пять, начинаем загружать…
Для пользователя загрузка айфона выглядит крайне просто: нажал на кнопочку — и спустя пару секунд на экране появляется привычный интерфейс iOS. С технической точки зрения все немного сложнее.
За начальный этап запуска яблочного устройства отвечает так называемый SecureROM, он же Boot ROM. Это — самый первый код, который запускается при холодной загрузке в Application Processor. Фактически он представляет собой урезанную и упрощенную версию загрузчика iBoot. Основная задача SecureROM — получить образ загрузчика из энергонезависимой памяти и передать ему управление. Этот код хранится непосредственно в чипе на аппаратном уровне, доступен только на чтение и потому не может быть изменен никаким образом извне. SecureROM — это самый доверенный код в Application Processor, который выполняется без каких-либо проверок. Он же отвечает за переход устройства в сервисный режим восстановления DFU (Device Firmware Update), активизируемый нажатием специальной комбинации кнопок при включении девайса. Для нас важно, что в режиме DFU доступна загрузка на устройство файлов через интерфейс USB.
Архитектурно SecureROM представляет собой первое звено цепочки безопасной загрузки, придуманной Apple для защиты от самого главного врага яблочных мобильных устройств — вредоносных программ и джейлбрейков. В SecureROM вшит криптографический ключ Apple, используемый для расшифровки образов, которые задействованы на последующих этапах загрузки, а также имеется необходимый инструментарий для работы с криптоалгоритмами. Получив управление от SecureROM, загрузчик iBoot расшифровывает и запускает ядро операционной системы, после чего загружается образ самой iOS с графическим интерфейсом пользователя. Однако все эти этапы запуска iPhone или iPad выполняются, только если инициализация SecureROM прошла успешно.
Так выглядят «этапы большого пути» — загрузки устройства с iOS
Именно поэтому все существовавшие до открытия checkm8 джейлбрейки старались всячески обойти этот механизм. Ведь их первоочередная задача — загрузить пропатченный образ iOS, допускающий установку программ из сторонних источников, чего не должно происходить с использованием SecureROM, стоящего на страже безопасной загрузки. Именно полный контроль над процессом запуска операционной системы гарантирует невозможность проникновения на устройство всевозможных буткитов, руткитов и прочей подобной малвари, отсутствием которой всегда и славилась мобильная платформа от Apple.
Протокол DFU
Как уже упоминалось, режим восстановления яблочного девайса DFU используется, если невозможна штатная загрузка айфона или айпада, и допускает обмен данными между компьютером и устройством через интерфейс USB. Для организации этого обмена в Купертино придумали специальный протокол DFU. С его помощью можно залить на окирпиченный айфон новую прошивку, восстановить телефон из резервной копии или обновить операционную систему.
Протокол DFU загружает с компьютера на яблочный девайс блоки данных с образом прошивки по запросу
Когда загрузка полностью завершается, запрашивается состояние устройства, после чего соединение по USB разрывается, устройство выходит из режима DFU, перезапускается и пытается загрузить полученный образ прошивки. Это если процесс протекает в штатном режиме. Однако исследователи заметили, что выйти из DFU можно и другими способами, например по запросу
(DFU abort). В этом случае выполняется форсированное завершение режима восстановления устройства.
При передаче данных протокол DFU использует режим, который носит наименование USB Control Transfer. Соединение инициализируется с использованием установочного пакета (Setup Stage) длиной 8 байт, структура которого показана на следующей картинке.
Структура установочного пакета USB Control Transfer
Назначение всех полей этого пакета нам сейчас не принципиально — кроме самого последнего. Если значение wLength ненулевое, сразу за установочным пакетом следует стадия данных (Data Stage), то есть данные пойдут с компьютера на устройство или обратно (направление определяется значением
В USB-стеке iBoot временный буфер выделяется в момент инициализации USB и пакеты, передаваемые в фазе данных, загружаются в него непосредственно «на входе». Важный момент состоит в том, что USB-стек включается сразу, как только устройство переходит в режим DFU. Выделенный буфер используется для временного хранения информации на стадии данных. После передачи управления указатель на этот буфер (и размер ожидаемых данных) копируется в глобальную переменную, которую USB-стек использует как место назначения для пакетов, поступающих на устройство в фазе данных. Как только устройство выходит из режима DFU, USB-стек снова выключается. Однако глобальная переменная при этом не обнуляется! Таким образом исследователи нащупали классическую уязвимость типа Use-after-Free (UaF).
Уязвимость
В этом и кроется баг, лежащий в основе checkm8. Если отправить на устройство запрос Setup Stage, инициировать передачу данных, но, не начав эту самую передачу, отправить девайсу запрос DFU abort (
Поскольку вся программа, обеспечивающая выделение буфера, работу с кучей и структурами задач, хранится в SecureROM и исполняется на аппаратном уровне, пофиксить эту ошибку попросту невозможно. Шах и мат!
Примечательно, что на девайсах с 32-разрядным ROM (A7, A10, A10X, A11 и A11X) указанный механизм не работает, поскольку буфер там аллоцируется всякий раз в одном и том же месте при каждой инициализации USB-стека. Тем не менее axi0mX нашел способ обойти такую предопределенность с использованием правильно подобранного сценария эксплуатации Use-after-Free.
Для этого он использовал то обстоятельство, что система одновременно может инициализировать несколько USB-передач. Например, в ответ на некоторые запросы устройство не сможет отправить данные, если получатель занят, до тех пор, пока конечная точка (endpoint) не освободится или не будет сброшен USB, то есть не будут устранены условия блокировки. Отправленные в таком состоянии запросы попадают в очередь. После устранения блокировки выполняется обход очереди и все запросы поочередно завершаются. Информация о конечной точке (endpoint) обнуляется, а запросы нулевой длины остаются в куче. Управляя запросами и тайм-аутами, теоретически можно создать такие условия формирования кучи, которые в итоге повлияют на следующее выделение памяти при создании буфера.
Обобщая, можно сказать, что из-за найденной в SecureROM ошибки в механизме создания и уничтожения USB-стека происходит утечка памяти, которая может использоваться для формирования состояния кучи, дающего возможность управлять выделением памяти при размещении буфера. В результате с помощью UaF можно выполнить запись в выделенную память для получения контролируемого косвенного перехода (controlled indirect branch) при выходе из DFU.
Checkmate
По принципу своего действия использующий эту уязвимость эксплоит checkm8 — типичный буткит. Основная его задача состоит в том, чтобы дать устройству нормально загрузиться, но при этом скомпрометировать каждое звено в цепочке загрузки после того, как отработает BootROM.
В нормальном режиме BootROM передает управление загрузчику (iBoot), который загружает в память ядро iOS и передает управление на точку входа. Цель создателей сплоита — пропатчить ядро до того, как этот процесс завершится.
Во время работы iBoot использует специальный режим (его называют boot trampoline), который ненадолго возвращает процессор в «особое» состояние: кеш сброшен, все регистры установлены в ноль, MMU отключен. Команда checkra1n разработала особый метод размещения в памяти устройства шелл-кода и научилась использовать хуки при вызове некоторых функций загрузчика, чтобы заставить его выполнить полезную нагрузку.
В итоге загрузчик подготавливает ядро и переводит процессор в состояние boot trampoline перед вызовом точки входа. Но вместо нее с помощью хука управление передается на заранее загруженный в память шелл-код. Теперь можно спокойно патчить ядро.
Однако просто пропатчить ядро недостаточно: когда оно загрузится, необходимо сохранить код в пользовательском режиме, чтобы можно было выполнить джейлбрейк. Для этого шелл-код создает в памяти маленький виртуальный диск, чтобы перехватить выполнение команд в режиме EL0. Это позволяет изменить дерево устройств и структуру аргументов загрузки ядра и потом использовать его в качестве корневого устройства. Для реализации этой идеи парням даже пришлось написать собственный динамический компоновщик.
Для монтирования корневой файловой системы поверх
При этом применяется каскадно-объединенное монтирование (union mounting), чтобы случайно не обрушить vnode. После всех этих манипуляций можно запускать произвольный код с идентификатором PID 1, прежде чем будет запущен launchd. Такой код инициализируется ядром iOS перед всеми последующими процессами и является для них родительским. Само собой, он обладает соответствующими системными привилегиями.
Нюанс в том, что на данном этапе смонтированная корневая файловая система доступна только для чтения, а для нормальной работы джейлбрейка нужно дропнуть в ФС несколько файлов, чтобы получить доступ к шеллу iOS и позволить пользователю установить менеджер пакетов. То есть необходимо получить доступ к
Чтобы добиться нужного результата, с использованием того же union mounting поверх
Чтобы добиться нужного результата, с использованием того же union mounting поверх
Дальше можно позволить launchd продолжить загрузку в штатном режиме. После включения usbmux и загрузки всех необходимых утилит, позволяющих пользователю установить правильный bootstrap в своей корневой файловой системе, можно запускать демон ssh и выполнять джейлбрейк. Дело сделано!
Как использовать checkm8
Итак, мы обсудили технические принципы, на которых базируется checkm8. Настало время взять в руки айфон с iOS 13 и посмотреть, как она работает на практике.
Поскольку checkra1n все еще находится в стадии беты, он годится далеко не для любых устройств Apple. Теоретически с использованием checkra1n можно взломать все айфоны, начиная с iPhone 5S и заканчивая iPhone X, а также планшетные компьютеры Apple. Но де-факто он точно не работает на iPad первого, пятого поколения, iPad Air 2, iPad Air 3, iPad Pro (11, 12.9-3G), и iPad mini 5. Кроме того, с помощью checkra1n не получится взломать устройства, оборудованные процессором A12, A12X и A13, то есть, iPhone XR, XS, XS Max, 11, 11 Pro, 11 Pro Max.
Поддержка iPhone 5S создателями джейла заявляется, но не гарантируется. Рассматриваемый метод прекрасно работает с iOS версий 13.0 —13.2.2, для более ранних редакций мобильной платформы Apple можно воспользоваться инструкцией из нашей предыдущей статьи.
Сheckra1n — это полуотвязанный джейлбрейк (semi-untethered jailbreak), который слетит после перезагрузки или отключения питания устройства. Если по какой-либо причине ты решишь выключить свой айфон, программу на телефоне, установка которой описана в этой статье, придется запустить заново.
Как и в случае с iOS 12, использовать checkra1n невозможно на не активированном и заблокированном устройстве. Если ты забыл пароль от учетной записи AppleID, самое время вспомнить или восстановить его.
Для успешного взлома яблочного девайса нам понадобится сам девайс, компьютер или макбук под управлением macOS (в настоящий момент джейл запускается только в этой системе, утилита для Windows и Linux находится в стадии разработки), и примерно полчаса свободного времени. Итак, приступим.
Подготовка
Чтобы обезопасить себя от неприятных неожиданностей, сделай на всякий случай резервную копию своего телефона. Для этого запусти на компьютере iTunes, подключи к нему iPhone при помощи шнура и подтверди на компьютере и телефоне доверительные отношения связки этих устройств.
Доверительные отношения нужно подтвердить сначала на компьютере…
Потом на самом iPhone
В окне iTunes щелкни мышью на значке телефона в верхней части левой панели, и в окне «Обзор» установи переключатель «Автоматическое создание копий» в положение «Этот компьютер», после чего нажми на кнопку «Создать копию сейчас».
Создаем резервную копию iPhone
Теперь необходимо отключить на телефоне блокировку системы паролем, Touch ID и Face ID. Для этого переходим в «Настройки», открываем раздел «Touch ID и код-пароль», вводим код-пароль (если он есть), после чего выключаем эти методы авторизации. Код-пароль, кстати, тоже лучше на всякий случай отключить.
Отключаем Touch ID и код-пароль
Все, больше никаких дополнительных действий не потребуется. Можно приступать к джейлбрейку.
Джейлбрейк
На компьютере с macOS открой в браузере ссылку https://checkra.in/releases/ и скачай актуальную версию утилиты — на момент написания статьи это была версия 0.9.5 beta. Подключи телефон к устройству с помощью USB-штура и запусти скачанное приложение. Смонтируй dmg-образ в системе, после чего в открывшемся окне перетащи мышью значок checkra1n в папку Applications.
Устанавливаем утилиту джейлбрейка
Если твоя macOS настроена по умолчанию, то есть, немного страдает паранойей, система не позволит запустить приложение, загруженное из интернета. Чтобы воспользоваться checkra1n, открой папку Приложения (Applications), и щелкни мышью на значке программы, удерживая клавишу [Ctrl], после чего в появившемся диалоговом окне нажми на кнопку Открыть.
Программа успешно запустилась
Жмем Start. Приложение сообщит нам о том, что мы должны перевести телефон в режим DFU, но перед этим необходимо переключить его в защищенный режим. Программа сделает это автоматически. Нажимаем на кнопку Next и дожидаемся, пока на экране аппарата не возникнет вот такая веселая картинка.
Телефон перешел в защищенный режим
Теперь нам предстоит самое интересное — для выполнения следующего упражнения, целью которого является включение на телефоне режима DFU, придется применить всю имеющуюся в твоем арсенале ловкость и скорость реакции.
Переводим телефон в режим DFU
Отыщи на своем телефоне кнопку включения питания (на моем iPhone 7 она находится на правой боковинке корпуса) и кнопку уменьшения громкости (она располагается на левой боковинке). Не отключая телефон от компьютера, щелкни мышью на кнопке Start в окне checkra1n, после чего быстро нажми и удерживай обе кнопки.
Примерно через 4 секунды, когда в окне программы появится соответствующая команда, отпусти кнопку питания, но продолжай удерживать кнопку уменьшения громкости еще в течение примерно 10 секунд. Ой, получилось — именно такое изображение мы видели на выложенных в сети видеороликах, демонстрирующих эксплуатацию уязвимости checkm8!
Магия в действии
Телефон автоматически перезагрузится, после чего в окошке checkra1n появится сообщение о том, что джейлбрейк прошел успешно. Нажми Done.
Джейл удался
Теперь можно отсоединить телефон от компьютера. Результатом всех наших манипуляций стало появление значка приложения checkra1n на самом телефоне.
Программа checkra1n теперь живет в твоем айфоне
Запусти эту программу. В своей нынешней версии она предлагает не так уж много возможностей, вернее, всего одну: скачать установщик пакетов Cydia. Нажми на значок Cydia, затем — на надпись Install Cydia в нижней части окна и дождись, пока приложение загрузится и установится на телефон. После этого можно выйти из checkra1n и запустить Cydia с помощью значка на экране iOS.
А вот и результат всех наших трудов!
Выводы
Как видишь, джейлбрейк iOS 13 с checkm8 и checkra1n прост, как дважды два, однако стоит помнить, что в текущем виде это по-прежнему бета. С нетерпением ждем момента, когда разработчики выпустят новую версию, совместимую с другими платформами, как минимум — с Windows, а также добавят в лоадер побольше полезных функций.
Теоретически у этого эксплоита широкие перспективы: например, можно попытаться организовать на мобильном устройстве Apple что-то вроде dual boot или, чем черт не шутит, водрузить на него какую-нибудь кастомную сборку операционной системы.
Источник: https://xakep.ru/2019/11/21/checkra1n/
Коррозия железа
Название уязвимости checkm8 произносится по-английски примерно как checkm-eight, что созвучно со словом checkmate — «шах и мат», символизирующим окончание шахматной партии. Отсюда и характерный логотип одноименного эксплоита в виде опрокинутой фигуры шахматного короля. «Игра окончена, ребята из Купертино, — как бы намекают нам авторы сплоита, — you lose».
Самое интересное во всей этой истории с checkm8 то, что уязвимость была обнаружена не на программном, а на аппаратном уровне яблочной техники, причем охватывает она очень большой диапазон моделей, начиная с самых древних устройств на чипе А5 вроде iPhone 4S и заканчивая вполне современным iPhone X.
Дыра прячется в механизме BootROM, который играет ключевую роль в процессе загрузки айфонов и айпадов. Причем пофиксить ее программными заплатками невозможно: для того чтобы решить проблему, нужно пересмотреть аппаратную конфигурацию самого девайса, чего, как ты понимаешь, за пару месяцев никак не сделать. На мой взгляд, checkm8 — это крупнейший факап Apple со времен трояна Flashback, заразившего и объединившего в ботнет почти 500 тысяч маков под управлением OS X по всему миру. Но тогда, в 2012 году, все успешно разрешилось обновлением Java-машины в macOS, уязвимость в которой и использовал трой. Сейчас у Apple уже не получится соскочить столь же легко и элегантно.
История с географией
О checkm8 известно уже давненько. Первые упоминания об уязвимости в BootROM яблочных мобильных устройств появились в Сети 27 сентября 2019 года, когда axi0mX публично сообщил в твиттере о своей находке. Горячую новость тут же подхватили многочисленные сайты и даже авторитетные СМИ, громко заявившие о появлении универсального джейлбрейка для целого зоопарка смартфонов от Apple. На самом деле полноценного джейла на тот момент еще не существовало: экспериментируя с DFU, axi0mX обнаружил аппаратную уязвимость, которую потенциально можно использовать для взлома файловой системы iOS.
Сперва с помощью checkm8 нельзя было сделать практически ничего, кроме замены стандартной загрузочной картинки iPhone в виде надкусанного яблока на что-то более оригинальное. Полноценный джейлбрейк с возможностью установки Cydia был представлен только 8 ноября на конференции POC2019 в Сеуле, да и тот пока еще находится в состоянии бета-тестирования.
В разработке джейла на основе checkm8 принимала участие целая команда исследователей, объединенная под общим названием checkra1n. В нее, помимо самого axi0mX и известного iOS-исследователя и талантливого хакера Луки Тодеско (qwertyoruiop), входит еще как минимум десяток человек, о чем красноречиво свидетельствует раздел Credits на сайте этой банды.
Вот эти крутые ребята сделали джейлбрейк на основе checkm8
На сегодняшний день бета-версия разработанного командой checkra1n джейлбрейка позволяет взломать устройства с установленной iOS 13, начиная с iPhone 6S и заканчивая Х — на более ранних девайсах утилита не тестировалась. Как происходит этот взлом и на каких принципах он основан? Давай разбираться.
Раз, два, три, четыре, пять, начинаем загружать…
Для пользователя загрузка айфона выглядит крайне просто: нажал на кнопочку — и спустя пару секунд на экране появляется привычный интерфейс iOS. С технической точки зрения все немного сложнее.
За начальный этап запуска яблочного устройства отвечает так называемый SecureROM, он же Boot ROM. Это — самый первый код, который запускается при холодной загрузке в Application Processor. Фактически он представляет собой урезанную и упрощенную версию загрузчика iBoot. Основная задача SecureROM — получить образ загрузчика из энергонезависимой памяти и передать ему управление. Этот код хранится непосредственно в чипе на аппаратном уровне, доступен только на чтение и потому не может быть изменен никаким образом извне. SecureROM — это самый доверенный код в Application Processor, который выполняется без каких-либо проверок. Он же отвечает за переход устройства в сервисный режим восстановления DFU (Device Firmware Update), активизируемый нажатием специальной комбинации кнопок при включении девайса. Для нас важно, что в режиме DFU доступна загрузка на устройство файлов через интерфейс USB.
Архитектурно SecureROM представляет собой первое звено цепочки безопасной загрузки, придуманной Apple для защиты от самого главного врага яблочных мобильных устройств — вредоносных программ и джейлбрейков. В SecureROM вшит криптографический ключ Apple, используемый для расшифровки образов, которые задействованы на последующих этапах загрузки, а также имеется необходимый инструментарий для работы с криптоалгоритмами. Получив управление от SecureROM, загрузчик iBoot расшифровывает и запускает ядро операционной системы, после чего загружается образ самой iOS с графическим интерфейсом пользователя. Однако все эти этапы запуска iPhone или iPad выполняются, только если инициализация SecureROM прошла успешно.
Так выглядят «этапы большого пути» — загрузки устройства с iOS
Именно поэтому все существовавшие до открытия checkm8 джейлбрейки старались всячески обойти этот механизм. Ведь их первоочередная задача — загрузить пропатченный образ iOS, допускающий установку программ из сторонних источников, чего не должно происходить с использованием SecureROM, стоящего на страже безопасной загрузки. Именно полный контроль над процессом запуска операционной системы гарантирует невозможность проникновения на устройство всевозможных буткитов, руткитов и прочей подобной малвари, отсутствием которой всегда и славилась мобильная платформа от Apple.
Протокол DFU
Как уже упоминалось, режим восстановления яблочного девайса DFU используется, если невозможна штатная загрузка айфона или айпада, и допускает обмен данными между компьютером и устройством через интерфейс USB. Для организации этого обмена в Купертино придумали специальный протокол DFU. С его помощью можно залить на окирпиченный айфон новую прошивку, восстановить телефон из резервной копии или обновить операционную систему.
Протокол DFU загружает с компьютера на яблочный девайс блоки данных с образом прошивки по запросу
0x21, 1.Когда загрузка полностью завершается, запрашивается состояние устройства, после чего соединение по USB разрывается, устройство выходит из режима DFU, перезапускается и пытается загрузить полученный образ прошивки. Это если процесс протекает в штатном режиме. Однако исследователи заметили, что выйти из DFU можно и другими способами, например по запросу
0x21, 4(DFU abort). В этом случае выполняется форсированное завершение режима восстановления устройства.
При передаче данных протокол DFU использует режим, который носит наименование USB Control Transfer. Соединение инициализируется с использованием установочного пакета (Setup Stage) длиной 8 байт, структура которого показана на следующей картинке.
Структура установочного пакета USB Control Transfer
Назначение всех полей этого пакета нам сейчас не принципиально — кроме самого последнего. Если значение wLength ненулевое, сразу за установочным пакетом следует стадия данных (Data Stage), то есть данные пойдут с компьютера на устройство или обратно (направление определяется значением
bmRequest Type). Эти данные передаются последовательно фрагментами размером от 8 до 64 байт в зависимости от скорости USB-соединения. Сессия передачи данных завершается стадией проверки статуса транзакции (Status Stage), на которой стороны обмениваются пакетами нулевой длины.В USB-стеке iBoot временный буфер выделяется в момент инициализации USB и пакеты, передаваемые в фазе данных, загружаются в него непосредственно «на входе». Важный момент состоит в том, что USB-стек включается сразу, как только устройство переходит в режим DFU. Выделенный буфер используется для временного хранения информации на стадии данных. После передачи управления указатель на этот буфер (и размер ожидаемых данных) копируется в глобальную переменную, которую USB-стек использует как место назначения для пакетов, поступающих на устройство в фазе данных. Как только устройство выходит из режима DFU, USB-стек снова выключается. Однако глобальная переменная при этом не обнуляется! Таким образом исследователи нащупали классическую уязвимость типа Use-after-Free (UaF).
Уязвимость типа Use-after-Free обусловлена методами взаимодействия с динамической памятью, или кучей (heap). Подробнее об этом типе уязвимостей можно прочитать, например, здесь.
Уязвимость
В этом и кроется баг, лежащий в основе checkm8. Если отправить на устройство запрос Setup Stage, инициировать передачу данных, но, не начав эту самую передачу, отправить девайсу запрос DFU abort (
0x21, 4) на форсированный выход из DFU, то устройство попытается снова запуститься в режиме DFU и завершить прерванную сессию. При этом состояние памяти останется инициализированным и мы получаем возможность передать на устройство, загрузить в память и выполнить произвольный код по адресу буфера, выделенного до момента предыдущего выхода устройства из DFU.Поскольку вся программа, обеспечивающая выделение буфера, работу с кучей и структурами задач, хранится в SecureROM и исполняется на аппаратном уровне, пофиксить эту ошибку попросту невозможно. Шах и мат!
Примечательно, что на девайсах с 32-разрядным ROM (A7, A10, A10X, A11 и A11X) указанный механизм не работает, поскольку буфер там аллоцируется всякий раз в одном и том же месте при каждой инициализации USB-стека. Тем не менее axi0mX нашел способ обойти такую предопределенность с использованием правильно подобранного сценария эксплуатации Use-after-Free.
Для этого он использовал то обстоятельство, что система одновременно может инициализировать несколько USB-передач. Например, в ответ на некоторые запросы устройство не сможет отправить данные, если получатель занят, до тех пор, пока конечная точка (endpoint) не освободится или не будет сброшен USB, то есть не будут устранены условия блокировки. Отправленные в таком состоянии запросы попадают в очередь. После устранения блокировки выполняется обход очереди и все запросы поочередно завершаются. Информация о конечной точке (endpoint) обнуляется, а запросы нулевой длины остаются в куче. Управляя запросами и тайм-аутами, теоретически можно создать такие условия формирования кучи, которые в итоге повлияют на следующее выделение памяти при создании буфера.
Обобщая, можно сказать, что из-за найденной в SecureROM ошибки в механизме создания и уничтожения USB-стека происходит утечка памяти, которая может использоваться для формирования состояния кучи, дающего возможность управлять выделением памяти при размещении буфера. В результате с помощью UaF можно выполнить запись в выделенную память для получения контролируемого косвенного перехода (controlled indirect branch) при выходе из DFU.
Checkmate
По принципу своего действия использующий эту уязвимость эксплоит checkm8 — типичный буткит. Основная его задача состоит в том, чтобы дать устройству нормально загрузиться, но при этом скомпрометировать каждое звено в цепочке загрузки после того, как отработает BootROM.
В нормальном режиме BootROM передает управление загрузчику (iBoot), который загружает в память ядро iOS и передает управление на точку входа. Цель создателей сплоита — пропатчить ядро до того, как этот процесс завершится.
Во время работы iBoot использует специальный режим (его называют boot trampoline), который ненадолго возвращает процессор в «особое» состояние: кеш сброшен, все регистры установлены в ноль, MMU отключен. Команда checkra1n разработала особый метод размещения в памяти устройства шелл-кода и научилась использовать хуки при вызове некоторых функций загрузчика, чтобы заставить его выполнить полезную нагрузку.
В итоге загрузчик подготавливает ядро и переводит процессор в состояние boot trampoline перед вызовом точки входа. Но вместо нее с помощью хука управление передается на заранее загруженный в память шелл-код. Теперь можно спокойно патчить ядро.
Однако просто пропатчить ядро недостаточно: когда оно загрузится, необходимо сохранить код в пользовательском режиме, чтобы можно было выполнить джейлбрейк. Для этого шелл-код создает в памяти маленький виртуальный диск, чтобы перехватить выполнение команд в режиме EL0. Это позволяет изменить дерево устройств и структуру аргументов загрузки ядра и потом использовать его в качестве корневого устройства. Для реализации этой идеи парням даже пришлось написать собственный динамический компоновщик.
Для монтирования корневой файловой системы поверх
/ используется syscall(3)При этом применяется каскадно-объединенное монтирование (union mounting), чтобы случайно не обрушить vnode. После всех этих манипуляций можно запускать произвольный код с идентификатором PID 1, прежде чем будет запущен launchd. Такой код инициализируется ядром iOS перед всеми последующими процессами и является для них родительским. Само собой, он обладает соответствующими системными привилегиями.
Нюанс в том, что на данном этапе смонтированная корневая файловая система доступна только для чтения, а для нормальной работы джейлбрейка нужно дропнуть в ФС несколько файлов, чтобы получить доступ к шеллу iOS и позволить пользователю установить менеджер пакетов. То есть необходимо получить доступ к
/private/var, для чего сначала инициализировать механизм Data Рrotection, за который отвечает launchd.Чтобы добиться нужного результата, с использованием того же union mounting поверх
/usr/libexec/ для чего сначала инициализировать механизм Data Рrotection, за который отвечает launchd.Чтобы добиться нужного результата, с использованием того же union mounting поверх
/usr/libexec/ монтируется еще один .dmg с целью переопределить какой-нибудь из системных демонов. В качестве жертвы был выбран sysstatuscheck, поскольку этот демон запускается в различных версиях iOS в нужный момент — в начале загрузочного процесса, но достаточно поздно, чтобы включить Data Рrotection. Когда задача выполнена, .dmg-образ принудительно размонтируется.Дальше можно позволить launchd продолжить загрузку в штатном режиме. После включения usbmux и загрузки всех необходимых утилит, позволяющих пользователю установить правильный bootstrap в своей корневой файловой системе, можно запускать демон ssh и выполнять джейлбрейк. Дело сделано!
Как использовать checkm8
Итак, мы обсудили технические принципы, на которых базируется checkm8. Настало время взять в руки айфон с iOS 13 и посмотреть, как она работает на практике.
Поскольку checkra1n все еще находится в стадии беты, он годится далеко не для любых устройств Apple. Теоретически с использованием checkra1n можно взломать все айфоны, начиная с iPhone 5S и заканчивая iPhone X, а также планшетные компьютеры Apple. Но де-факто он точно не работает на iPad первого, пятого поколения, iPad Air 2, iPad Air 3, iPad Pro (11, 12.9-3G), и iPad mini 5. Кроме того, с помощью checkra1n не получится взломать устройства, оборудованные процессором A12, A12X и A13, то есть, iPhone XR, XS, XS Max, 11, 11 Pro, 11 Pro Max.
Поддержка iPhone 5S создателями джейла заявляется, но не гарантируется. Рассматриваемый метод прекрасно работает с iOS версий 13.0 —13.2.2, для более ранних редакций мобильной платформы Apple можно воспользоваться инструкцией из нашей предыдущей статьи.
Сheckra1n — это полуотвязанный джейлбрейк (semi-untethered jailbreak), который слетит после перезагрузки или отключения питания устройства. Если по какой-либо причине ты решишь выключить свой айфон, программу на телефоне, установка которой описана в этой статье, придется запустить заново.
Как и в случае с iOS 12, использовать checkra1n невозможно на не активированном и заблокированном устройстве. Если ты забыл пароль от учетной записи AppleID, самое время вспомнить или восстановить его.
Для успешного взлома яблочного девайса нам понадобится сам девайс, компьютер или макбук под управлением macOS (в настоящий момент джейл запускается только в этой системе, утилита для Windows и Linux находится в стадии разработки), и примерно полчаса свободного времени. Итак, приступим.
Подготовка
Чтобы обезопасить себя от неприятных неожиданностей, сделай на всякий случай резервную копию своего телефона. Для этого запусти на компьютере iTunes, подключи к нему iPhone при помощи шнура и подтверди на компьютере и телефоне доверительные отношения связки этих устройств.
Доверительные отношения нужно подтвердить сначала на компьютере…
Потом на самом iPhone
В окне iTunes щелкни мышью на значке телефона в верхней части левой панели, и в окне «Обзор» установи переключатель «Автоматическое создание копий» в положение «Этот компьютер», после чего нажми на кнопку «Создать копию сейчас».
Создаем резервную копию iPhone
Теперь необходимо отключить на телефоне блокировку системы паролем, Touch ID и Face ID. Для этого переходим в «Настройки», открываем раздел «Touch ID и код-пароль», вводим код-пароль (если он есть), после чего выключаем эти методы авторизации. Код-пароль, кстати, тоже лучше на всякий случай отключить.
Отключаем Touch ID и код-пароль
Все, больше никаких дополнительных действий не потребуется. Можно приступать к джейлбрейку.
Джейлбрейк
На компьютере с macOS открой в браузере ссылку https://checkra.in/releases/ и скачай актуальную версию утилиты — на момент написания статьи это была версия 0.9.5 beta. Подключи телефон к устройству с помощью USB-штура и запусти скачанное приложение. Смонтируй dmg-образ в системе, после чего в открывшемся окне перетащи мышью значок checkra1n в папку Applications.
Устанавливаем утилиту джейлбрейка
Если твоя macOS настроена по умолчанию, то есть, немного страдает паранойей, система не позволит запустить приложение, загруженное из интернета. Чтобы воспользоваться checkra1n, открой папку Приложения (Applications), и щелкни мышью на значке программы, удерживая клавишу [Ctrl], после чего в появившемся диалоговом окне нажми на кнопку Открыть.
Программа успешно запустилась
Жмем Start. Приложение сообщит нам о том, что мы должны перевести телефон в режим DFU, но перед этим необходимо переключить его в защищенный режим. Программа сделает это автоматически. Нажимаем на кнопку Next и дожидаемся, пока на экране аппарата не возникнет вот такая веселая картинка.
Телефон перешел в защищенный режим
Теперь нам предстоит самое интересное — для выполнения следующего упражнения, целью которого является включение на телефоне режима DFU, придется применить всю имеющуюся в твоем арсенале ловкость и скорость реакции.
Переводим телефон в режим DFU
Отыщи на своем телефоне кнопку включения питания (на моем iPhone 7 она находится на правой боковинке корпуса) и кнопку уменьшения громкости (она располагается на левой боковинке). Не отключая телефон от компьютера, щелкни мышью на кнопке Start в окне checkra1n, после чего быстро нажми и удерживай обе кнопки.
Примерно через 4 секунды, когда в окне программы появится соответствующая команда, отпусти кнопку питания, но продолжай удерживать кнопку уменьшения громкости еще в течение примерно 10 секунд. Ой, получилось — именно такое изображение мы видели на выложенных в сети видеороликах, демонстрирующих эксплуатацию уязвимости checkm8!
Магия в действии
Телефон автоматически перезагрузится, после чего в окошке checkra1n появится сообщение о том, что джейлбрейк прошел успешно. Нажми Done.
Джейл удался
Теперь можно отсоединить телефон от компьютера. Результатом всех наших манипуляций стало появление значка приложения checkra1n на самом телефоне.
Программа checkra1n теперь живет в твоем айфоне
Запусти эту программу. В своей нынешней версии она предлагает не так уж много возможностей, вернее, всего одну: скачать установщик пакетов Cydia. Нажми на значок Cydia, затем — на надпись Install Cydia в нижней части окна и дождись, пока приложение загрузится и установится на телефон. После этого можно выйти из checkra1n и запустить Cydia с помощью значка на экране iOS.
А вот и результат всех наших трудов!
Выводы
Как видишь, джейлбрейк iOS 13 с checkm8 и checkra1n прост, как дважды два, однако стоит помнить, что в текущем виде это по-прежнему бета. С нетерпением ждем момента, когда разработчики выпустят новую версию, совместимую с другими платформами, как минимум — с Windows, а также добавят в лоадер побольше полезных функций.
Теоретически у этого эксплоита широкие перспективы: например, можно попытаться организовать на мобильном устройстве Apple что-то вроде dual boot или, чем черт не шутит, водрузить на него какую-нибудь кастомную сборку операционной системы.
Источник: https://xakep.ru/2019/11/21/checkra1n/
Последнее редактирование модератором: