iOS 15 позволяет находить выключенный iPhone чрез Find My

2889

iOS 15 позволяет находить даже выключенный iPhone, как это сделано и есть ли опасность?

В iOS 15.0 появилась новая функция: iPhone можно найти с помощью Find My, даже если iPhone выключен. Как это работает? Является ли это проблемой безопасности?
Я увидел эту функцию довольно рано на одном из своих iPhone с бета-версией iOS 15. Вот скриншот, который я сделал в июле. С тех пор пользовательский интерфейс немного изменился.

iOS 15 позволяет находить выключенный iPhone чрез Find My
iOS 15 позволяет находить выключенный iPhone чрез Find My

Прошло еще немного времени, прежде чем общественность узнала о существовании этой функции. Необходимо обновиться до iOS 15.0, использовать iPhone, у которого включены службы определения местоположения, зарегистрированная учетная запись пользователя, участие в сети Find My и т.д. И самое странное, чего никто не делает в наши дни: нужно выключить iPhone. Но как только об этом узнал Twitter, популярность темы мгновенно выросла. Как и количество слухов о том, как реализована эта функция.

В iOS 15 телефон можно находить, даже когда телефон выключен.

 

Apple’s Always-on Processor (постоянно включенный процессор Apple) (AOP)

О AOP имеется лишь немного документации в публичном доступе . Все чипы и различные встроенные устройства, которые производит Apple, работают под управлением операционной системы реального времени, называемой RTKitOS. AOP в iPhone не является исключением. Однако у AOP особая роль. Он соединяет почти все другие чипы в iPhone между собой. Для некоторых чипов он выполняет только базовые задачи, такие как управление питанием, а для других чипов он действует как прозрачный прокси, который пробуждает iOS, когда это необходимо.

Таким образом, постоянно включенный процессор фактически экономит энергию. iOS может переходить в спящий режим, пока AOP ожидает аппаратных событий. Простой пример — датчик движения. Не касаясь ни одной кнопки на iPhone, дисплей просыпается.

Быстрый поиск в Интернете показывает, что даже Siri реализована в AOP. Если вы не слишком вникаете в технические детали, вы можете пропустить оставшуюся часть этого раздела и просто должны знать, что AOP также подключается к беспроводным чипам и их интерфейсам управления питанием 🙂

Большинство драйверов ядра iOS имеет простую структуру. Если в чипе работает RTKitOS, то это видно на выводе ioreg. Например, в этом списке встречается Rose — чип U1 на основе Ultra-wideband.

Хоть это происходит и не в ядре iOS, AOP реализует копию этих драйверов. Например, U1 ranging имеет дублирующую реализацию, которая работает без nearbyd и может работать автономно в AOP.

Даже если чип не основан на RTKitOS, то AOP всё равно может к нему подключиться. Чип Bluetooth в iPhone 11, 12 и 13 изготовлен Broadcom и основан на операционной системе ThreadX. Тем не менее, AOP iPhone имеет частичный контроль над Bluetooth. Хотя он и не подчиняется той же схеме на основе RTKitOS, но может подавать питание на чип Bluetooth при помощи драйвера spmi-bluetooth.

Стоит заметить, что это очень отличается от ситуации с HomePod mini и Watch. В них используется чип Bluetooth производства Apple с кодовым названием Marconi. AOP может управлять Marconi при помощи драйверов marconi-bluetooth и aop-marconi-bt-control.

Запуск приложения Bluetooth, когда iPhone «выключен»

Всё, что необходимо iPhone для включения Find My, пока телефон «выключен» — простейшее управление питанием, а также чип Bluetooth, способный отправлять advertisements Bluetooth LE. Более того, эти advertisements требуют секретного ключа, привязанного к Apple ID в iPhone.

