Защищаем резервные копии iPhone

?v=1

Сегодня я хочу рассказать об малоизвестных особенностях iOS, связанных с защитой резервных копий, обходом этой защиты (рекурсия) и защитой от обхода защиты (двойная рекурсия). Вишенкой на торте будет короткая инструкция, позволяющая обойти защиту от обхода защиты резервных копий (так, уже рекурсия третьего порядка), а также рекомендации, следование которым поможет защититься от обхода защиты от обхода защиты резервных копий (отлично, рекурсия четвёртого порядка — думаю, я заслужил медаль!).

Защита резервных копий: пока всё просто


Система резервного копирования iOS — воистину вне конкуренции. Нечто подобное в плане локальных бэкапов мы видели в BlackBerry 10, но эта система мертва, а до «облака» дело у BlackBerry так и не дошло. (Кстати, в ОС BlackBerry 10 резервные копии шифровались всегда, а ключ — всегда хранился в облаке — или в BlackBerry ID пользователя, или в корпоративной сети). Вполне прилично было сделано резервное копирование в «облако» и в Windows Phone 8.1, а также в Windows 10 Mobile –, но и эти системы ныне мертвы, а локальных бэкапов в них никогда не было.
Единственный конкурент iOS — система Android, резервные копии которой создаются исключительно в облаке (команду adb backup мы проигнорируем: реально сохраняемых этой командой данных даже меньше, чем попадает в облако). Да, определённые ухищрения помогут вытащить больше данных, но именно резервные копии в Android далеки от идеала.

В рамках же этой статьи нас интересуют в первую очередь локальные резервные копии; об их содержимом я ранее писал в нашем блоге. Их можно создавать, например, в приложении iTunes, но не только в нём: существует множество сторонних приложений (в том числе и наш собственный iOS Forensic Toolkit), которые, подключившись к iPhone, создадут его резервную копию. Кстати, используя Toolkit, бэкап иногда можно вытащить из телефона даже тогда, когда экран заблокирован, а код блокировки неизвестен (для этого используются файлы lockdown).

Резервная копия — удобный, универсальный и очень простой способ вытащить из хорошо защищённого (и, кстати, зашифрованного) хранилища устройства свежую копию данных. В резервные копии попадает практически всё самое интересное: и данные большинства приложений, и логины с паролями, которые пользователь сохранил в браузере Safari и сторонних приложениях, и пароли к Wi-Fi, и резервные копии часов, и данные об активности пользователя (шаги, сердцебиение в заданный момент времени). Попадают в резервные копии и многие другие вещи, жизненно необходимые для расследования преступлений.

Зачем нужна резервная копия, если код блокировки известен?

Нам часто задают вопрос (если быть точным в формулировках, то «с претензией заявляют»): если код блокировки и так известен, то зачем вообще нужна резервная копия? Можно же и так всё посмотреть на самом iPhone?

Нет, не всё. Даже если известен код блокировки, на самом iPhone можно просмотреть далеко не все интересные данные. В резервных копиях iPhone сохраняет много данных, даже помимо желания пользователя. Пользователь может даже не знать, что эти данные существуют! Это касается, например, истории браузера Safari — на самом телефоне или в iCloud можно просмотреть историю за последние 30 дней, а в резервную копию попадает вообще вся история за всё время использования телефона (если пользователь не чистил историю вручную). Кстати, ровно то же самое касается и истории звонков: в приложении «Телефон» она видна только за последние 30 дней, а в резервной копии сохраняется информация обо всех звонках. Одного этого уже достаточно правоохранительным органам, чтобы охотиться именно за резервными копиями, но и это не всё. Пользователь может удалить часть сообщений в программе мгновенного обмена сообщениями — и вы не увидите их на экране устройства; в то же время база данных в формате SQLite может содержать удалённые записи в течение длительного времени — пока не будет запущена процедура периодической сборки мусора. Немаловажные вещи — анализ, поиск, экспорт данных, в том числе удалённых (первый запрос полиции — «где был пользователь в такое-то время такого-то числа»; попробуйте интереса ради ответить на этот вопрос, имея в руках свой собственный телефон и засеките, сколько это займёт времени. А анализ данных из резервной копии выдаст ответ за секунду.) Есть и мелочи — например, дата добавления контакта или дата создания события в календаре, которые не видны в пользовательском интерфейсе.

