当前位置:首页 期刊杂志

移动智能终端安全漏洞攻防技术综述

时间:2024-05-04

倪昀泽

【摘 要】为了研究移动智能终端安全漏洞攻防技术,通过对近年披露的移动智能终端的安全漏洞及利用方法进行分析,将安全漏洞按照触发原理进行了分类总结,同时,阐述了最新的漏洞利用缓解机制并指出其不足,通过分析得知,安全漏洞的攻防技术相互促进发展,使攻击的难度不断提升。

【关键词】信息安全 移动智能终端 安全漏洞

1 引言

随着移动互联网技术及业务的发展,在终端业务用户需求的驱动下,移动终端的功能日渐丰富,从传统的语音电话、短信,到拍照、电子邮件、定位服务、网页浏览,再到能够安装第三方应用的智能终端及移动支付,功能的增多、应用的丰富增加了用户多维度的个人信息在终端的录入和存储,个人的信息安全也更加依赖于终端的安全。同时,伴随着终端系统和应用代码量的增加,引入的攻击面和漏洞数量也随之增加。Pegasus、Vault 7等间谍工具和文件的曝光,使无论iOS还是Android平台的智能终端信息安全形势更加严峻。另一方面,终端厂商等防御方也在不断努力减少漏洞,同时增强漏洞利用缓解机制。本文将就移动智能終端的安全漏洞进行分类研究,并阐述相应的漏洞利用缓解机制。

2 常见漏洞类型

从漏洞的触发原理分类,常见的软件漏洞类型有:栈溢出漏洞、堆溢出漏洞、格式化字符串漏洞、整数溢出漏洞、释放后重用漏洞、双重释放漏洞、逻辑设计类漏洞、类型混淆漏洞等。

2.1 栈缓冲区溢出漏洞

栈缓冲区溢出漏洞(SOF,Stack Buffer Overflow)是一类历史悠久的内存类破坏漏洞。SOF的原理比较简单,即栈上的缓冲区在拷贝数据时没有合理检查目的缓冲区的长度和源数据的长度,导致数据拷贝过程中,目的缓冲区之外的其它数据被覆盖,比较经典的利用方式是覆盖函数的返回地址、指针变量、SEH异常处理函数指针。早些年的时候,软件针对栈上的内存保护机制较少,且操作系统中的保护机制还不是很完善,栈缓冲区漏洞能够比较稳定地利用,当时,很多网络服务程序中存在的漏洞导致了蠕虫大量传播。表1展示了2002年至2008年间利用栈缓冲区漏洞攻击的重大安全事件。

目前,对栈返回地址攻击的栈溢出漏洞几乎已经消亡了,但是,利用栈上的其他结构溢出覆盖的攻击仍然存在。

2.2 堆缓冲区溢出漏洞

堆缓冲区溢出漏洞(HOF,Heap Buffer Overflow)与SOF原理类似,都是因为数据复制拷贝时没有对其长度及范围进行充分检查造成的。但是因为堆上的数据结构相对灵活,且堆上的内存分配、释放、回收等问题相对栈上要更复杂,很多程序都对堆进行了单独优化,因此堆溢出与栈溢出相比利用技术更多、更复杂。因此,堆上的内存攻防仍是目前研究的热点。

2.3 整数溢出漏洞

整数是在包括C\C++\JAVA等语言中最常见的数据类型,常见的变量类型,如short、unsigned short、int、unsigned int等都可能发生整数溢出。因为一个整数变量在内存中是以固定的长度存储的,所以它能存储的数据范围也是有限的。如x86_32架构Windows操作系统中的int所占内存大小为4子节,数据范围是区间[-2147483648, 2147483647]内的所有整数。当对整数进行一次或多次加减乘除等操作而没有考虑数据范围,将可能会导致整数溢出。因为在目前主流编译器遵循的ISOC99标准中规定,整数溢出将会产生“不能确定的行为”,所以,整数溢出是会被编译器忽略的,并且在运行时也不会抛出异常,而且由于整数溢出不符合人类的自然认知,所以这类漏洞较为隐蔽并时常发生。之前,Android曝出很多stagefright的漏洞大多是整数溢出漏洞。

