Начнём с начала: как система FaceID выглядит, и как она работает:
Аппаратно эта система состоит из пары камер - ИК и RGB, и двух видов ИК-излучателей - обычной подсветки, и специализированного прожектора точек.
Снимаем с iPhone X шкурку, убираем всё лишнее, и видим блок фронтальных камер в голом виде. ИК подсветка существует отдельно, но все остальные компоненты у нас в руках — они надёжно закреплены в этой металлической рамке.
Тут мы видим ИК камеру и прожектор ИК точек. Именно на этой инфракрасной парочке держится работа систем TrueDepth и FaceID. И главный герой сегодняшнего рассказа — как раз прожектор точек.
Краткий принцип работы FaceID
Прожектор ИК точек делает именно то, о чём говорит его название — выплёвывает по команде в окружающий мир десятки тысяч инфракрасных точек. А ИК камера, которая и отдаёт эту команду, тут же фотографирует эти точки.
Зная оптические характеристики прожектора, камеры и расстояние между ними, ISP в процессоре iPhone может прикинуть, насколько далеко каждая точка находится. Математику процесса я и сам до конца не понимаю, и реверсить её будет тяжело — но снятие серии изображений с разными паттернами точек позволяет весьма точно угадать позицию каждой отдельной точки, и сделать таким образом цельную карту глубины. Без LIDAR и без ToF.
Именно карта глубины позволяет FaceID не обманываться распечатанными на принтере фотографиями. Фотография плоская — а лицо имеет рельеф, и для FaceID топографическая карта морды важнее её расцветки.
Впрочем, на расцветку лица система тоже смотрит. ИК камера аппаратно синхронизирована с RGB камерой, и лицо обе камеры снимают одновременно. А ещё iPhone может моргать не только ИК прожектором, но и ИК подсветкой — и снять всё лицо в ИК спектре.
Карта глубины сама по себе достаточно грубая, и анализ текстуры лица в ИК и RGB снимках нейросетью позволяет как уточнить глубину, так и лучше разбираться в деталях вроде мимики — причём как при свете дня, так и в темноте.
Если эта система кажется вам знакомой, то это, наверное, потому, что она напрямую выдрана из Kinect от Xbox 360. Только тот Kinect был огромной бандурой, а тут его ужали до размера выреза в экране смартфона.
Сделала это компания PrimeSense, которая и разработала технологии в основе Kinect 1 — а потом была куплена Apple за 350 миллионов долларов. Целиком — со всеми патентами, наработками, сотрудниками и иными потрохами.
Разбираем кишки прожектора
Идём глубже в реверс: вынимаем прожектор точек из блока камер iPhone X и разбираем его на составные части. Состоит он из FPС-шлейфа, излучающей сборки и оптической сборки.
Шлейф полностью пассивный, и поэтому малоинтересный. Он припаивается к излучающей сборке, и выводит сигналы на FPC-разъём, который подключается к материнской плате iPhone X. Разъём с шагом контактов 0.35мм, кастомный (Apple засранцы), и похоже что сделан компанией JAE.
Посмотрим на основные компоненты оптики:
И посмотрим, что находится внутри излучателя:
И вот роль MOSFET и таинственного чипа меня заинтересовала. Почему? Потому что неясно, чем они там вообще занимаются.
Первый очевидный вариант — таинственный чип это память для серийного номера и данных калибровки. У чипа типичный для памяти интерфейс I2C, и память внутри точно есть. У прожекторов есть серийные номера, по которым можно в том числе определить дату производства — а если прожектор заменить целиком, то iPhone увидит несовпадение серийного номера и с заменой работать откажется. Но самый обычный I2C EEPROM встречается в крохотном WLCSP-4 корпусе — и его можно даже заблокировать от перезаписи, если очень хочется. Поэтому простой памятью чип быть не может. Он точно делает что-то ещё.
Второй очевидный вариант — таинственный чип это драйвер лазеров, а MOSFET - его ключ. И да, MOSFET и правда управляется чипом. Вот только чем-то критически важным, как драйвер лазера, чип тоже быть не может.
Во-первых MOSFET стоит в разрыве общего катода лазерной сборки — а 4 раздельных анода выходят напрямую на шлейф и идут дальше в недра слоёной платы iPhone. И во-вторых я по ходу сбора данных для реверса натыкался на разные инструкции от китайских ремонтных мастеров.
Сути вопроса они напрямую не прояснили, но во многих из этих инструкций говорилось: для ремонта «сломанного» прожектора нужно его разобрать, MOSFET снять, и заменить перемычкой между стоком и истоком. Прожектор в итоге с перемычкой внутри заработает, и функционал FaceID восстановится. А раз прожектор с перемычкой вместо MOSFET нормально работает, то что этот MOSFET там делал?
И меня осенило: в этом-то и была суть ремонта. MOSFET управляется чипом - поэтому по желанию чипа может разорвать цепь питания лазера, и сломать тем самым прожектор. А ремонт этот разрыв устраняет.
Что в имени тебе моём
Раз стало ясно, что таинственный чип в паре с MOSFET мешает нормальной работе прожектора, то возникает вопрос — зачем он это делает? Зачем в прожектор ставят чип, который убивает прожектор?
За ответами я полез в прошивку блока ISP в процессоре iPhone – именно она и разговаривает по I2C с сенсорами камер и с прожектором.
Сначала я скачал образ прошивки iOS 15 для iPhone X, свеженький. Образы прошивки для iPhone — это по сути zip-файлы. Внутри я и нашёл искомую прошивку ISP — в виде файла \Firmware\isp_bni\adc-nike-d22.im4p
. Из сжатого im4p-файла извлёкся бинарник, в формате Mach-O с AArch64 кодом внутри. Mach-O, в отличие от типичного «образа прошивки для неизвестного микроконтроллера» — это задокументированный формат исполняемого файла, похожий на PE или ELF. Нет никаких гаданий про структуру файла, архитектуру процессора или адрес, по которому нужно загружать код. Просто кидаешь файл в Ghidra и всё само раскладывается по полочкам. Приятно.
Потом инстинкт взял своё, и я решил распотрошить более старые прошивки. И в образе прошивки iOS 13 нашёл файл adc-nike-d22. Даже размер был почти такой же. Вот только в новой прошивке было больше кода — а в старой кода было меньше, зато были символы. Все имена функций на месте. Всегда проверяй старые версии!
В прошивке ISP есть много информации, включая то, как iPhone общается по I2C с разными чипами — с сенсорами камер, с PMU камер, с чипами управления вспышками и автофокусом. Оттуда же, спасибо символам, удалось извлечь «имена» разных составных частей системы — и часть из них соотносится с материалами из других частей прошивки, а так же от других реверсеров и ремонтников. Например, сенсор ИК камеры — это STMicroelectronics VD56G0 “Savage”. Вся система TrueDepth в коде называется “Pearl”, а её основным модулям даны имена персонажей из «Ромео и Джульета». ИК прожектор называется “Romeo”, ИК камера — “Juliet”, а ИК подсветка называется “Rosaline”. Драйвер лазеров, который живёт на материнской плате iPhone и запитывает как лазеры внутри “Romeo”, так и лазер внутри подсветки “Rosaline”, называется “Rigel“.
Интересующий нас таинственный чип? У него тоже есть имя. Его в коде называют “MamaBear”, кратко “MB”, и похоже что его функционал весьма прост. Он живёт на шине I2C. Он хранит в себе OTP-данные, включая серийный номер и разные калибровки. Он включает и выключает по команде MOSFET. И ещё он измеряет... ёмкость? Не температуру, к NTC-термистору он вообще не подключен, а именно ёмкость. Вот только ёмкость чего?
Трагическая гибель Ромео
Ответ на этот вопрос нам опять помогают получить китайские схемы. В схеме от JCID видно, что в модуле “Romeo” есть три контакта для связи излучающей сборки с оптической сборкой. Один — земля, а ещё два идут напрямую в чип “MamaBear”. Эти контакты проходят по специальному переходнику на боку оптической сборки, и попадают на самую её верхушку — на дифракционный оптический элемент.
Дифракционный расщепитель луча неуправляемый, и на ток не реагирует. Но он имеет ёмкость. И с помощью тех трёх линий эту ёмкость можно измерять. Но зачем?
Дело в том, насколько важную роль играет этот дифракционный расщепитель. Рисунок точек, используемых прожектором, задаётся расположением крохотных лазеров-«ямок» на VСSEL-кристалле. А потом этот рисунок размножается дифракционным элементом, который из одного пучка лучей делает сотни пучков лучей.
А значит, что будет, если этот дифракционный элемент оторвать?
Лучи не будут расщепляться. Вместо сотни пучков лазерных лучей будет один пучок — зато в сотню раз мощнее. А это всё-таки лазер. Инфракрасный лазер опаснее красного, потому что человек его не видит — и поэтому не станет инстинктивно отводить взгляд даже от опасно мощного источника света. И есть ненулевой шанс что характерный рисунок из точек окажется в таком случае выжжен у пользователя в сетчатке.
Для предотвращения этого и нужен чип-убийца. После включения он постоянно следит за ёмкостью дифракционного элемента — и если элемент оказывается выломан или повреждён, то ёмкость вылетает за пределы дозволенного, и чип тут же отрубает MOSFET и разрывает питание VCSEL. А так как элемент находится на самой верхушке оптической сборки, то повредить ударом остальную сборку, не сломав при этом его и не нарушив контакт, практически невозможно.
После аварийного отключения лазера чип выжигает себе в OTP флаг, который обозначает прожектор как дефектный — а значит, разорванное питание навсегда останется разорванным. Никакие команды из ISP больше не будут иметь над ним силы. MOSFET всегда будет закрыт, и прожектор больше не будет работать никогда.
Чип “MamaBear”, как намекает название – это чип защиты. Это “killswitch” для аварийной остановки лазера. Он убивает прожектор чтобы не дать повреждённому лазерному устройству светить пользователю в глаза. А модуль “Juliet”, оставшись без парного ему “Romeo”, теряет смысл жизни — и вся система TrueDepth приходит в негодность.
Трудовые будни техножрецов
Но эта схема защиты имеет изъян. Дело в том, что прожектор точек стоит на верхнем крае устройства, и рядом с динамиком. Если внутрь iPhone попадает жидкость, то одно из самых частых для этого мест — именно там. А ёмкостные датчики чувствительны к проводящим ток жидкостям. Поэтому часто случается так, что FaceID ломается после падения устройства в воду — даже если попадание воды минимально, и никаких других повреждений нет. Просто “Romeo” не так понял ситуацию, и совершил Роскомнадзор зазря.
Такие устройства несут в ремонт. Часто в неофициальный ремонт. А так как iPhone сверяет серийные номера запчастей (привет, Apple), то просто махнуть весь блок камер на рабочий блок с донора нельзя. Телефон будет отторгать новый блок, и FaceID всё равно не заработает. Значит, надо каким-то образом чинить старый. Но как можно «воскресить» прожектор, который сам себя намеренно вывел из строя?
Производители неофициальных инструментов для ремонта придумали для этого целый ряд различных ритуалов. А пряморукие техножрецы-ремонтники им свято следуют, и проводят микрохирургию этой сложной и откалиброванной оптической системы. Прямизна рук нужна невообразимая — компоненты внутри размером в считанные миллиметры, а оптика крайне чувствительная. Если калибровка из-за хирургических вмешательств слишком сильно уплывёт, то работать система не будет. Инструментов для программной перекалибровки не существует (привет, Apple) — ты либо найдёшь способ попасть в оригинальные параметры, либо останешься без FaceID.
Как это работает? Ну, первым делом надо считать данные OTP из оригинального чипа “MamaBear”.
Данные читаемы даже если прожектор считает себя неисправным. Для вычитки данных китайцы делают специальные «ремонтные» программаторы — которые поставляются с наборами разъёмов-переходников, и работают с целым рядом разных компонентов от разных моделей iPhone, включая и прожекторы.
А потом нужно сделать две вещи — разобраться с разрывающим питание MOSFET, и подменить оригинальный чип защиты. И тут есть множество разных методов.
Можно, например, кинуть вместо MOSFET перемычку, как на фотке выше в статье, а чип “MamaBear” подменить, отпаяв оригинальный FPC-шлейф и заменив его на специальный шлейф с китайским чипом-обманкой.
Оригинальный чип “MamaBear” при этом может оставаться внутри, и бессильно орать о том, что прожектор ни в коем случае не должен работать. Но у него больше нет MOSFET чтобы выключить прожектор принудительно, а iPhone со своей стороны видит только китайский чип — который отдаёт залитую программатором копию оригинальных данных, и рапортует о том, что прожектор точно-точно исправен.
А можно выдрать чип “MamaBear” целиком, и поставить на его штатное место китайскую замену два-в-одном — она и контакты MOSFET замыкает, и копию данных OTP в телефон отдаёт.
Ну и есть вариант с минимумом пайки. «Переходник» с чипом-обманкой, который ставится между оригинальным шлейфом и материнской платой iPhone.
Проблему с MOSFET он не решает, но и к ней китайцы нашли оригинальный подход, сделав «высоковольтные» программаторы.
Знаете, как всякие ATtiny можно «раскирпичить» и перезаписать с помощью специального высоковольтного программатора? Тут ситуация совсем другая. Китайский высоковольтный программатор брутально и необратимо «программирует» MOSFET внутри прожектора в короткое замыкание между стоком и истоком.
На последнем этапе ремонта мы подключаем прожектор к программатору ещё раз, и заливаем в него сохранённый на первом этапе дамп. И прожектор готов работать, выдавая себя за оригинальный и немодифицированный.
Все эти разные приспособления делаются и продвигаются разными продавцами ремонтного оборудования. Всевозможные чипы-обманки работают только с «родными» программаторами, а в программаторах часто стоят DRM-фичи вроде привязки к аккаунту и ограниченного количества «ремонтов», за пополнение которых приходится платить.
Знают ли чинилы, что они своим ремонтом полностью уничтожают систему, придуманную Apple для защиты глаз пользователя? На самом деле нет. Они не реверсеры — они шаманы. Понимания принципов работы у них нет. У них есть ритуалы и есть результаты, и этого им хватает. А ушлые реверсеры из Китая неохотно делятся своими секретами с публикой. То, что я описал в этой статье, известно в полном объёме только инженерам Apple и десятку китайцев «в теме». И мне. И тебе, теперь.
Почему Apple уроды
Знаете, я не могу слишком сильно винить инженеров Apple за то, что их “killswitch” слишком активен, и ломает прожекторы, которые вполне могли бы ещё поработать. Лазеры — тема опасная, и идея защитить пользователя от «худших сценариев» абсолютно здравая. Хоть реализация этой защиты и требует доработок.
Но политика Apple по борьбе с неофициальными ремонтами — это худшее из всех зол. Если бы блоки TrueDepth можно было спокойно менять с устройства на устройство, без оглядки на серийные номера, то в жутких извращённых ритуалах ремонта практически не было бы смысла. Зачем извращаться с микрохирургической пайкой и плясать с программаторами, если можно снять с очередного «донора» с битым экраном абсолютно рабочий блок TrueDepth, поставить его в телефон клиента, полностью восстановить функционал, и жить спокойно? Ремонтникам это было бы проще, а владельцам устройств — безопаснее.
Но история уродского антиремонтного поведения у Apple чётко показывает, что этому не бывать. Ну, если в США или в ЕС всяческие движения “Right to Repair” не сделают привязку запчастей по серийным номерам незаконной. А это сейчас возможно. В шутке про то, что Евросоюз добавляет в новые модели iPhone больше полезных фич чем Apple, очень высока доля правды. Так что будем следить за законодательными инициативами.