В то же время в руках злоумышленника резервная копия превращается в оружие против пользователя. Логины и пароли из Связки ключей позволяют «угнать» учётные записи, получить доступ к переписке и деньгам пользователя. Чтобы этого не произошло, Apple позволяет пользователю установить пароль на резервные копии.

Если пароль установлен, вся резервная копия целиком будет зашифрована стойким ключом, который генерируется на основе пароля. Шифрование происходит внутри устройства; если пароль установлен, то незашифрованные данные просто не покидают телефон. Соответственно, какую бы программу для снятия резервной копии вы ни использовали, результат будет один: зашифрованный бэкап.

Шифрование локальных резервных копий в относительно свежих версиях iOS (10.2 и более новых) настолько стойкое, что даже с использованием аппаратного ускорения с GPU Nvidia GTX 1080 нам не удалось получить скорость перебора больше сотни паролей в секунду. Соответственно, лобовая атака бесполезна даже если используется несложный пароль всего из 7 знаков (среднее по больнице). Впрочем, даже при наличии стойкого пароля на шифрование из телефона можно извлечь фотографии и медиа-файлы, если известен пасскод или есть lockdown.

В iOS 10.2 и вплоть до выхода iOS 11 длинный и сложный пароль на резервную копию был абсолютной защитой; никакой возможности удалить или поменять пароль, не введя предварительно старый, в старых версиях системы не существовало. В iOS 11 ситуация изменилась.

Первая рекурсия: сброс пароля на резервную копию


Я уже писал о том, что можно сделать в iOS 11, 12 и 13 при помощи кода блокировки. Среди многих других вещей, в этих версиях iOS код блокировки экрана можно использовать для сброса пароля к резервной копии. Теперь, если злоумышленник узнал код блокировки экрана, он может сбросить пароль на локальную резервную копию, подключить телефон к компьютеру и извлечь все данные, а также расшифровать все пароли из связки ключей.

На сайте Apple даются подробные инструкции, как нужно действовать для сброса пароля на резервную копию:

В iOS 11 или более поздней версии можно создать зашифрованную резервную копию устройства, сбросив пароль. Чтобы сделать это, нужно выполнить следующие действия.

  1. На устройстве iOS выберите «Настройки» > «Основные» > «Сброс».
  2. Нажмите «Сбросить все настройки» и введите пароль ОС iOS.
  3. Следуйте инструкциям по сбросу настроек. Это не затронет данные или пароли пользователей, но приведет к сбросу таких настроек, как уровень яркости дисплея, позиции программ на экране «Домой» и обои. Пароль для шифрования резервных копий также будет удален. (В скобках: на этом этапе устройство потребует ввести код блокировки экрана).
  4. Снова подключите устройство к iTunes и создайте новую зашифрованную резервную копию.
  5. Вы не сможете использовать ранее созданные зашифрованные резервные копии, но можете использовать iTunes для резервного копирования текущих данных и установить новый пароль резервной копии.


На устройстве с iOS 10 или более ранней версии сброс пароля невозможен.

Вторая рекурсия: защищаемся от попыток сброса пароля на резервную копию


Лёгкость, с которой злоумышленник может обойти ваш самый сложный и длинный пароль, всего лишь введя код блокировки экрана, неприятно поражает. Однако и от этой напасти можно попробовать уберечься. Механизмом защиты здесь станут Ограничения родительского контроля (iOS 11) или пароль Экранного времени (iOS 12 и 13). Для простоты я буду описывать именно iOS 12.

Допустим, ваш iPhone попал в руки злоумышленника. Предположим, злоумышленнику удалось подсмотреть ваш код блокировки; теперь он пытается отвязать телефон от облака, а заодно слить копию данных, получив доступ к паролям из Связки ключей. Защититься от такого развития событий можно при помощи пароля Экранного времени. Подробно о возможностях контроля Экранного времени можно почитать в статье Apple Использование родительского контроля на устройствах iPhone, iPad и iPod touch ребенка. Нас же сейчас интересует другая возможность этой системы: защитить телефон от сброса пароля на резервную копию.

