Android应用的白盒加密

0x00 移动端存储的痛点

在业务中,我们可能需要面对在 Android 本地存储密钥、用户 token、email 等敏感数据。而APP对外暴露的,里面的敏感信息容易被逆向获取。

常见的几种密钥不安全存储的方式:

  • 1、密钥直接硬编码在Java代码中,很容易被逆向成java代码。
  • 2、密钥直接明文存在私有目录的sharedprefs文件中,root机器很容易就导出查看。
  • 3、将密钥分成不同的几段,有的存储在文件中、有的存储在代码中,最后将他们拼接起来,可以将整个操作写的很复杂,这因为还是在java层,逆向者只要花点时间,也很容易被逆向。
  • 4、用ndk开发,将密钥放在so文件,加密解密操作都在so文件里,这从一定程度上提高了的安全性,挡住了一些逆向者,但是有经验的逆向者还是会使用IDA破解的。
  • 5、在so文件中不存储密钥,so文件中对密钥进行加解密操作,将密钥加密后的密钥命名为其他普通文件,存放在assets目录下或者其他目录下,接着在so文件里面添加无关代码(花指令),虽然可以增加静态分析难度,但是可以使用动态调式的方法,追踪加密解密函数,也可以查找到密钥内容。

0x01 如何解决密钥安全存储这个问题呢?

首先Android自身是提供了秘钥库系统的:

Android 系统有安全机制Keystore 可以保护密钥材料免遭未经授权的使用。
https://developer.android.com/training/articles/keystore.html?hl=zh-cn

高版本的硬件安全模块TEE
运行 Android 9(API 级别 28)或更高版本的受支持设备可拥有StrongBox Keymaster,它是位于硬件安全模块中的 Keymaster HAL 的一种实现。包含以下组成部分:

  • 自己的 CPU。
  • 安全存储空间。
  • 真实随机数生成器。
  • 可抵御软件包篡改和未经授权旁加载应用的附加机制。

硬件加密破解强度高,且支持算法种类多。

但是低版本的Android Keystore有明显的不足之出:
在 Android 4.3(API 级别 18)中引入的 AndroidKeyStore 提供程序。调用的API有KeyStore 和 KeyPairGenerator 或 KeyGenerator 类等。但是支持的算法种类偏少。KeyStoreEncryDemo :demohttps://github.com/zhibuyu/KeyStoreEncryDemo

在这里插入图片描述
而且此种安全机制密钥文件还是存储在/data/misc/keystore/user_0/目录下。
在这里插入图片描述
当攻击者有root权限的时候,可通过cp,chown命令复制其他APP的密钥,只需要把UID改成自己APP的UID,就可以盗用其他APP的密钥了。
案例见:利用root权限盗用AndroidKeystore中其他APP的密钥:https://bbs.pediy.com/thread-222890.htm

业内最佳解决方案
由于Android Keystore支持算法相对较少,且无法对低版本的Android·设备进行降级支持,所以在业务的使用中无法直接使用。
而在对外业务上存储密钥暴露的这个问题基本无解,所以一般公司常选择白盒加密配合加固和OLLVM混淆等方案提升攻击者的逆向成本。

0x02 白盒加密简介

白盒加密技术的核心思想是把秘钥隐藏起来, 加密执行过程中, 内存中不会出现秘钥的值. 现在通用的技术是查找表技术, 即把秘钥隐藏在查找表中。

https://blog.quarkslab.com/differential-fault-analysis-on-white-box-aes-implementations.html

白盒加密原理分析

案例

https://github.com/msotoodeh/WhiteBoxCrypto/blob/master/README.md

https://blog.quarkslab.com/when-sidechannelmarvels-meet-lief.html

对抗破解

https://bbs.pediy.com/thread-254042.htm

安全建议

对于体量小的企业:
攻击者关注度使用开源的

对于业务高速发展且对安全需求强度较大的业务
采购第三方的加固SDK对业务进行保护,同时培养RD安全加密的开发

其中的安全加密功能提供了开发者密钥的安全管理与加密算法实现,保证密钥的安全性,实现安全的加解密操作。同时从应用层、运行层、native层提供多层次全方位立体防护,还有安全沙箱、白盒加密、底层加固共同保证客户端数据安全。攻防是不断变化演进的,它能实时更新客户端模块保证攻防对抗强度。

参考:

https://www.zhihu.com/question/35136485/answer/84491440
Android 纯本地安全存储方案:https://richardcao.me/2019/03/14/Android-Local-Security-Storage/
android自身提供的秘钥库系统
https://androidvulnerabilities.org/all