安卓手机应用软件远程代码执行典型漏洞利用方法分析*
2021-12-23邱勇杰叶益林
陈 忱,邱勇杰,白 冰,叶益林
(智能感知与信息处理实验室,北京 100094)
0 引言
在智能手机操作系统领域,随着诺基亚的塞班系统、微软的Windows Phone 系统、黑莓的RMI 系统等相继退出,Android 与iOS 当前几乎已成为全球智能手机操作系统仅存的两种类型,其中安卓操作系统更是超过了83%的占比[1]。与之相应,安卓应用软件市场Google Play 中包含的软件数量在2020 年底已超过300 万个[2],并且几乎每年以数十万级的数量增长。在如此迅猛的增长态势下,安卓系统应用安全已然成为无法忽视的问题。开放式Web 应用程序安全项目(Open Web Application Security Project,OWASP)将安卓系统应用程序分为了3 大类,分别为原生应用、网页应用与混合应用[3]。根据其权威统计,其3 类软件架构主要面临如客户端注入、敏感信息泄露、不安全的数据存储、错误的身份认证与授权管理不充足的传输层保护等10 项安全隐患。本文重点关注在OWASP 所列举的安全隐患基础上,所形成的应用软件远程代码执行(Remote Code Execution,RCE)威胁。针对当前几种可形成远程代码执行能力的典型安卓应用软件漏洞,分析了其漏洞成因与利用方法。
1 非近源远程代码执行漏洞
非近源远程代码执行漏洞的含义是攻击者无需在攻击目标附近便可实施攻击。此类攻击在移动终端操作系统中较为常见。诺基亚塞班系统手机、早期的苹果iOS 系统手机与安卓系统手机,时常会有通过发送经特殊编码的短信或附带畸形媒体文件的彩信实现漏洞触发,进而控制目标用户手机的报道。虽然上述攻击的入口点为短信类的应用软件,但通常情况下用于完成实际攻击功能的漏洞一般存在于基带驱动、底层服务、核心组件等系统级模块,通过堆栈溢出、释放后使用(Use After Free,UAF)等二进制层面进行利用。但近几年,随着应用软件所提供的功能愈加丰富,仅存在于应用软件层面的漏洞也同样可达到此类效果,以下分别进行介绍。
1.1 应用软件Web 接口攻击
为了方便用户的使用,安卓系统提供了通过点击浏览器网页中的链接,即可自动调出某个已安装应用软件界面的方法。例如,Google 地图可在用户点击网页版GOOGLE MAP 的相关功能时,自动切换到Google 地图的手机应用软件,无需用户手动干预。能够实现此功能主要归功于安卓操作系统中的Intent 数据传递与共享机制。一个Intent 对象可包含用户希望启动的程序组件,同时可附带相应的附加信息。如果一个应用软件通过Manifest 文件定义了自身某个Activity 包含BROWSABLE 属性,那么该Activity 便可以通过点击网页链接的方式进行启动调出。因此,此类开发技术多应用于网页App 与混合App 中。
通常情况下,可通过Intent 超链接调用的Activity组件利用WebView控件展示一个网页界面。该界面效果完全由网页的HTML、CSS、Javascript等脚本代码渲染生成,而非通过应用软件本地的Java 或Kotlin 代码实现。这样做有两个优点:一是应用软件开发者可给用户带来网页与应用无缝衔接的效果;二是界面展示效果实际是在服务器端完成,开发者可随时根据用户的应用习惯或使用偏好修改界面展示效果。然而,此功能在方便用户使用的同时也引入了网页应用注入(Web-to-App Inject)攻击风险。具体说,就是应用软件开发人员在接收到网页传来的URI 数据时未考虑进行安全过滤,导致执行外部传入的恶意Intent 调用。它的攻击原理与SQL 注入、跨站攻击等情形类似。
通常完成完整的网页应用注入攻击包含3 个重要步骤:第1 步攻击者首选通过应用软件逆向分析,确定当前软件是否存在接收URI 类Intent,并利用WebView 控件解析展示网页的操作,一旦确定则可通过构造特殊的超链接隐蔽调用对应的Activity界面;第2 步通过Intent 参数诱导应用软件中的WebView 控件加载攻击者搭建的服务器中的网页;第3 步WebView 控件加载攻击者网页后,会加载页面中的Javascript 代码,由于攻击者事先对应用软件进行了逆向分析,因此会通过Java 反射机制得到Runtime 对象,从而可调用有本地文件访问权限的静态方法,从而获取到文件内容[4],最终导致用户手机敏感数据的泄露。完整流程如图1 所示。
图1 网页应用注入攻击流程
LUO T B 等人的研究中详细阐述了通过网页App 与混合App 实现Web 接口攻击的方法,并对相关方法进行了威胁模型建模。其中:对网页类App总结了沙盒穿透、框架混淆两种威胁模型;对混合类App 总结出了JavaScript 代码植入、Webview 事件劫持等威胁模型[5]。JIN X 等人分析了实现Web接口攻击可利用外部与内部渠道。对于外部渠道,JIN X 列举了短信、无线射频识别(Radio Frequency Identification,RFID)标签、二维码扫描等“手机专有渠道”,以及图片、音频、视频等包含元数据多媒体文件的“元数据攻击渠道”,同时针对真实的应用软件pic2shop,完整实现了通过pic2shop 扫描生成的恶意二维码隐蔽获取目标手机定位信息的功能[6]。BEHNAZ H 等人在LUO T B 与JIN X 的研究基础上,将Web 接口攻击进行了更加细致的划分,归类出如HTML 5 API 接口滥用、本地文件包含、钓鱼欺骗、APP 数据库注入以及持久化存储篡改等多个方面,同时设计了一种利用污点分析、控制流视图提炼、符号执行等方法检测应用软件Web 接口攻击的专用工具[7]。
1.2 社交软件远程执行漏洞
在安卓操作系统中,社交软件通常需要对不同格式的媒体文件进行解析,一般包含针对GIF、JPEG、MP4、AVI 以及MP3 等多种不同种类的媒体解析开源共享库。此类开源库为保证解析效率,基本以C/C++等原生代码形式开发,不可避免会存在堆溢出、释放后引用等类型的漏洞。一旦攻击者获取到此类漏洞的利用方法,便可利用漏洞修复与补丁下发期间的窗口期对目标手机实施攻击。
此类攻击具体实施时,根据不同的漏洞载体与所触发的对应软件,会在利用细节上有各自的区别,但大体分为如下3 个步骤。第1 步攻击者需要构造出可触发目标手机特定软件漏洞的载体文件,并将此载体文件通过彩信、邮件、社交软件,甚至钓鱼网站的方式发送到目标手机中。例如,著名的CVE-2019-11932 漏洞,攻击者可通过任意渠道向安装有2.19.244 版本Whatsapp 软件的手机发送特殊构造的GIF 文件。当目标用户保存此图片并在下次通过Whatsapp 的图片预览控件浏览待发送的图片时,会自动触发漏洞,并执行存储在GIF 文件中的Shellcode 代码[8]。第2 步漏洞触发后执行的Shellcode 代码向攻击者反弹远程Shell,或下载并加载原生库层的漏洞代码实现“寄生”于漏洞触发软件内的木马模块。第3 步则是通过获取的访问权限收集敏感数据,并将数据上传到指定服务器。
图2 应用软件二进制RCE 攻击流程
1.3 浏览器二进制远程代码执行漏洞
浏览器二进制远程代码执行漏洞的外部攻击渠道与应用软件Web 接口漏洞类似,均需要攻击者通过短信、社交软件、邮件等方式,发送带有恶意链接的信息,诱导目标进行点击,在加载恶意链接对应网页的过程中,实现代码植入执行。两者的不同在于内部漏洞的利用方式上,相对于应用软件Web接口漏洞利用,浏览器二进制远程代码执行漏洞利用主要目标通过Webview 组件实现沙盒逃逸,从而获取更高程序执行权限。具体攻击流程如图3 所示。
图3 浏览器二进制漏洞攻击利用流程
对于安卓手机浏览器二进制类型的漏洞来说,重点是获取内存地址的完整控制能力。一般利用的漏洞为释放后使用(Use After Free,UAF)、越界地址访问等类型,此类漏洞的原因一般由“指针悬挂”[9]、整型溢出等问题导致,漏洞的出现位置一般在WebView 组件中。在每年举办的各类黑客挑战比赛、信息安全大会中,相关漏洞向来是最为引人瞩目的一类,表1 对近年来的安卓手机浏览器漏洞进行了简单的统计。
表1 黑客挑战赛浏览器二进制漏洞统计
同时,此类漏洞也是各国顶级黑客公司、地下黑产、网络武器供应商所争相获取的一类。在2015年7 月,世界著名的黑客公司HackingTeam 泄露出了415 GB左右的文件资料,包含了大量的内部邮件、收据与网络攻击武器源代码,其中就存在一个针对安卓4.0-4.3 版本原生浏览器的攻击工具,在目标用户浏览恶意网页时,可完成手机的ROOT 提权并自动下载安装HackingTeam 公司的木马程序,实现对目标手机的持久化控制[10]。
1.4 非近源远程攻击总结
本节针对上述提到的3 种不同类型的应用软件漏洞,在攻击渠道、具体能力、实现难度等方面进行了总结,具体见表2。
表2 非近源远程攻击总结
根据表2 可以看出,基于应用软件Web 接口漏洞的攻击相对其他两种漏洞利用的攻击渠道更广,且利用难度较低,在现实环境中普遍存在类似漏洞。
2 近源远程代码执行漏洞
近源远程代码执行漏洞的含义是攻击者必须能够抵近目标手机用户,与其处于相同的Wi-Fi 网络或3G/4G 基站信号覆盖范围内,通过热点或基站伪造实现网络流量劫持,从而达到中间人攻击的效果。由于劫持网络流量后可以操控目标手机与网络出口间的网络数据包,因此近源远程代码执漏洞一般与软件升级相关,攻击者通过篡改应用软件正常的升级方式触发漏洞,从而完成恶意程序的植入。此类漏洞共分为有感知升级漏洞利用和无感知升级漏洞利用两种类型。
2.1 有感知软件升级漏洞利用
有感知升级顾名思义是在升级过程中需要与手机用户进行交互,由用户选择是否安装当前的升级版本。此种方式进行升级的App 软件通常会向服务器发送JSON 或XML 格式的请求查询包询问当前是否有更新版本,若存在服务器会返回新版本的详细信息,同时客户端软件会弹出升级提示,询问用户是否进行版本升级。若用户点击确定,软件会从服务器下载完整的App 更新包,并在下载完成后自动进行覆盖安装。在实际测试过程中,笔者发现多款具备一定用户使用量的App 在与服务器进行交互的过程中,存在有部分流量未使用HTTPS 协议进行传输的情况,加之在安装升级包时未进行签名验证,最终导致攻击者可通过伪造升级服务器的方式使目标手机的漏洞软件主动弹出升级提示。当手机用户点击确定升级时,会安装攻击者服务器内的恶意应用程序。主要流程如图4 所示。
图4 有感知升级伪造漏洞利用流程
在图4 中,攻击者通过中间人攻击截获了目标手机与对应互联网出口(Wi-Fi 路由器或基站)间的全流量数据。由于某存在漏洞的应用软件在升级过程没有进行基于HTTPS 协议的加密传输,攻击者可以轻易识别出存在于流量中的软件版本查询请求(一般为GET 请求)。此时,攻击者可将此查询请求过滤掉,并向目标手机发送伪造的升级包[11],如图5 所示。
图5 伪造升级响应数据包
图5 显示的JSON 响应包中:VersionName 代表伪造升级的软件更新版本;ForceUpdate 参数为Ture,表示要求用户强制升级(针对具体的应用软件,有的应用软件不会要求用户强制升级);而后面的URL 参数则指示了升级安装包的地址,此时已被攻击者替换成伪造的升级包地址。在目标手机端的漏洞应用软件则会弹出更新提示,一旦用户选择更新,则会下载伪造的升级安装包并自动进行安装。应用软件的升级提示界面,如图6 所示。
图6 应用软件升级提示
2.2 无感知软件升级漏洞利用
无感知软件升级又称为软件“热补丁”技术,目前在Android 系统应用软件开发中已十分普及。该技术能够在无需重新安装软件的情况下实现更新,帮助应用软件快速建立动态修复能力。在整个升级过程中用户无需像有感升级一样重新进行软件包安装,只要上线就能无感知更新,因此应用“热补丁”技术可节省Android 系统大量应用软件市场发布的时间[12]。由于不需要进行安装,更新过程中仅下载的插件化的jar 包或so 动态连接库文件即可。在此种情况下,若在程序组件更新的过程中未对插件或动态链接库文件进行认证校验,则可在中间人攻击的条件下,将jar 插件或so 动态连接库文件替换成攻击者的木马模块,实现木马模块的加载执行。在木马模块被加载后会自动继承漏洞应用软件已申请的权限,因此无感知软件升级漏洞通常攻击的成功率更高。
下面分析笔者测试发现的某一国内知名社交软件的类似热补丁的漏洞,每次此社交软件被用户启动后会自动向远程服务器发送插件热更新请求:
其中:cmd=51 是命令类型,这里是插件更新请求命令;so_name 参数是询问具体插件是否有更新版本。
当服务器接收到请求后会返回响应数据包:
响应数据包中包含该次请求结果版本号(c_so_update_ver)、md5 校验值(c_so_md5)与新版本so 库的下载地址(c_so_url)。应用软件提取c_so_url 参数并将md5 代入校验,向服务器请求下载TxxxPlugin_12322.zip,完成下载后会将zip 包放置到本地沙盒目录/data/data/com.xxxxx.xxx/files 下并解压,随后应用软件会将压缩包内的某一so 库加载。根据分析流程可知,攻击者只要替换zip 包中的特定so 库,通过Java 反射机制加载调用安卓系统中GPS、媒体、网络等服务,便可完成木马模块的基本功能。
2016 年2 月,著名的CitizenLab 发现了国内安卓系统百度浏览器的一枚漏洞。该漏洞产生的主要原因在于百度地图某个代码模块在网络传输时未经过TLS 协议加密,攻击可通过中间人方式进行流量截获,同时模块升级加载时也未进行有效的签名认证[13]。
在HYUNWOO C 等人对安卓应用软件实现远程代码植入的研究中,除了上述以代码包方式升级,解压后直接进行模块加载的情况外,同时提到了在安卓应用软件资源包(图片、音视频等非代码组件)升级过程中动态资源更新(Dynamic Resource Update,DRU)。由于软件开发者对传入资源包解压代码的文件路径参数未进行必要的安全检查过滤(检测字符串参数是否包含“../”等非法字符组合),导致攻击者可利用目录穿越漏洞实现本应用软件沙盒目录下任意文件覆盖。若覆盖的是.SO 或.JAR等动态加载模块文件,则可实现远程代码注入的攻击[14],伪代码如下:
2015 年,国外安全研究人员rotlogix 发现了国内海豚浏览器与水星浏览器的两枚目录穿越漏洞,可实现远程代码植入执行[15]。
在Sebastian Poeplau 等人的研究中,分别从Class Loader、Package Context、Native Code、Runtime.exec 等方面深入分析安卓应用软件中所有可实现动态加载代码的渠道,同时提出并实现了一种改进的Dalvik VM 虚拟机方案,可以有效阻止针对应用软件非授权外部代码、模块的加载运行[16]。
2.3 近源远程攻击总结
本节针对提到的针对安卓应用软件近源远程攻击中有感知与无感知两种类型,在攻击渠道、具体能力以及实现难度等方面进行总结,具体见表3。
表3 近源远程攻击总结
可以看出,有感植入与无感植入的明显区别在于:有感植入要完整安装APK,因此需要让目标用户手动进行权限授予;无感植入利用应用软件的动态代码加载机制加载木马so 或jar 包模块,可直接继承原应用软件的权限。
3 结语
本文从非近源与近源两个方面,通过阐述不同种类远程代码执行(RCE)漏洞产生的原因与基本利用流程,详细分析当前安卓操作系统应用软件可能存在的相关威胁,同时在整个分析流程中简要介绍针对每种威胁国内外的研究现状。通过分析认为,随着安卓操作系统的不断迭代升级,安全性也在不断提升,应用软件不应成为安卓系统的整个安全防护体系中的短板。这需要每名应用软件开发者不断提升代码安全防护意识,具备必要的开发技能,建立更加安全的安卓系统生态环境。