Чипы Broadcom очень похожи на чипы Cypress. SDK Cypress поддерживают внешние приложения IoT, требующие только чипа Bluetooth без дополнительных хостов. Эти приложения выполняются в потоке ThreadX под названием mpaf. Давайте проверим, есть ли где-то во встроенном ПО Bluetooth поток mpaf. Для этого скачаем IPSW iOS 15.0, смонтируем самый большой файл .dmg и перейдём в /usr/share/firmware/bluetooth. Файлы .bin — это патчи, загружаемые через драйвер Bluetooth PCIe. Начиная с iPhone 11 они содержат несколько отладочных строк. Выполнив grep mpaf *, можно получить такой список совместимости устройств.

  • iPhone 11 series, BCM4378B1 (Hei, Moana, Tala)
  • iPhone 12 series, BCM4387C2 (Almond, Cashew, Hazelnut, Pistachio)
  • iPhone 13 series, BCM4387C2 (Acacia, Camellia, Lilac, Mimosa)
  • iPad Air 2020 series, BCM4387C2 (Pomegranate)
  • Some other iPad series, BCM4387C2 (Baobab, Boab, Rambutan)

Интересно, что iPhone SE 2020, который также оснащен чипом BCM4378B1 и имеет кодовое название Fiti, не имеет патча mpaf. Я обновил iPad Air 2020 до iOS 15.0, и, несмотря на патч Pomegranate, диалоговое окно Find My не отображается. Также не обновилось местоположения iPad на другом iPhone, вошедшем в ту же учетную запись. Таким образом, возможно, существует разница в поддерживаемых в настоящее время устройствах и чипах, которые теоретически могут поддерживать эту функцию. В будущем Apple может добавить новые устройства.

Патч mpaf реализует приложение lpm, что, вероятно, означает low-power mode, которое реализует службу Bluetooth LE gatt. Все это можно найти в коде, и Plonk увидел это раньше меня.

tier2/Olympic/PCIE/Pistachio_CLPC_OS/USI/bld/A_4387C2_ROM/tier2/patch/bcs/mpaf_layer_patch.o.patch2.c
tier2/Olympic/PCIE/Pistachio_CLPC_OS/USI/bld/A_4387C2_ROM/tier2/patch/mpaf/apps/lpm/lpm_app.o.patch2.c
tier2/Olympic/PCIE/Pistachio_CLPC_OS/USI/bld/A_4387C2_ROM/tier2/patch/mpaf/apps/lpm/lpm_app_gatt.o.patch2.c
tier2/Olympic/PCIE/Pistachio_CLPC_OS/USI/bld/A_4387C2_ROM/tier2/patch/mpaf/apps/lpm/lpm_app_fsm.o.patch2.c

Эти патчи были добавлены в iOS 15 и отсутствовали ранее. Названия соответствуют ожидаемой функциональности. В этом посте я не буду приводить инструкции о том, как анализировать эти патчи, дампить ПЗУ чипа и т.д. Строк достаточно, чтобы убедиться, что эта функция реализована в чипе Bluetooth.

Связано ли содержимое секретного ключа с чипом U1?

Связано ли содержимое секретного ключа с чипом U1?
Одна птичка напела мне, что телефон записывает последовательность заранее вычисленных криптографических маяков в чипсет UWB, но птичка — плохая замена документации

В AirTag содержимое ключа хранится в чипе U1. Apple неспроста назвала nRF в AirTag «Durian» («дуриан»). Компания не любит его и не доверяет ему, но он дёшев и потребляет мало энергии. Чаще всего U1 находится в состоянии сна и время от времени пробуждается.

Но в iPhone система другая. В iPhone ключи хранятся в Secure Enclave (SE). В одной из ранних сборок U1 даже присутствовали отладочные строки для обмена содержимыми ключей между U1 и SE, но в последних сборках их уже нет. То есть птичка была права относительно AirTag, но не про iPhone.

Передача содержимого секретных ключей

После установки отладочного профиля Bluetooth на iPhone 12 с iOS 15.1b2 вывод idevicesyslog перед завершением работы выглядит так:

Sep 30 22:02:58 BlueTool[126] <Notice>: Completed handling of dictionary-xpc event

Sep 30 22:02:58 bluetoothd[89] <Notice>: BlueTool finished running "hci reset" command - output was "0x0e 0x04 0x01 0x03 0x0c 0x00"