Как ни странно, ограничить возможность сброса пароля к локальной резервной копии iOS достаточно просто: всё, что нужно сделать, это установить пароль Экранного времени как таковой. Сложность такого пароля невелика: единственный доступный вариант — это PIN-код из 4 цифр. Тем не менее, такая защита в целом достаточно надёжна. Поскольку этот пароль используется очень редко и отличается от кода блокировки устройства, его невозможно случайно подсмотреть. Этот код понадобится в исключительно редких случаях, когда вы захотите изменить настройки или отключить ограничения. Вы можете установить случайный код, записав его на оставленной дома бумажке — и это будет вполне безопасно.

Что произойдёт, если теперь попытаться сбросить пароль на резервную копию? На первом шаге — никаких отличий: система запросит пароль блокировки устройства. А вот сразу после этого будет запрошен дополнительный 4-значный пароль Экранного времени. Эта мера безопасности вполне способна не только отвадить любопытных, но и защитить iPhone от вполне серьёзных попыток взлома.

Рекурсия третья: как узнать пароль Экранного времени


Пароль Экранного времени сохраняется на самом устройстве. Подобрать его за разумное время невозможно: невеликое пространство из 10,000 комбинаций защищается системой прогрессирующими задержками между попытками ввода. После нескольких неудачных попыток система ограничит скорость перебора паролей Экранного времени, вводя прогрессивные задержки в 1, 5, 15 и 60 минут. После 10 неудачных попыток каждая следующая попытка может быть предпринята не ранее, чем через час после предыдущей; перезагрузка устройства не поможет ускорить процесс. Таким образом, все 10,000 комбинаций можно перебрать за 416 дней.

Однако есть более интересные способы. Сразу оговорюсь: первый из них работает только тогда, когда пароль на резервную копию не установлен или известен, а второй — если на iPhone можно установить джейлбрейк (т.е. версия iOS на нём не новее iOS 12.2). Для iPhone с неизвестным паролем к резервной копии, работающего на самой последней версии iOS (сегодня это 12.4) работающего способа узнать пароль Экранного времени (пока) нет.

Способ 1: извлечь из резервной копии

В iOS 7–11 этот пароль (там он носит название Restrictions) хранится в виде хэша. Алгоритм относительно стойкий (pbkdf2-hmac-sha1, но количество итераций относительно невелико). С учётом того, что пароль этот состоит всегда и только из 4 цифр, полный перебор хэша на компьютере занимает несколько секунд. Сам хэш хранится в файле com.apple.restrictionspassword.plist, который попадает в бэкап. Соответственно, пароль Restrictions можно вскрыть, если у нас есть (одно из):

  • бэкап без пароля
  • бэкап с паролем, плюс пароль от него


В iOS 12 (здесь это пароль Экранного времени, или Screen Time) хранится в открытом виде. Нет, безопасность от этого хуже не стала: пароль переместили в Связку ключей. Тем не менее, класс защиты паролю Экранного времени назначили минимальный: он не привязан к устройству. Минимальный класс защиты назначен умышленно. Сделано это для того, чтобы при восстановлении нового iPhone из бэкапа пароль Экранного времени устанавливался автоматически (таким образом Apple закрыли потенциальную возможность снять пароль Экранного времени путём создания резервной копии, сброса устройства и последующего восстановления из резервной копии). Записи Связки ключей с более высокими классами защиты не попадают в резервные копии или попадают, но защищаются аппаратным ключом устройства (то есть, могут быть восстановлены только на то же самое устройство).

Чтобы достать пароль Экранного времени, нужно:

  • бэкап с паролем плюс пароль от него


Способ 2: через джейлбрейк

Очевидно, что первый способ сработает лишь тогда, когда пароль на резервную копию не установлен или известен. Если же пароль на резервную копию установлен, но неизвестен, то единственный оставшийся способ узнать пароль Экранного времени — получить доступ к Связке ключей (keychain). Для старых версий iOS нужна копия файловой системы.

Для iOS 7–11 нужно:

  • образ файловой системы, снятый EIFT (нужен джейлбрейк) или GrayKey (джейлбрейк не нужен, достаточно кода блокировки устройства, но сам продукт доступен только правоохранительным органам некоторых стран)


Для iOS 12:

  • Связка ключей, добытая EIFT или GrayKey


