 наш спикер Quartey он часть проекта Checkmate они изучают jailbreak для айфонах айфоны они достаточно закрыты, обычно и их достаточно сложно рутировать много технических людей пробуют доступить их и все время есть такая игра как с катами и мышками между людьми, которые находят jailbreak и apple, которые подчинят эти jailbreak этот jailbreak специфический потому что его нельзя подчинить так что я буду приглашать вас сегодня к Quartey и как они решили эту проблему пожалуйста, приветствуйте Quartey так что сегодня я буду вам говорить насчет одного специфического трюка который Secure Rome не любит мы уже дали этот ок на другом конференции и вы можете загрузить всю информацию на checkrate.in меня зовут Луку Додеску, ака Quartey вы можете мне найти на IRC в чат канале на IRCcracksby.com и на твиттере at Quartey URPZ я независимый Security Researcher я смотрю на iOS и я справил много времени в iOS и я там был достаточно много здесь уже десятилетия работаю в этой сцене сегодня я здесь даю доклад с работой, которые другие люди сделали со мной этот доклад не было бы возможно дать без работы от Axiom X и Little Aloo которые помогали нам независимо и Seguza нам помогала с стратегией эксплуатации дополнительное я хотел бы дать спасибо, сказать спасибо для Checkrate.in команды которые построили инфраструктуру которая нам дала возможность вам давать jailbreak которая просто использовать и работает в команде Checkrate.in у нас очень много разных Researchers iOS больше чем эти, но эти главные contribуторы все знания, которые мы нашли с этой группой достаточно интересные это наверное самая интересная команда которая когда-нибудь работала в моей жизни так что я думаю тоже важно им дать знать и им сказать спасибо спасибо так что мы начнем говорить что такое Secure Home Secure Home это самый первый код, который начинает экзектировать когда ты включаешь свой телефон это минимизированная версия iBoot Loader этот код очень важный потому что он ставен в Mask ROM, когда его строят это наверное самая trusted код, который может работать на твоем телефоне главная цель Secure Home это взять картинку из Flash для всего iBoot Loader и взять это и вставить в память так что это очень просто но он проверяет много подписей и тоже дает нам возможность Recovery сделать который называется DFure эта функция нам дает возможность переношать телефон если он не работает или полностью можно войти в эту моду когда ты включаешь телефон используя специальную комбинацию на телефоне я тоже буду говорить много насчет Secure Boot во время этого доклада iOS был пионер в Secure Boot и наверное эта проблема была самая длинная данная проблема которая в Secure Boot находится каждый раз когда вы открываете картинку в Secure Boot будет валидировать эту картинку кроме на первом iPhone это единственный iPhone который не делает этот анализ так что это первый враг для jailbreak и все jailbreakers хотят перейти через это DFU-протокол это достаточно простой протокол который был имплементирован через USB цель это его протокол чтобы получать данные от host и он сделан так чтобы было очень просто использовать и очень простая инфраструктура можно его использовать посылай информацию к аппарату к устройству вам пространят информацию обратно например вы можете сказать устройству бутировать картинку которая вы хотите есть несколько спути выйти из DFU например DFU-порт и что это сделает это реанисализирует с нуля так что этот протокол он имплементирован через USB и я сейчас пройду через что такое control transfer в принципе это используется чтобы посылать с командой от host до аппарата до устройства так что можно послать данные с твой request или попросить устройство чтобы он тебе послал обратно данные так что нужно чтобы хорошо USB-инверация прошла и несколько специфических пакетов и каждый каждый контроль процесс начинается с setup packet начинается с b request это индекс который нам говорит какой типа request который нам проще сделать и дополнительные информации которые мы будем смотреть самое интересное здесь это W-dank это самое интересное потому что W-dank имеет фазу которая называется data phase где host будет посылать аппарату кусками информацией и как я говорил до этого это механизм который дает вашему host посылать файлы к аппарату defu но если вы будете специфировать в сторону куда данные будут идти и можно играть тоже с максимальной дистанции максимальное количество информации которые ты будешь посылать через этот трансфер в фазе трансфера данных размер пакетов который посылать будет между 8 и 64 пайтов зависимо от скоростью USB подключения как только трансфер закончится будет новая фаза как называется status phase и новый пакет будет послом чтобы сказать что трансфер закончен в стаке USB i-boot временный buffer будет создан во время локации USB и данные будут memcopy каждый раз когда информация получается на ваш препарат правильное место USB и DFU работают вместе потому что как только вы вставляете ваше устройство в DFU USB включается и как только вы включаете будет временное место buffer который будет включен как только трансфер создается pointer к этому buffer будет скопирован варибл который использует USB когда вы выходите с DFU этот buffer выпускается и мы как раз приходим к интересной части который это наш баг когда мы чистим этот buffer глобальный варибл который мы используем для этого барфера не чистится что происходит это то что можно иметь в вундробиллоте use after free так что я вам сейчас объясню этапы которые нужно чтобы найти этот баг мы начинаем с USB control request который начинает data phase в следующей этапе мы останавливаем перевод донных и потом мы посылаем открывается DFU abort command который отключает USB stack и выходит из DFU потом устройство пробует пойти обратно в DFU и там будет проблема которая создает условия чтобы DFU опять открылся и нашлась что произойдет это то что DFU открывается начинается но если мы посылаем данные в это время которые мы посылаем с mem cpd мы будем использовать тот же самый pointer из предыдущего пакета которые мы использовали в ранней DFU фазе и как только это происходит данные будут перезаписаны сверху одного pointer что практически это создать нам нужно иметь много контроля на usb что они сделали это использовать arduino с usb shield чтобы иметь полный контроль axi maxis их манера было использовать usb на macOS чтобы остановить перевод в середине пути второй вариант он не дитерионистик и с этим вы можете знать если атака случилась правильно произошла или нет даже если каждый раз не получается это атака, мы все равно можем иметь атаку которая работает что мы проверяем каждый раз это картинка одного из первого теста где вы можете видеть как мы это сделали так что все равно там есть лимитация если вы будете пробовать эти этапы телес на вашей стороне ничего не случится кроме если вы будете специфические аппараты использовать которые имеют a8 или a9 и в этих аппаратах есть баг в dfu аборте у usb-стака есть свой собственный процесс чтобы смотреть на переводы в данных и что сегурза заметила это то что usb-стак не останавливает доступ к этому к этому месту так что будет лик даже если вы останавливается dfu с этим с этим лик мы можем переписать то что находится в нашей памяти и что мы можем делать мы можем ставить информацию которую мы хотим в registers и мы можем поменять информацию там так что use after free что это делает это использует процесс который уже включен, который уже работает и он переписывает когда вы уходите с этого процесса оригинальные registry они будут переписывать сверху вашей коррупции но зато tasks у них есть свой собственный лист где они выбирают следующую задачу так что вы можете создать настоящую структуру и вы сможете поставить эту ненастоящую структуру задач что так бы сделать, чтобы она пришла к этому ненастоящему так с структуре и так мы можем иметь наш собственный код который работает в этом случае 32-битные ROM часто популярная стратегия A7, A10, A10, A11 и A11X не могут использовать эту стратегию так как нет возможности использовать эту утечку потому что ROM недостаточно детерминистик чтобы указать буфер который из измененного адреса надо каждый раз при инициализации USB стека поэтому необходимо разбить этот детерминизм чтобы получить нормальный UAF сценарий AXMX посмотрел на имплементацию с AQ ROM и понял, что HIP мы можем использовать эту проблему HIP Feng Shui так называемая мы должны управлять на контроль примитивов алокации USB-трансферы основаны на структуре алокации на HIP многие USB-трансферы могут происходить в одно и то же время например, если вы запрашиваете данные от девайс и если хост не дает добро, что данные дошли девайс будет в режиме stand-by это дает нам возможность позвать молок и отстранить по времени освобождения памяти пока все условия очищены или USB-стек отключен некоторые алокации сохраняются в DfU DfU некоторые баг режима машины в USB-стек может быть для того, чтобы алокации сохранились между разрушением и пересозданием USB-стек стандартный девайс в хост по USB дистраектор этих реквестов посылает пакет длины 0 когда запрос выполнен или USB-стек отключен проблема с этим что USB-стек выключается и пакет 0 никогда не отправлен и так называемый ликт и этот лик может быть пропущен с определенным условием мы видим мы можем использовать этот лик чтобы организовать режим хипа и получить сон того размера который нам необходимо для молок чтобы положить буфер для следующей алокации каждый реквест, каждый запрос есть, каждая структура USB-запроса содержит функцию указателя на callback который будет выполнен в более старых устройствах например, 7, эта техника не работает так как проблема, утечка всегда срабатывает для all для всех USB-запросов но на самом деле мы достигли ситуации checkmate когда у нас есть исполнение кода и мы хотим разработать bootkit чтобы продолжить с этим как мы разрабатываем bootkit мы можем исполнять код в sq rom и наша цель загрузить устройство оброчную и скомпрометировать каждую стадию процесса загрузки в конечном счете bootloader будет загружен загрузит ядром в память и попытается западить ядро в этот момент в времени потому что оно полностью в режиме записи и чтения это немножко не просто особенно если мы хотим поддерживать многие устройства мы будем использовать способ который называется boot trampoline при прыжках который посылает CPU режим назад в состояние ресета предыдущий имминдж удаляется в случае если rom не разрешает доступ ммю выключен все регистры установлены на 0 включая регистры такие как x18 который из-за ebi ограничений никогда не используется нормально в этом есть еще одна проблема курица яйца с trampoline оно удалит статус текущий статус bootloader поэтому оно должно быть перемещено с bootloader в другое место памяти которая удаляется полностью регион памяти который используется для этого мы можем в этом случае положить secure rom в sram и изменить ttb 0 чтобы перемепить дельту рома на некоторых устройствах 512кб области могут быть использоваться для этой цели полный ром может быть переложен туда на других дополнительно к этому нам необходимо еще одна область можно где мы положим наш shellcode мы все еще привязаны к свободной sram памяти может быть мы можем сделать нормальную загрузку которая инициализирует sram но bootloader также нам необходимо найти область чтобы положить shellcode может на вас использовать drem не инициализирован в то время как secure rom работает первый уровень bootloader отвечает за инициализацию drem проблема с drem i boot удалит большие порции но мы нашли workaround привязывая безиру и обнаруживая перекрывающие секции с нашим shellcode если да то безиру полагается как когда хук трамполина и безиру хук в своих местах мы можем достичь следующей инвакацию трамполина запустить эти хуки снова в следующей загрузке loader в конечном счете bootloader готов в нем ядро готово и трамполин будет использовать чтобы включить эту входную точку на устройство где el3 secure monitor входная точка использована вместо того аргументы ядра и входная точка передаются в области туда чтобы быть загружены в el1 через sm сейчас мы получили возможность запатчить ядро но проблема что разные устройства и версии пары устройства и версии безумная стратегия которую можно было здесь использовать поэтому мы не используем ее из-за того что мы запатчили трамполина мы получили исполнение кода во время точка времени без ммю или кешинг активировано это становится очень медленным из-за количества доступа к памяти мы применяем old school patch ядра но не составляют проблемы здесь так как существует патча, которая инициализирует их начиная с iOS VMA protecting VMA fold enter IMFI проверка доверенного кеша MIFC, hooks, mount tpf0, APFS и так далее только почевание ядра недостаточно в тот момент, когда ядро загружается нам необходимо сохранить контроль над исполнением кода в user mode чтобы подготовить режим jailbroker мы могли бы установить небольшой RAMDisk в наш ShellCode чтобы хакнуть код исполнения кода EL0 и пропатчить деревоустройство и аргументы ядра эффект результат почевания ядра спасибо мы начали исполнение кода saki ROM теперь мы пробрались до user mode исполнения кода в user mode но наш RAMDisk должен быть достаточно маленьким из-за перфоманса tf0 трансферы, которые не очень быстрые должны ждать несколько секунд при загрузке данных поэтому нам надо мы написали динамический линкер сами он производит user файл-систем пользовательской файл-системе мы используем syscall 3 чтобы произвести рута реальной файл-системе root на вершине нормального root файл-систем root-файл-систем на данном этапе только для чтения и нам было интересно оставить ее в этом режиме пока до того момента, когда user решает изменить это нам необходимо скопировать пару файлов для того, чтобы получить shell пользователям установить package manager если они хотят сделать это поэтому нам необходимо private var partition чтобы он был доступен на hook execution исполнение hook на раннем этапе в процессе boot но позже достаточно поздно пока включен режим защиты нам необходимо объединить mounting маленькой dmg он над user можно таким образом переписать системные демоны мы выбрали sys-status check так как он работает на системном уровне и мы сейчас можем разрешить позволить launch.d продолжать загрузку с помощью оригинального демона и теперь мы можем использовать fork до до того момента чтобы загрузить код исполнить наш код когда система запускается подождать до usb mux пока он включается подождать пока host dmg где все необходимые утилиты и таким образом и таким образом мы можем получить jailbreak на любом айфоник который на котором эти уязвимости присутствуют когда springboard когда вы видите значок springboard да когда он запускается вы видите значок checkrain у нас есть планы на будущее относительно этого мы хотели бы изменить сдвинуться с этого проекта от классического jailbreaker для обеспечения ios версии clover полностью custom on boot kernel pongo os модулярный супер маленький пребуд исполнить environment исполнение для 64-битной архитектуры 64 check grain kernel patcher уже адаптирован к pongo модулю это разрешит людям использовать инфраструктуру чтобы использовать разные дополнения и и без и найти проблемы безопасности спасибо спасибо за хороший доклад к сожалению мы у нас мало времени но мы попробуем что-то вы знаете всю процедуру устраивайте около микрофонов есть вопросы с интернетом как был этот эксплойт исследован айбут активный исследование был такой баг который был обнаружен несколькими людьми xmx нашел этот баг и его, и он был пропадчен apple потому что и секьюромом и дефук и между айбутом и затем они пропадчили новые секьюром поскольку это было пропадчено я не знаю если еще баги в айбут но попробуйте ткните меня палочкой если найдете что-нибудь в фронте привет отличный доклад я видел хорошую работу ребята, молодцы мой вопрос сегодня примерное время checkrain версия подwindows мы работали очень сурово над этим чтобы это сделать на macOS скоро будет linux release и к концу года мы выпустим и также работаем много над версией на windows и уже получили несколько достижений мы уже уже я думаю это будет уже в стечении нескольких месяцев розы красные небольшое стих очень хорошо все сделали где можно найти исходный код на данный момент checkrain это закрытый исходный код но может быть это может поменить со временем и я думаю что pongo os первых вещей может быть доступно с открытым исходным кодом мы оцениваем это примерно к концу следующего года следите за моими апдейтами на твиттере апдейтами на твиттер у нас закончилось наше время все