Получаване на JTAG при iPhone 15 (видео)

Оригиналът е на stacksmashing

Най-четени

Даниел Десподов
Даниел Десподов
Новинар. Увличам се от съвременни технологии, информационна безопасност, спорт, наука и изкуствен интелект.

Преди месец Apple представи iPhone 15своя първи смартфон с USB-C конектор. От година и половина се занимавам с хардуерно хакерство за iPhone, като например разработихме адаптер за сериен JTAG за iPhone, наречен Tamarin Cable. Компанията Apple най-накрая премина към USB-C, така че ми беше любопитно дали нещо подобно може да се направи и с iPhone 15. Предварително поръчах този телефон, няколко платки и комплект електронни компоненти.

Преди всичко трябва да се каже, че това не е уязвимост или джейлбрейк, просто изследвам USB-C в iPhone 15 и се забавлявам с хакването на хардуера.

Но нека да започнем от самото начало. Какво точно представлява JTAG? Методът JTAG първоначално е разработен през 80-те години на миналия век за тестване на печатните платки и тяхната целостност с помощта на интерфейса boundary scan. Но днес под JTAG обикновено се разбира интерфейс за дебъгване на процесори на ниско ниво. JTAG може да се използва за достъп до паметта, спиране на процесора, постъпково изпълнение на командите и т.н. в самото начало на процеса на стартиране, дори преди операционната система да се задейства със софтуерен дебъгер. SWD, или Serial Wire Debug, по същество е друг електрически интерфейс към JTAG, създаден от Arm. Оригиналният JTAG изисква поне четири извода, докато SWD се нуждае само от два.

Получаване на JTAG при iPhone 15 (видео)

И така, нека преминем към iPhone 15. iPhone с конектор Lightning имаше чип Tristar, който позволяваше да превключвате щифтовете на конектора в различни режими, като изпращате необходимите байтове чрез SDQ протокол. Беше възможно да превключите iPhone в режими Serial, JTAG или USB. Като се има предвид броят на наличните пинове на USB-C, си помислих, че Apple вероятно е направила нещо подобно с iPhone 15. Заслужава да се отбележи също, че новият iPhone не е първото USB-C устройство на Apple, например MacBook Pro с M1 и iPad Pro вече имаха USB-C. Когато започнах да търся информация за тях, открих, че екипът от 2019 г. T8012 е проучвал USB-C в MacBook Pro и е установил, че в MacBook Pro с чипа за сигурност T2 единият от USB-C конекторите може да бъде мултиплексиран в два различни режима. Един от членовете на екипа на T8012 успя да свали фърмуера на чипа ACE, отговорен за това; чрез обратното инженерство на фърмуера той откри, че Apple използва функция на USB-C, която се казва VDM (Vendor Defined Messages).

Получаване на JTAG при iPhone 15 (видео)

VDM позволява произволна комуникация по линиите CC (Channel Configuration) на конектора USB-C. Тези линии обикновено се използват за ориентация и подаване на захранване, но могат да се използват и за произволни комуникации. Чрез обратно инженерство стана ясно, че с помощта на командите на VDM е възможно да се превключва режимът на отделните контакти на USB-C конектора, например в сериен режим.

Проектът Asahi Linux разполага с чудесен инструмент, наречен macvdmtool. Той дава възможност за използване на ACE чипа в един MacBook за комуникация с ACE чипа в друг MacBook. Това ви позволява да изпращате съобщения, дефинирани от доставчика, и например да получавате Serial Boot Lock директно в MacBook

Разговарях с teamstar и той каза, че това работи дори на неговия iPad Pro с USB-C, така че VDM изглежда като чудесен начин да получите JTAG на iPhone 15. Като направих още няколко проучвания, открих страхотната платка Central Scrutinizer, базирана на инструмента vdmtool на проекта Asahi Linux. По същество това е реализация на macvdmtool, базирана на Raspberry Pi Pico, така че може да се използва за изпращане на произволни VDM съобщения. След като изучих архитектурата на оптичния сензор на този хардуер, реших да купя няколко готови печатни платки без компоненти и да инсталирам само тези, които ще ми трябват за комуникация с iPhone. Поставих FUSB302 – програмируем USB-C контролер, някои схеми за смяна на нивото, пасивни компоненти (кондензатори и резистори) и ги запоих на гърба на Raspberry Pi Pico.

Получаване на JTAG при iPhone 15 (видео)

След това изпробвах това устройство с Mac M1 и то работеше. Успях да рестартирам Mac-а, да го превключа в режим DFU и дори да прегледам комуникациите през серийния конектор с помощта на логически анализатор.

Получаване на JTAG при iPhone 15 (видео)

След това изпробвах работата на Central Scrutinizer с iPhone 15. Свързах платката към телефона и наблюдавах активността в блокировката, но нищо не се получи. Не можех да рестартирам iPhone и липсваха много от съобщенията, маркиращи успеха на MacBook. Дойде време да премина към дебъгване. Първо исках да видя дали методологията VDM изобщо може да работи, затова тествах инструмента macvdmtool с iPhone 15. Той работеше, можех да рестартирам телефона и дори да получа достъп до серийната конзола, което означава, че методологията като цяло работи, само че все още не с Central Scrutinizer. Опитах се да анализирам логиката на USB PD. Една от мислите ми беше, че когато включа iPhone към Mac, той започва да се зарежда, но не и когато го включа към Central Scrutinizer. Също така забелязах, че във фърмуера на Central Scrutinizer конфигурацията Power Delivery е настроена на 0 милиампера, така че устройството не може да подава енергия.