Нужно ли это делать? Не уверен: если удалось установить джейлбрейк, то, во-первых, все пароли можно извлечь и так, без посредника в виде резервной копии. Во-вторых, пароль на резервную копию можно узнать, расшифровав Связку ключей: пароль на резервную копию (так же, как и пароль Экранного времени) хранится там в открытом виде. Впрочем, если цель — снять ограничения Экранного времени, то такой подход вполне годится.

One more thing

Что интересно, пароль Экранного времени хранится также и в облаке iCloud, но только в том случае, если вы включили двухфакторную аутентификацию и активировали опцию Screen Time «Share across devices». Сам ключ при этом не попадает в Облачную связку ключей, а хранится отдельно (примерно в том же виде, что и ключ восстановления доступа к зашифрованным томам FileVault 2). На сегодня нет механизмов, чтобы извлечь его из iCloud и просмотреть. Мы над этим работаем; осенью планируется выход свежей версии Elcomsoft Phone Breaker, которая будет обладать этой возможностью (если с выходом iOS 13 ничего не изменится в механизме его хранения; такая вероятность есть: в самом телефоне iOS 13 уже изменила место хранения этого пароля).

В любом случае, чтобы вытащить пароль Screen Time из iCloud, вам понадобится всё перечисленное ниже:

  • логин и пароль от Apple ID (iCloud) пользователя
  • код блокировки экрана устройства
  • доступ ко второму фактору аутентификации (им является само устройство, если известен код блокировки; впрочем, достаточно и SIM-карты с доверенным телефонным номером)


А вот сценарий со сбросом устройства и последующим восстановлением его из «облачной» резервной копии мы не проверяли, поэтому я не могу точно сказать, активируется ли пароль Экранного времени, если создать резервную копию в iCloud, сбросить iPhone и восстановиться из облака. Причём система может повести себя по-разному в случаях, когда из резервной копии восстанавливается тот же самый iPhone или новое устройство.

Рекурсия четвёртая, последняя: как защитить доступ к паролю Экранного времени


Вот мы и подошли к последнему пункту. Если ваша цель — максимально обезопасить устройство, то в ваших интересах сделать так, чтобы пароль Экранного времени ни сбросить, ни узнать было нельзя. Так же, как и в предыдущей части, новостей у меня две: хорошая и плохая.

Хорошая новость в том, что защитить пароль Экранного времени от обывателя и даже профессионального взломщика довольно просто: достаточно установить длинный и стойкий пароль на резервную копию, после чего просто поддерживать устройство в актуальном состоянии, устанавливая свежие версии iOS сразу после их выхода. Джейлбрейки для новых версий iOS выходят далеко не сразу. Иногда между выходом обновления iOS и появлением для неё работоспособного джейлбрейка проходят месяцы.

Опасаться можно сценария, когда украденное устройство (с известным злоумышленнику кодом блокировки) будет положено на полку в ожидании появления джейлбрейка. Здесь, однако, может помочь стандартная «Стереть [устройство]», выполненное в портале Find my iPhone. Дело в том, что для установки джейлбрейка требуется сначала подписать IPA-файл, а потом и подтвердить цифровую подпись непосредственно на самом iPhone. Подтверждение цифровой подписи происходит на сервере Apple; то есть, злоумышленнику придётся разрешить украденному у вас iPhone выйти в интернет. В этот момент с большой вероятностью сработает команда на стирание устройства.

Злоумышленники могут решить эту проблему, используя специальные конфигурации роутера, в которых будет запрещён доступ к узлам, ответственным за функционал Find My iPhone. Кроме того, вместо обычного сертификата для подписи джейлбрейка могут использовать сертификат разработчика, который не требует выхода iPhone в сеть для подтверждения цифровой подписи.
Плохая же новость в том, что как ни старайся, но защитить iPhone от доступа через системы GrayKey или UFED Premium не получится: их разработчики смогли обойти большую часть защитных механизмов iPhone. Если известен код блокировки экрана, то получить доступ к файловой системе и расшифровать Связку ключей пользователи этих комплексов смогут без особых проблем. С другой стороны, доступны эти комплексы только и исключительно правоохранительным органам, причём далеко не в любой стране (в Россию, например, они не поставляются). Попадание их в руки злоумышленников практически исключено. Таким образом, этой опасности вы вряд ли подвергнетесь.

© Habrahabr.ru