标题: 向极客进发…自己动手改造挽救了
时间: 2020-01-07
『回复列表(12|隐藏机器人聊天)』
安卓的data分区有加密,即使从闪存导出了原始数据,也需要解密后才能得到文件内容。
较新的系统使用文件级加密,在手机之外解密可能相当困难:
https://source.android.com/security/encryption/file-based?hl=zh-cn#key-derivation
密钥派生
磁盘加密密钥(512 位 AES-XTS 密钥)以加密形式存储:通过另一个存放在 TEE 中的密钥(256 位 AES-GCM 密钥)进行加密。要使用该 TEE 密钥,需要具备以下三项:
- 身份验证令牌
- 扩展凭据
- secdiscardable hash
身份验证令牌是一个经过加密身份验证的令牌,由 Gatekeeper 在用户成功登录时生成。除非用户提供的身份验证令牌正确无误,否则 TEE 将拒绝用户使用该密钥。如果用户没有任何凭据,则不使用也不需要使用身份验证令牌。
扩展凭据是使用 scrypt 算法进行加盐和扩展处理后的用户凭据。实际上,凭据在被传递到 vold(以便传递到 scrypt)之前,会在锁定设置服务中接受一次哈希处理。扩展凭据会以加密形式绑定到 TEE 中的相应密钥,并享有适用于 KM_TAG_APPLICATION_ID 的所有保证。如果用户没有凭据,则不使用也不需要使用扩展凭据。
secdiscardable hash 是 16 KB 随机文件的 512 位哈希,和用于重建相应密钥的其他信息(例如种子)存储在一起。该文件会在相应密钥被删除时一并被安全删除,或者会以新的方式被加密;采用这种附加的保护措施后,攻击者要恢复相应密钥,必须要先恢复这个被安全删除的文件中的每一个位。secdiscardable hash 同样会以加密形式绑定到 TEE 中的相应密钥,并享有适用于 KM_TAG_APPLICATION_ID 的所有保证。
此时,你的手机密码并不是文件解密密钥,它只是从安全芯片获取密钥的一个验证方式。如果无法得到存储在安全芯片中的密钥,data分区也就无法解密,数据恢复也就无法完成。
然而问题是,TEE安全芯片位于CPU内,如果手机无法开机,则无法得到该密钥。
所以,如果华为按AOSP推荐的方法实施了加密,则CPU损坏=丢失数据。如果CPU没有损坏,则将CPU和闪存一起安装到新主板上可能可以解密数据。
老一点的系统使用全盘加密:
https://source.android.com/security/encryption/full-disk?hl=zh-cn
全盘加密是在 Android 4.4 版中引入的,不过 Android 5.0 中又引入了以下新功能:
- 添加了由硬件支持的加密密钥存储空间,该空间使用可信执行环境(TEE,例如 TrustZone)的签名功能。如需更多详细信息,请参阅存储已加密的密钥。
Android 全盘加密的运作方式Android 全盘加密基于在块设备层运行的内核功能 dm-crypt。因此,这种加密方式适用于以块设备的形式呈现给内核的嵌入式多媒体卡 (eMMC) 和类似闪存设备。YAFFS 会直接与原始 NAND 闪存芯片交互,无法进行全盘加密。
全盘加密采用的是 128 位高级加密标准 (AES) 算法(搭配加密块链 (CBC) 和 ESSIV:SHA256)。对主密钥进行加密时使用的是 128 位 AES 算法(通过对 OpenSSL 库的调用实现)。对于该密钥,您必须使用 128 位或更多位(可以选择 256 位)。
首次启动时,设备会创建一个随机生成的 128 位主密钥,然后会使用默认密码和存储的盐对其进行哈希处理。默认密码是“default_password”。不过,设备还会通过 TEE(例如 TrustZone)为生成的哈希签名。TEE 会使用相应签名的哈希来加密主密钥。
当用户在设备上设置 PIN 码/通行码或密码时,只有 128 位的密钥会被重新加密并存储起来(也就是说,更改用户 PIN 码/通行码/解锁图案不会导致重新加密用户数据)。
此时,你需要找到128位密钥才能进行解密。但里面又涉及到喜闻乐见的TEE。在ARM架构中,TEE是CPU的一部分。
此外,如果你真的打算自己解密,建议你买个BGA编程器,淘宝有很多,找到你闪存适用的即可:
https://s.taobao.com/search?q=bga%E7%BC%96%E7%A8%8B%E5%99%A8&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20200108&ie=utf8
除非闪存有测试用的串行连接点(只需要焊接几个点),否则手工锡焊不太可能焊好。
然而问题是,解密安卓Data分区可能相当困难,并且涉及到TEE里存储的密钥,而TEE的数据存储在CPU中。
由硬件支持的 Keystore
https://source.android.com/security/keystore?hl=zh-cn
借助系统芯片 (SoC) 中提供的可信执行环境,Android 设备可以为 Android 操作系统、平台服务甚至是第三方应用提供由硬件支持的强大安全服务。
架构
Android Keystore API 和底层 Keymaster HAL 提供了一套基本的但足以满足需求的加密基元,以便使用访问受控且由硬件支持的密钥实现相关协议。
Keymaster HAL 是由原始设备制造商 (OEM) 提供的动态加载库,Keystore 服务使用它来提供由硬件支持的加密服务。为了确保安全性,HAL 实现不会在用户空间(甚至是内核空间)中执行任何敏感操作。敏感操作会被分配给通过某个内核接口连接的安全处理器。
旧设备使用的全盘加密似乎也很难在原装SoC外解密:
https://source.android.com/security/encryption/full-disk?hl=zh-cn#storing_the_encrypted_key
存储已加密的密钥
已加密的密钥存储在加密元数据中。硬件支持是通过使用可信执行环境 (TEE) 的签名功能实现的。以前在加密主密钥时,需要使用通过对用户的密码和存储的盐应用 scrypt 生成的密钥。为了使该密钥能够抵御盒外攻击,我们通过使用存储的 TEE 密钥为生成的密钥签名,扩展了这种算法。然后,通过再次应用 scrypt,生成的签名会转变成具有适当长度的密钥。该密钥随后会用于加密和解密主密钥。