AssetManifests + Signing: обманывает iOS для получения ресурсов ОС из пользовательских источников, обходя AssetManifestSigning? - PullRequest
1 голос
/ 30 июня 2019

Основной вопрос:

iOS проверяет, что загрузка системы (пользовательские голоса для Siri, обновления по беспроводной сети и т. Д.) Была подписана Apple.Могу ли я сгенерировать сертификат (и заставить iOS доверять этому сертификату), чтобы заставить iOS загружать ресурсы операционной системы из пользовательского источника?Если да, то как?

Фон

Недавно я пропустил старый голос Сири около iOS 11 (я использую iOS 12).В iOS 7-10 использовался голос, известный как «Ники», а в iOS 11 появился новый голос под названием «Нора».На моем Mac я смог заставить Siri использовать старый голос, просто переместив некоторые файлы для голоса Ники в папку для голоса Норы в /System/Library/Speech/NoraSiri.SpeechVoice/Resources.Желая сделать то же самое для моего iPhone, я понял, что это будет не так просто, так как без джейлбрейка я не смог бы изменить необходимые системные файлы в iOS.Я рассуждал, что вместо этого я мог бы обмануть свой iPhone, чтобы загрузить голосовые файлы Siri (которые я бы изменил, чтобы включить голос Ники), с моего компьютера.

Используя прокси-утилиту под названием Charles (и установив Charles Root Certificate намой iPhone в «Настройки»> «Основные»> «Настройки доверия сертификатам»), я смог перехватить веб-трафик, поступающий с моего iPhone.Оказывается, что при загрузке нового голоса для Siri iOS обращается к серверу Apple через HTTPS, чтобы загрузить файл манифеста, который содержит информацию обо всех загружаемых голосах, их URL-адресах на серверах Apple, их хэшах SHA-1 и т. Д.,Затем, используя URL-адрес в файле манифеста для требуемого ресурса (голос), iOS загружает ресурс (через HTTP) и затем проверяет, что SHA-1 загруженного файла совпадает с SHA-1 в манифесте, перед фактической установкой файлов.

После использования моего прокси-сервера Charles для обслуживания моего iPhone пользовательских голосовых файлов Nicky для URL-адреса, который обычно загружал Нора, я (очевидно) столкнулся с проблемой, заключавшейся в том, что пользовательские файлы Nicky, которые я передавал со своего компьютера на мой iPhone, не выполнялисьне имеет ожидаемого хэша SHA-1, как указано в манифесте для голоса Норы.Затем я попытался использовать Charles, чтобы подать измененный файл манифеста на мой iPhone.

Но после проверки журналов с моего iPhone оказалось, что iOS достаточно умна, чтобы распознать, что файл манифеста поддельный, как сообщения типапоявилось следующее:

iPhone mobileassetd[8810] <Error>: mobileassetd - _MobileAssetDecryptAndVerifySignature: Could not verify signature using public key: -9809
iPhone mobileassetd[8810] <Error>: mobileassetd - _MobileAssetVerifyAssetMapSignature: Could not validate asset map signature

Здесь мое понимание очень размыто (особенно учитывая мои небольшие знания в области криптографии).Похоже, что XML-манифест содержит несколько важных полей, которые помогают проверить, что сам XML-манифест действителен:

Certificate : представляется сертификатом, который поможет проверить подпись XML.

Подпись : Это фактическая подпись XML, предположительно, после подписания закрытым ключом.

Ключ подписи : Это полеобычно «AssetManifestSigning», и, похоже, это инструкция для iOS проверить подпись XML с открытым ключом «AssetManifestSigning», хранящимся на устройстве.

Мои вопросы

У меня есть несколько основныхвопросы:

  1. Почему Сертификат включен в XML, когда поле Signing Key , кажется, сообщает iOS, какой внутренний сертификат следует использовать при проверке?Я не вижу смысла даже иметь Сертификат - было бы нелепо заключать, что сертификат, необходимый для проверки файла, будет включен в тот самый файл, который необходимо проверить.
  2. Предположим, что только Сертификат используется для проверки XML (в чем я сомневаюсь, как описано выше).Как я могу сгенерировать свой собственный сертификат, включить его в XML и подписать свой собственный XML?
  3. Предположим, что iOS фактически использует внутренний сертификат, указанный в «AssetManifestSigning», для проверки XML. Могу ли я сгенерировать свой собственный сертификат "AssetManifestSigning" и установить его на iOS, чтобы он доверял любым манифестам активов, которые я создаю?
  4. (Бонус) Предположим, что (2) и (3) невозможны. Любые другие предложения о том, как получить Ники вместо Норы? Я очень скучаю по Ники ...

Я рад предоставить больше информации, если это необходимо. Я понимаю, что мои знания о сертификатах / ключах / криптографии крайне отсутствуют, но любые указатели в правильном направлении приветствуются!

Дополнительные ссылки

Пример файла манифеста актива:

https://mesu.apple.com/assets/com_apple_MobileAsset_VoiceServices_GryphonVoice/com_apple_MobileAsset_VoiceServices_GryphonVoice.xml

Некоторая связанная информация о манифестах активов iOS:

http://web.archive.org/web/20131101032903/http://www.hydrantlabs.com/Security/iOS/OTA/

https://www.reddit.com/r/ReverseEngineering/comments/1n7h3u/i_reversed_the_ios_ota_update_protocol_enjoy/ccg55uq/?context=8&depth=9

...