...

Sep 30 22:02:58 BlueTool[126] <Notice>: Completed handling of dictionary-xpc event


Sep 30 22:02:58 bluetoothd[89] <Notice>: BlueTool finished running "hci cmd 0xFE62 0x06 ..." command - output was "<decode: missing data>"

Sep 30 22:02:59 bluetoothd[89] <Notice>: BlueTool finished running "hci cmd 0xFE62 0x06 ..." command - output was "<decode: missing data>"

Sep 30 22:02:59 BlueTool[126] <Notice>: Completed handling of dictionary-xpc event

Sep 30 22:02:59 bluetoothd[89] <Notice>: BlueTool finished running "hci cmd 0xFE62 0x06 ..." command - output was "<decode: missing data>"

Sep 30 22:02:59 BlueTool[126] <Notice>: Completed handling of dictionary-xpc event

Sep 30 22:02:59 bluetoothd[89] <Notice>: BlueTool finished running "hci cmd 0xFE62 0x06 ..." command - output was "<decode: missing data>"

Sep 30 22:02:59 BlueTool[126] <Notice>: Completed handling of dictionary-xpc event

Sep 30 22:02:59 bluetoothd[89] <Notice>: BlueTool finished running "hci cmd 0xFE62 0x06 ..." command - output was "<decode: missing data>"

Sep 30 22:02:59 BlueTool[126] <Notice>: Completed handling of dictionary-xpc event

Sep 30 22:02:59 bluetoothd[89] <Notice>: BlueTool finished running "hci cmd 0xFE62 0x07 0x00 0x01" command - output was "0x0e 0x05 ..."

Sep 30 22:02:59 BlueTool[126] <Notice>: Completed handling of dictionary-xpc event

Sep 30 22:02:59 bluetoothd[89] <Notice>: BlueTool finished running "bcm -s 0x0f,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00" command - output was ""

Sep 30 22:02:59 BlueTool[126] <Notice>: Completed handling of dictionary-xpc event

Sep 30 22:02:59 bluetoothd[89] <Notice>: BlueTool finished running "hci cmd 0xFE62 0x04" command - output was "0x0e 0x05 0x01 0x62 0xfe 0x00 0x04"

Sep 30 22:02:59 backboardd(libEDR)[66] <Notice>: ScheduleSetBrightnessIn_block_invoke: enter WaitUntil late 0.126834 millisecond (333 / 333)

Sep 30 22:02:59 backboardd[66] <Notice>: brightness change:0.67814 reason:BrightnessSystemDidChange options:<private>

Sep 30 22:02:59 SpringBoard(FrontBoard)[62] <Notice>: Shutdown task "NotifyBluetooth" complete after 1.59s

Sep 30 22:02:59 SpringBoard(CoreUtils)[62] <Notice>: Invalidate CID 0x2B760001

Sep 30 22:02:59 SpringBoard(FrontBoard)[62] <Notice>: Shutdown tasks complete.

Sep 30 22:02:59 SpringBoard(CoreUtils)[62] <Notice>: Invalidated

Sep 30 22:02:59 bluetoothd[89] <Notice>: BT_FW_OK flag is set. Entering LPM...

Sep 30 22:02:59 bluetoothd(CoreUtils)[89] <Notice>: LPM entry took 1578ms

Sep 30 22:02:59 bluetoothd[89] <Notice>: Sending BT Stats to CoreAnalytics for com.apple.BTLpmManagerStats

Sep 30 22:02:59 bluetoothd[89] <Notice>: PowerManager power state is 0

Sep 30 22:02:59 bluetoothd[89] <Notice>: PowerManager power state is 0

Sep 30 22:02:59 bluetoothd[89] <Notice>: PowerManager power state is 0

Sep 30 22:02:59 bluetoothd[89] <Notice>: PowerManager power state is 0

[disconnected]