本文总结了四类可能导致整数溢出漏洞的整数操作:

(1)无符号的整数溢出:在操作无符号整数时没有充分考虑其数据范围。

(2)有符号数的整数溢出:操作有符号数时没有考虑他的最大值,导致变量溢出为负数,如果该变量被用于数组索引,肯定会造成一个非常严重的漏洞。

(3)数据截断与扩展:把一个占用内存较大的数据赋值给一个占用内存较小的数据时,会发生内存截断,如int型变量赋值给short型变量;同理,把一个占用内存较小的数据赋值给一个占用内存较小的数据时,会发生数据扩展,如short型变量赋值给int型变量。

(4)有符号与无符号转换问题:在数值比较时,不同的数据类型会转换为相同的数据类型,很多程序漏洞就是因为没有考虑这个转化造成的。

2.4 格式化字符串漏洞

格式化字符串漏洞的成因为:将变量字符数组作为格式化字符串处理函数的格式参数传入。常用的格式化字符串函数有:fprintf、sprint、snprintf、vprintf、vfprintf等,以sprintf函数为例,在C99以前的标准中定义为:

int sprintf(char *buffer, const char *format, ... );

第一个参数是存储格式化后的字符串的目的缓冲区;第二个参数format就是格式化字符串,根据格式化字符串参数的内容,可能还会有一些其它的具体参数。一旦format参数被攻击者控制,通过指定其为%p%p%p%p…的越界,从栈中读取数据,指定…%n…可以向任意一个指定位置写入可控数据。所以,格式化字符串漏洞可以导致任意内存数据读写,是非常严重的漏洞。并且,在POSIX标准下,格式化字符串可以通过n$的形式来指定出第n个参数读写数据,大大便利了格式化字符串漏洞的利用。另外,针对sprintf函数,可能有format参数没有检查最大可能的字符串长度,导致buffer缓冲区溢出漏洞。值得注意的是,在C99以后的标准中,格式化字符串函数参数被添加了关键子restrict,同样以sprintf为例:

int sprintf(char *restrict buffer,

const char *restrict format, ... );

一个比较著名的格式化字符串漏洞是CVE-2000-0442,是Qualcomm Qpopper格式化字符串处理的一个远程溢出漏洞。

2.5 释放后重用漏洞

释放后重用漏洞(UAF,Use After Free)是目前比较主流的一类漏洞,可以从Apple、Google等公司每月的安全漏洞公告中看出,该类漏洞相对而言数量较多。造成UAF漏洞的原因是对象在内存被释放后,仍然有指向其它的指针或应用计数器没有及时更新,对象却被意外地再次引用操作造成漏洞触发,在对象释放和重用过程中,如果能将可控的数据在对象原有的位置上占位,则可通过控制对象的虚表劫持控制流;不能完全占位则采用一些其它适当的漏洞利用技术,也可能将漏洞转换为可利用的高危漏洞。

2.6 类型混淆漏洞

类型混淆漏洞(TC,Type Confusion)是指程序本來处理的对象类型和实际处理对象类型发生混淆所导致的漏洞,没有对输入对应的操作对象适时地进行合法检查是该类漏洞发生的根源。该类漏洞在移动终端出现也比较多,多发生在序列、反序列化过程中,比如Android Binder的CVE-2014-7911漏洞。

2.7 竞争条件漏洞

竞争条件漏洞(RC,Race Condition)是指在多个处理过程(一般多是多线程或多进程)的情况下,没有合理安排共享资源的处理顺序所引发的漏洞,攻击者可以通过多次竞争来达到恰当的期望的攻击状态。由于竞争时机问题,这类漏洞通过Fuzzing模糊测试和代码审计发现的数量都比较有限,所以也是近年比较热门的一类漏洞,2016年,Android及Linux内核的两个通用权限提升漏洞CVE-2015-1805和DirtyCow都是竞争条件漏洞。

