首页 > 解决方案 > AssetManifests + 签名:通过绕过 AssetManifestSigning 来欺骗 iOS 从自定义来源获取操作系统资产?

问题描述

主要问题:

iOS 会验证系统下载(Siri 的自定义语音、无线更新等)是否已由 Apple 签名。我是否可以生成证书(并使 iOS 信任该证书)以使 iOS 从自定义源下载操作系统资产?如果是这样,怎么做?

背景

我最近一直在想念 Siri 大约 iOS 11 的旧声音(我使用的是 iOS 12)。iOS 7-10 使用了一种名为“Nicky”的语音,而 iOS 11 引入了一种名为“Nora”的新语音。在我的 Mac 上,我可以让 Siri 使用旧语音,只需将 Nicky 语音的一些文件交换到 /System/Library/Speech/NoraSiri.SpeechVoice/Resources 中的 Nora 语音文件夹即可。想要为我的 iPhone 做同样的事情,我意识到这并不容易,因为如果没有越狱,我将无法在 iOS 中修改必要的系统文件。我推断,相反,我可能会欺骗我的 iPhone 从我的计算机下载 Siri 的语音文件(我会对其进行修改以包含 Nicky 的声音)。

使用名为 Charles 的代理实用程序(并在我的 iPhone 上的 Settings>General>Certificate Trust Settings 中安装 Charles Root Certificate),我能够拦截来自我的 iPhone 的网络流量。事实证明,在为 Siri 下载新语音时,iOS 通过 HTTPS 向 Apple 服务器发出请求,以下载清单文件,其中包含有关所有可下载语音的信息、它们在 Apple 服务器上的 URL、它们的 SHA-1 哈希值等信息. 然后,使用清单文件中所需资产(语音)的 URL,iOS 下载资产(通过 HTTP),然后在实际安装文件之前验证下载文件的 SHA-1 是否与清单中的相匹配。

在使用我的 Charles Proxy 为我的 iPhone 提供通常会下载 Nora 的 URL 的自定义 Nicky 语音文件后,我(显然)遇到了我从计算机提供给 iPhone 的自定义 Nicky 文件没有预期的问题Nora 声音清单中指定的 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 本身是否有效的重要字段:

证书:似乎是有助于验证 XML 签名的证书。

Signature:这是 XML 的实际签名,大概是在用私钥签名之后。

签名密钥:此字段通常是“AssetManifestSigning”,它似乎是一条指令,iOS 使用存储在设备上的“AssetManifestSigning”公钥验证 XML 的签名。

我的问题

我有几个主要问题:

  1. 当签名密钥字段似乎告诉 iOS 在验证中使用哪个内部证书时,为什么在 XML 中包含证书?我什至看不到拥有证书的意义——得出验证文件所需的证书将包含在需要验证的文件中的结论似乎很荒谬。
  2. 假设只有Certificate用于验证 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

标签: ioscertificatecode-signingprovisioning-profilecode-signing-certificate

解决方案


推荐阅读