Последние шаги повторяются несколько раз с выводом произвольных чисел. Это маячки, конфигурируемые на чипе Bluetooth. Поэтому я удалил их из этой статьи. Затем, в конце чип Bluetooth сообщает, что он переходит в режим низкого энергопотребления (LPM). Сразу после этого iPhone выключается.

Каждое advertisement Find My начинается с 0x4c 0x00 0x12 0x19, и эта последовательность байтов также содержится в выходных данных BlueTool. В целом, на чип Bluetooth записано 80 advertisements. Я не анализировал длительность временного интервала для каждого advertisements, но, скорее всего, это не 15 минут по умолчанию, а больший временной интервал.

Если вы хотите отладить эго самостоятельно, сброс HCI — это последняя информация, видимая в PacketLogger от Apple, в то время как idevicesyslog по-прежнему показывает вывод и команды BlueTool.

Влияние на безопасность и конфиденциальность

Еще один вопрос от @reni_ni касался того, отключает ли режим полета Bluetooth LPM. Спасибо за этот вопрос. Когда Bluetooth отключен через меню «Настройки» (приложение «Настройки» → Bluetooth → Выкл.), это отключает функцию Find My, а также функцию LPM.

Обратите внимание, что Bluetooth не обязательно выключен в режиме полета. Есть два символа «Bluetooth выключен», и только второй указывает на то, что Bluetooth выключен. Всегда используйте приложение «Настройки», чтобы убедиться, что вы вошли в правильный режим.

Bluetooth off
Bluetooth off
Bluetooth off
Bluetooth off

При таком отключении Bluetooth, вывод idevicesyslog показывает, что не только стек Bluetooth iOS приостановлен, но и LPM отключен.

Oct  3 15:53:31 bluetoothd[89] <Notice>: LPMManager::stackWillStop


Upon turning off the iPhone, it will no longer show that Find My is enabled after turning it off, and the idevicesyslog output indicates that LPM will be disabled when turning the iPhone off.

Oct  3 15:55:39 bluetoothd[89] <Notice>: LPMManager::powerManagementEventSystemWillShutDown

Oct  3 15:55:39 bluetoothd[89] <Notice>: LPMManager::powerManagementEventSystemWillShutDown fOfflineADVDataPending = true

Oct  3 15:55:39 bluetoothd[89] <Notice>: Triggering LPM

Oct  3 15:55:39 bluetoothd[89] <Error>: lpmFlag is not enabled. Failed to enter LPM.

Oct  3 15:55:39 bluetoothd(CoreUtils)[89] <Notice>: LPM entry took 6ms

Влияние на безопасность и конфиденциальность

Новая функция Find My впервые позволила широкой публике узнать об AOP, а также о возможности автономной работы чипа Bluetooth.

Если предположить, что кто-то взломал ваш iPhone и шпионит за вами, он может и показать экран «отключения питания», но не отключать iPhone. Никогда не считайте, что устройство отключено, пока из него не извлечена батарея или лучше того — его не засунули в блендер. Например, АНБ взломало телевизор Samsung и добавило поддельный режим отключения, чтобы шпионить за людьми.

Протокол Find My имеет пару интересных механизмов для защиты вашей конфиденциальности. Он был подвергнут полному реверс-инжинирингу и существует его реализация в open source. Более того, приложение AirGuard позволяет вам идентифицировать маяки BLE Find My в Android. Если вы опасаетесь утечки своих местоположений через Find My, то можете просто отключить функцию в iPhone.

Учтите, что другие чипы беспроводной связи тоже обеспечивают утечку информации о местоположении. Сотовое подключение позволяет локализовать вас, а поставщик услуг мобильной связи может хранить историю местоположений, Wi-Fi тоже обеспечивает утечку местоположения (хоть с этим помогает справиться рандомизация MAC-адреса), и это ещё не всё. Что бы вы ни делали, смартфон — это устройство для слежки за человеком. Защита конфиденциальности в Find My устраняет только один возможный аспект слежки из множества.

Самое страшное может заключаться в том, что AOP и Bluetooth LPM позволяют создать новый вектор зловредного ПО, постоянно хранящегося в оборудовании.