2.8 逻辑设计漏洞

逻辑设计类漏洞大多是在软件在设计、实现过程中没有考虑安全问题而出现的设计、逻辑方面的漏洞。例举如下两个直观的例子:

如CVE-2014-0773,直接在ActiveX控件中实现了一个名为CreateProcess的方法,可以直接调用这个方法创建进程,构造一个很简单的攻击页面就可以通过这个漏洞攻破计算机。

再如Windows Media Center的CVE-2015-2509漏洞,其POC非常简单,只有下面一行代码:

将这行代码存为.mcl扩展的文件类型,即Media Center link文件,然后用Windows Media Center直接打开就弹出一个计算器(一种常用于证明漏洞可执行任意代码的方式)。

3 漏洞利用缓解技术

减少漏洞威胁主要有两种途径:一是主动挖掘漏洞来减少产品中的漏洞数量;另外是增加增强漏洞利用缓解机制,根据漏洞的特性和漏洞利用的方法,在漏洞利用途径上进行阻断,多种缓解技术的组合可以使大量的漏洞无法利用。

3.1 DEP和ASLR机制

数据执行保护(DEP,Data Execution Prevention)在Linux系统上也称为NX(No-eXecute),在内存页属性中引入是否可执行标志来决定该段内存是否能够执行代码,一般将数据区域设置为不可执行,可有效防止攻击者在可控的数据区域执行代码。然而,单纯的DEP防护可以利用ROP(Return Orient Program)、JOP(Jump Orient Program)等间接执行代码的方式绕过。与DEP相似的一个技术是PXN(Privileged Execute Never),即阻止内核态直接执行攻击者在用户态构造好的代码,可以有效增加攻击者编写利用代码的难度。

空间地址随机化(ASLR,Address Space Layout Randomization)将运行的可执行文件、加载库、堆栈等地址随机化,PIE(Position Independent Executable)与PIC(Position Independent Code)是该技术对可执行文件和加载库的实现。有了ASLR这种机制,攻击者即使劫持程序控制寄存器,也无法知道接下来要执行代码的位置。然而,单纯的ASLR防护还是可以通过没有实现随机化的段及堆喷射等技术绕过。ASLR技术在移动智能终端的应用比较漫长,苹果在2011年的iOS 5中引入用户态的ASLR,2012年的iOS 6中引入内核态的ASLR;Android在2011年的4.0版本引入用户态ASLR,而内核态的ASLR由于不同终端设备生产厂商采取的策略不同而进展缓慢。

同时采用DEP和ASLR的防御策略可以防御大部分漏洞利用方法,但是攻击者并非对此无计可施,利用一个内存信息泄漏漏洞来绕过ASLR后,再组合其他的漏洞进行攻击就是一种通用的方法。

3.2 校验机制

早期SOF这类漏洞的防御机制,如GS cookie是在函数栈的返回地址之前加入一个校验位的cookie,用来检测返回地址是否被缓冲区溢出覆盖,这种技术之后被一些厂商演化为给数组的长度加cookie检测数组长度是否被篡改、给一些安全标志位加cookie等。此外,还有如RenewSSP(Prevent SSP Brute Force Attacks)这样的技术来防御逐字节暴力破解Apache等网络服务及Android Zygote这些相同cookie的fork进程。

3.3 浏览器防护机制

作为互联网的重要入口,网页浏览器安全一直是关注的重点,各厂商都十分重视。而浏览器攻防技术一直都是研究的前沿领域。

