HarmonyOS Next 应用加密 安全性分析
HarmonyOS Next支持应用加密,本文尝试分析其安全实现.
Android 加固回顾
在我们熟悉的Android生态中,APK较容易被逆向分析,查看反编译代码. 不少应用为了所谓的“安全性”,通常采用加固/加壳手段,尝试保护自己的代码“不被人看到”.
实际上,客户端程序运行在终端,一定会释放到内存中,而且APK基本不挑设备,什么模拟器、root的设备都可以运行,所以我们看到脱壳方案层出不穷,加固厂商也在不断提升加固手段,运行环境安全性检测,一代二代三代壳、VMP、Java2C,各种新的加固技术也在不断迭代.
也就是说,应用程序如果将自己的安全性,完全寄托在这层壳上,将是巨大的安全隐患,因为这层壳一旦被脱掉,程序将被一览无遗,,,这层壳,不过就是皇帝的新衣罢了. 而且,加固可能对应用带来崩溃、兼容性、性能等负面影响. 对于安全要求较高、纵深防御的应用来说,首先要假设的,便是客户端代码、算法完全暴露在攻击者面前,然后通过安全方案设计,提升应用安全性.
不过话又说回来,加固确实能提升应用程序的逆向难度,挡住不少刚入门的新手,所以,这个猫鼠游戏,还在不断进行.
HarmonyOS Next 应用加密
官网资料
我们从华为开发者官网,可以看到应用加密章节.
为了保护应用代码安全,保护开发者的核心资产,HarmonyOS提供了端到端的应用代码保护机制,该机制以系统安全为基础,构建内核级应用生命周期内的代码安全保护能力.
开发者向应用市场提交上架申请,上传应用包后可选择是否加密.
选择加密的应用,在经过应用市场审核后,应用市场会对上架应用做代码加密.
应用在设备上安装时,安装文件落盘后仍是处于加密状态,有效的保护应用程序;
当应用程序启动时,通过内核加载的应用文件是加密状态,因此这些文件会在内核中按需解密执行.应用加密采用标准AES加密算法,解密后的明文只存在于内存中,不会存储到设备,形成端到端的加密方案,有效的保障应用程序的安全性.
系统级应用加密具有如下优点:
- 应用端到端加密,应用启动后在内核内按需解密执行.
- 系统级的解密优化,相对于传统加壳等加固方式对性能的影响更小.
- 解密密钥经过安全传输后存储在系统TEE环境中,更加安全.
加密效果:
加密对象为应用内编译后的代码文件,覆盖.abc文件,加密前的代码文件可被反编译,加密后的代码文件不可被分析,保障应用代码防逆向分析、防破解.
个人理解
总结下来,华为为应用提供了一套系统级的加固方案:
- 应用可选加密.
- 覆盖.abc文件(JS/TS/ArkTS代码,通过方舟编译器,编译为方舟字节码,存放在abc格式的文件中;类比Android apk的Java/Kotlin代码——>dalvik字节码——>dex文件).
- 加密算法AES.
- 下载、落盘的abc文件是密文.
- 解密密钥经过安全传输,存储在TEE安全环境.
- 解密过程发生在内核(指鸿蒙/Linux内核?还是指代方舟运行时?).
- abc明文只存在内存中.
我们可以理解为,这套方案的安全性,依赖于系统的安全性(提权可dump内存、CA可被调用)、TEE环境的安全性(存储明文密钥).
由于解密能力并没有开源到OpenHarmony,目前也没有非华为设备运行HarmonyOS Next(OpenHarmony+HMS),而且华为新的设备并没有开放解锁BootLoader,因此在当前HarmonyOS Next发布初期这个节点,对应用加密逻辑的分析难度直接buff叠满.
而且,我个人认为,这套方案,极其依赖HarmonyOS Next的生态的封闭性:
- 商店上架的加密应用,将和商店绑定,密钥需通过HarmonyOS Next应用商店与HarmonyOS Next的TEE环境端到端安全传输,OpenHarmony并没有开源相应能力,因此无法侧载到OpenHarmony;
- 应用如果上架到其他无加密的应用商店、或者在官网提供OpenHarmony安装包,那么HarmonyOS Next应用商店的加密将被绕过;
- 希望共享HarmonyOS Next应用生态的厂商,需接入封闭的HMS、并实现与华为终端相同的TEE、加密内核等能力.
同AOSP&GMS类似,接入GMS的应用无法在AOSP运行,AOSP的应用可以在GMS设备运行.
OpenHarmony的生态共享,也是单向的,OpenHarmony的应用,可以通过开发者签名侧载到HarmonyOS Next的设备(或上架商店安装),而接入HMS的应用、接入应用商店加密的应用,无法在OpenHarmony运行.
分析
获取固件
我们通过抓包,不难获取到HarmonyOS Next的固件包,其中主要分析update_full_base.zip这个包.
1 | Mate60 NEXT.0.0.71 beta1 |
解包方法也不难.
1 | //下载解包工具 |
我们通过mount命令,便能看到system中的内容
1 | //创建system目录,用于挂载 |
抓包
我们通过对应用商店抓包,了解到一些很有意思的信息(已移除部分无用信息):
按照通常理解,应用有包名、版本号等信息,而在应用商店,应用还有一个很关键的信息,叫做appoid.
从fetchHarmonyFiles获取下载地址的接口 https://store-drcn.hispace.dbankcloud.cn/hwmarket/harmony/client?method=client.fetchHarmonyFiles&ts=
,可以拿到如下响应:
1 | { |
这个appoid将参与很重要的两个网络请求:
getCloudChallengehttps://store-drcn.hispace.dbankcloud.cn/hwmarket/harmony/client?method=client.getCloudChallenge&ts=
1 | { |
拿到成功的响应,会携带cloudChallenge
1 | { |
紧接着的getNegotiationKey请求,就更有意思了,携带了上一个请求拿到的cloudChallenge,来自服务端的挑战,以及设备公钥,设备证书链,签名:https://store-drcn.hispace.dbankcloud.cn/hwmarket/harmony/client?method=client.getNegotiationKey&ts=
1 | { |
这是在干什么呢?通常来说,这是服务端在挑战客户端,发起客户端的设备证明,要求客户端证明自己的合法性,才会吐一些敏感数据回客户端. 经过服务端的一系列验证,拿到如下响应:
1 | { |
这里的appSecretMetaList、secretMetaInfo,不难猜测,这个信息是应用核心的秘密信息,而cloudPubKey,顾名思义,是服务端的公钥,那encMessage呢,自然而然,则是服务端传给客户端的核心加密数据. 根据我的猜测,可能有着服务端的签名(通过cloudPubKey验签,防篡改),以及与设备公钥关联的安全协议的加密.
而上述用法,实际上就是华为设备证书的设备真实性证明的标准用法,参考设备真实性证明能力简介.
逆向分析应用商店
目前网络上逆向abc(方舟字节码)的工具都还不太成熟,我找到了abcde和基于JADX的abc-decompiler.
由于比较熟悉jadx,所以使用abc-decompiler尝试反编译应用商店.
我们解压system/app/AppGallery/businesslib.hsp,拿到ets/modules.abc,拖到abc-decompiler工具中:
我们跟踪上面的两个请求,发现相关代码:
com.huawei.hmsapp.appgallery.businesslib.ets.utils.DownloadManager.keynegotiation.server.utils.StoreUtils
com.huawei.hmsapp.appgallery.businesslib.ets.utils.DownloadManager.keynegotiation.tasks.keyNegotiationTask
这里会调进NegotiationProxy
com.huawei.hmsapp.appgallery.businesslib.ets.utils.DownloadManager.keynegotiation.proxy.NegotiationProxy
NegotiationProxy这里面很明显是Binder进程间通信,获取”@hms:security.codeProtect”系统服务,调用对应的接口.
难怪,这个security.codeProtect服务属于HMS,不属于OpenHarmony. 这个服务的实现位于
1 | //服务实现 |
从上面的分析来看,基本符合华为开发者官网的表述.
整个密钥的下载过程,用到基于设备证书的设备真实性证明,提供基础的设备安全性保障.
从服务端与APP通信,APP调用hms的security.codeProtect的API,通过binder Proxy,调用到codeprotect的service,再到codeprotect的ca,codeprotect的ta,由此,服务端与TEE建立端到端的安全通信链路.
其他
本文通过常规的技术手段对HarmonyOS进行安全性分析,仅为纯技术探讨,目前的分析也无实质性进展,如果有侵犯您的权益,请联系删除.
希望上面的内容能帮助感兴趣的同学,并且可以开展进一步的安全性分析,欢迎一起进行安全技术探讨.