Получаване на JTAG при iPhone 15 (видео)

Реших да проверя захранващата линия VBUS с осцилоскоп. Оказа се, че когато iPhone не е включен, тази линия поддържа до 5 V, но когато iPhone е включен, VBUS се колебае малко, а след това се задържа на 2,5 V, въпреки че трябва да има 5 V. Помислих, че това е проблемът, затова започнах да мисля как да го реша. За щастие решението беше намерено в чекмеджето ми с компоненти. R5524 е превключвател за USB захранване, който позволява подаване на захранване към USB конектора. Благодарение на малък хак с магнитен проводник създадох своя модификация. Също така коригирах стойността на Power Delivery във фърмуера, като я зададох на произволна стойност, за да покажа, че поддържаме подаването на енергия.

Получаване на JTAG при iPhone 15 (видео)

И така, настъпи моментът на истината. Включих iPhone и всичко започна да работи! Получават се същите съобщения в логовете като в случая с MacBook, а когато изпратим команда за рестартиране с Central Scrutiniser, iPhone се рестартира. Нещо повече, в логическия анализатор, свързан към изводите на SPU, виждаме boot lock. Страхотно! Central Scrutinizer работи с iPhone. Но все още нямаме JTAG.

И така, как да вкараме JTAG в iPhone, а не само серийна връзка? В хода на моето проучване попаднах на страницата с хардуерната документация на Asahi Linux. Авторите са направили реверсивно инженерство на различните действия, които могат да се изпращат чрез VDM. Например, те изпращат командата 306, за да се получи серийна конзола или UART конзола. В края на страницата обаче имаше интересна тестова бележка:

Получаване на JTAG при iPhone 15 (видео)

„Има голяма вероятност да е SWD“ е точно това, което се търси. Затова потърсих командата 306 в базата с кодове на Central Scrutinizer и намерих този ред, в който просто замених 306 с 206.

Получаване на JTAG при iPhone 15 (видео)

Но за да проверя дали това ще работи, ми беше необходима малко по-сложна схема. Според документацията изводите имат напрежение 1,2 V, така че ми трябваше референтно напрежение за дебъгъра. Запоих малък куплунг, който ми даваше маса и 1,2 V от една от схемите за промяна на нивото. По същество планът ми беше да изпратя съобщение VDM 206 до iPhone чрез Central Scrutinizer. Надявах се, че по този начин ще преконфигурирам двата SBU извода на USB-C, за да осигуря SWD („JTAG“ интерфейс с два извода), след което ще мога просто да включа SWD дебъгер в изводния конектор на Central Scrutinizer и при късмет да се свържа чрез JTAG.

Получаване на JTAG при iPhone 15 (видео)

Ето как изглежда завършената тестова схема с дебъгер, Central Scrutinizer и iPhone:

Получаване на JTAG при iPhone 15 (видео)

Свързах и осцилоскоп към SBU изводите, за да мога да наблюдавам какво се случва по сигналните линии. Опитах се да се свържа с дебъгъра, имаше някаква активност на осцилоскопа, но за съжаление дебъгерът даваше само грешки, сякаш нищо не беше свързано. Но почакайте: бях свързал двата извода, необходими за SWD, но какво ще стане, ако случайно съм ги свързал погрешно? Имаше 50/50 вероятност това да се случи. Затова просто размених кабелите и опитах отново. Още нещо: изходът сега изглежда съвсем различно, казва, че е намерил порта за дебъгване на нулевия проводник:

Получаване на JTAG при iPhone 15 (видео)

И дори може да се прочете ID регистъра на порта за отстраняване на грешки. Така че все пак получихме SWD в iPhone 15. Въпреки това виждаме някои грешки, не може да намери AP или порта за достъп до дебъгване. И това е очаквано: произвежданите в търговската мрежа iPhone просто не могат да се дебъгват без експлойт, например, за да дебъгваме iPhone X с Tamarin, ще ни е необходим експлойтът BootROM Checkmate. Така че, въпреки че JTAG работи, няма да можем да дебъгваме процесора. Въпреки това, дори и при iPhone 15 в бъдеще ще можем да изследваме много интересни неща със SWD.

Проектът Central Scrutinizer ми хареса.

АбонаментВсичко важно от света на технологиите, директно в пощата ти.

С абонирането приемате нашите Условия и Политика за поверителност. Може да се отпишете с един клик по всяко време.


Коментирайте статията в нашите Форуми. За да научите първи най-важното, харесайте страницата ни във Facebook, и ни последвайте в Google Новини, TikTok, Telegram и Viber или изтеглете приложението на Kaldata.com за Android, iPhone, Huawei, Google Chrome, Microsoft Edge и Opera!

Нови ревюта

Подобни новини