UAF漏洞是瀏览器中非常普遍的漏洞,一直都是被挖掘的重点对象,只通过修补有漏洞的代码来提高浏览器的安全性显然不太可行。所以,相关厂商往往采用增加漏洞利用缓减机制的方法来降低漏洞被成功利用的可能性,从而降低其危害。从2013年开始,微软先后在其Windows浏览器中引入延迟释放、隔离堆、沙箱、EPM、MemGC等漏洞利用缓减机制和保护机制,很大程度地提高了浏览器的安全性;Google也早在其浏览器中引入了Address Sanitizer等防护机制。

此外,sanbox沙箱技术也被广泛应用到浏览器中。沙箱技术通过限制浏览器网页渲染、脚本执行进程权限,来降低漏洞被利用后的攻击者作恶的能力,可以有效降低用户终端风险,但是仍存在一些缺陷:如被沙箱隔离进程的交互过程中的一些漏洞可以绕过沙箱的限制,沙箱内进程对一些内核、驱动模块的访问仍然没有隔离。除了sandbox,Android系统还定制了一套selinux规则来对应用的行为行进限制。总体来说,基于隔离思想的防御机制可以有效增加攻击成本。

3.4 硬件防护技术

安全威胁和安全需求同时也在驱动着硬件厂商技术的发展,ARM TrustZone及SE/inSE等提供的硬件支撑为TEE(Trust Execution Environment)的发展铺平了道路,为敏感数据安全、可信计算提供了新的环境,然而,新功能同时也引入了新威胁,2016年黑客奥斯卡Pwnie Awards颁发的最佳提权漏洞就是由Widevine QSEE TrustZone驱动引入的。

ARMv8-A中新增的Pointer Authentication instructions特性也被高通用来开发Pointer Authentication技术保护内存中的指针,很难被黑客篡改。

4 结束语

各种安全漏洞是由人在编写代码等生产过程中的疏忽所造成的,由本文分析可知,新的漏洞利用缓解技术通过阻击漏洞利用的途径来降低漏洞的危害,但仍存在一些问题。随着攻击技术的发展,会出现新的攻击途径,而且随着信息系统的日趋复杂,将来一定会出现更多的漏洞。同时,随着攻防双方技术的不断升级,黑客利用漏洞攻击的难度也越来越大,移动智能终端安全保障在不断提升。

参考文献:

[1] Xu W, Li J, Shu J, et al. From Collision To Exploitation: Unleashing Use-After-Free Vulnerabilities in Linux Kernel[A]. Proceedings of the 22nd ACM SIGSAC Conference on Computer and Communications Security[C]. ACM, 2015: 414-425.

[2] Oehlert P. Violating assumptions with fuzzing[J]. IEEE Security & Privacy, 2005,3(2): 58-62.

[3] Sutton M, Greene A, Amini P. Fuzzing: brute force vulnerability discovery[M]. Pearson Education, 2007.

[4] Corbet J, Rubini A, Kroah-Hartman G. Linux device drivers[M]. O Reilly Media, Inc, 2005.

[5] Jones, Dave. Trinity: A system call fuzzer[A]. Proceedings of the 13th Ottawa Linux Symposium[C]. 2011.

[6] Cadar, Cristian. EXE: automatically generating inputs of death[A]. ACM Transactions on Information and System Security(TISSEC)[C]. 2008: 10.

[7] Vuagnoux, Martin. Autodafe: An act of software torture[A]. 22nd Chaos Communications Congress[C]. 2005.

[8] X Yang, Y Chen, E Eide, et al. Finding and understanding bugs in C compilers[A]. ACM SIGPLAN Notices[C]. 2011: 6.

[9] T Wang, T Wei, Z Lin, et al. IntScope: Automatically Detecting Integer Overflow Vulnerability in X86 Binary Using Symbolic Execution[M]. Network & Distributed System Security Symposium, 2009.

[10] T Wang, T Wei, G Gu, et al. TaintScope: A checksum-aware directed fuzzing tool for automatic software vulnerability detection[J]. Security & Privacy, 2010,41(3): 497-512. ★

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!