一种基于情境的ROP攻击检测系统及方法技术领域
本发明属于信息安全技术领域,涉及一种基于情境的ROP攻击检测系统及
方法,具体涉及一种基于情境的检测Android系统ROP攻击的装置及方法。
背景技术
随着移动互联网的高速发展,智能手机已经成为人们日常生活中必不可少的
一部分,然而智能手机中往往存在比其他传统终端更多的隐私信息,如短信、通
讯录、通话记录、银行密码等,因此智能手机的安全显得尤为重要。Android操
作系统作为移动平台的主流操作系统,由于其平台应用的开放性以及系统的分层
混合结构,近年来针对Android系统应用程序的攻击层出不穷,为Android系统
用户带来巨大的安全风险。
面向返回编程攻击,即ROP攻击是一种功能强大较为复杂的非注入代码型
攻击,利用了代码复用技术,自2007年被提出以来,发展迅速。ROP攻击复用
程序代码片段(即Gadget)的编程方法具有图灵完备性,理论上可以构造任意
恶意代码。它利用程序自身进程地址空间的代码片断而不依赖外部注入代码,因
此能有效绕过现有的诸多防御机制,例如DEP和W⊕X。
2008年Kornau等人给出了ROP攻击在ARM指令集下的实现,自此ROP
攻击开始转向系统底层基于ARM指令集的Android系统。攻击者进行针对
Android系统的ROP攻击,可以绕过多种防御机制,与其他攻击方式相结合,使
得已经被成功防御的攻击方法再度有效,无疑造成了巨大的安全威胁。如今,
ROP攻击已经越来越多地被使用来针对Android系统:CVE-2013-2597的栈溢出
漏洞、CVE-2014-7911的Android本地提权漏洞以及流传甚广的HackingTeam
AndroidBrowserExploit都是ROP攻击在Android系统中的实际应用。由此观之,
如何在Android系统中有效的检测ROP攻击已经变成了一个至关重要的问题。
Android系统面临ROP攻击的威胁,但目前Android的主流产品中,并没有
较为完善系统的ROP检测方法装置的实现。另一方面,对于PC端,软件行为
监控和敏感行为拦截已经是较为成熟的恶意软件对抗技术,有着十分广泛的应
用。但在Android系统中,还未有主流产品将这一技术应用于对ROP攻击的检
测中。情境的概念虽然很早就被提出,但是也未有主流产品从这一角度考虑与
ROP攻击检测相结合的方法。
发明内容
为了解决上述技术问题,提高Android平台的安全性,本发明提出了一种基
于情境的ROP攻击检测系统及方法,在对Android系统本身不做任何修改的情
况下,有效检测Android系统中发生的ROP攻击,并以敏感行为监控与拦截技
术避免用户遭受ROP攻击的危害。
本发明的装置所采用的技术方案是:一种基于情境的ROP攻击检测系统,
其特征在于:包括用户交互模块、注入器模块、监控模块、情境收集模块、ROP
攻击检测模块与记录模块;
所述用户交互模块提供检测系统与用户交互的接口,在进行ROP攻击检测
之前可以通过用户交互模块指定应用检测范围,当检测到ROP攻击时,用户根
据交互模块查验检测结果与相关情境信息,根据结果维护应用白名单所述注入器
模块用于将监控模块注入系统关键进程,初始监控模块,监控应用的初始启动过
程;
所述监控模块用于监控应用的敏感行为,当ROP攻击发生时,对其敏感行
为进行拦截;
所述情境收集模块用于收集被检应用的情境信息,当触发关键点时,调用
ROP攻击检测模块判断是否发生ROP攻击,当发生ROP攻击时,继续收集问题
应用的情境信息;反馈监控模块,对问题应用的敏感行为进行拦截;调用记录模
块,对情境信息进行记录;
所述ROP攻击检测模块用于分析情境收集模块获得的情境信息,根据预先
配置的ROP攻击检测策略判断是否发生ROP攻击,当检测到应用进程受到ROP
攻击时,调用记录模块,对ROP攻击发生的相关情境信息进行记录;检测到ROP
攻击时反馈情境收集模块,进一步收集相关情境信息;
所述记录模块用于记录ROP攻击检测结果和相关的情境信息,形成ROP攻
击检测记录;
用户通过用户交互模块同步数据库查验检测记录,维护生成Android系统应
用的白名单,ROP攻击检测记录和应用白名单被统一保存在数据库当中。
作为优选,所述检测系统还包括性能监视单元,对硬件事件的值进行读取,
用于检测ROP攻击;所述性能监视单元包括事件选择模块、性能计数器模块和
中断模块;事件选择模块决定需要记录的性能事件;性能计数器模块对相应性能
事件的值进行记录,每当有相应的事件发生则对应的性能计数器的值将加一;中
断模块主要负责何时读取性能计数器的值。
本发明的方法所采用的技术方案是:一种基于情境的ROP攻击检测方法,
其特征在于,包括以下步骤:
步骤1:注入系统关键进程,其具体实现包括以下子步骤:
步骤1.1:注入器模块查找系统中与敏感行为相关的关键系统进程的PID号;
所述关键系统进程具体是指:与Android系统各种服务相关的system_server,与
通话、短信等业务相关的com.android.phone,与录制视频、语音相关的
/system/bin/media_server;
步骤1.2:注入器模块通过ptrace()函数attach以上四个关键系统进程,加载
监控模块到其进程空间,调用mprotect()函数改变监控模块所在进程空间的可执
行属性,最终由dlopen()函数执行库函数_init()运行监控模块;
步骤1.3:监控模块被注入关键系统进程中运行之后,以修改当前进程全局
对象列表的方式,对libbinder.so库中的ioctl()函数进行HOOK,实现对Android
系统范围内应用行为的监控与拦截,至此完成对监控模块的初始化;
步骤2:收集被检应用情境信息,其具体实现包括以下子步骤:
步骤2.1:获取系统实时信息,包括:
①获取应用执行的ARM指令,当前寄存器的值,栈空间布局;若当前ARM
指令为ROP攻击的关键指令,包括movlr,pc指令,跳转指令b,以及切换指
令集的跳转指令bx,保存返回地址的跳转指令bl以及切换数据集并保存返回地
址的跳转指令blx时,调用ROP检测模块,判断是否发生ROP攻击;
②获取应用程序执行时硬件事件的值,并实时检测硬件事件的值是否存在异
常;
③在ROP攻击发生时,获取问题应用已加载的模块、加载模块的名称、内
存基址、长度、以及导出函数表,使用函数调用返回地址偏移进行遍历和匹配,
定位到产生漏洞的模块名、函数名和相对于函数首址的偏移;
④在ROP攻击发生后,监控、拦截与记录应用的敏感行为;
步骤2.2:获取用户预定义,即指用户维护的白名单:对于白名单应用,对
其敏感行为不进行拦截,也不收集其情境信息;
步骤3:ROP攻击检测,分析情境收集模块中获得的ARM指令及相关的情
境信息,进而分析应用程序的控制流和数据流,检测ROP攻击的发生;其具体
实现包括以下子步骤:
步骤3.1:跳转异常检查;
通过当前跳转指令所在的地址与其跳转的目的地址之间的差值是否大于给
定阈值来检测ROP攻击,如果是,则认为发生了ROP攻击;
步骤3.2:函数调用异常检查,其具体实现包括以下子步骤:
步骤3.2.1:获取函数调用跳转指令的目标地址开始的基本块;
步骤3.2.2:在基本块的起始部分,提取两条反汇编指令,检查第一条指令是
否为push,操作数中最后一个寄存器是不是lr;对于第二条指令,检查是否为
mov指令,且最后一个操作数为sp;如果全部满足,则是正常的函数调用,退
出检测;如果不满足,则认为是ROP攻击;
步骤3.3:函数返回异常检查,其具体实现包括以下子步骤:
步骤3.3.1:在对应用进行情境收集过程中,情境收集模块创建维护一个影
子栈ShadowStack,当执行函数调用指令时,用于存放函数返回地址;
步骤3.3.2:当检测到应用程序当前执行函数调用指令bl或blx时,将函数
返回地址压入影子栈ShadowStack中;
步骤3.3.3:当检测到当前指令为函数返回的bxlr指令时,分析影子栈顶返
回地址与函数返回控制流跳转目的地址是否一致,如果不一致,则报告为ROP
攻击;
当检测到ROP攻击时,将ROP攻击检测结果、问题应用的相关情境信息与
敏感行为的监控、拦截情况形成检测记录,呈现给用户。
本发明的主要优点:
1.防止攻击者使用ROP技术执行恶意代码或绕过安全机制,避免用户遭受
ROP攻击的危害,提升了系统的安全性;
2.检测装置未对系统本身进行修改,方便配置在任意Android系统上,可检
测系统范围内针对任意应用的ROP攻击;
3.基于应用的情境信息,从跳转异常检查、函数调用异常检查、函数返回
异常检查与硬件事件检测四个方面有效检测ROP攻击。ROP攻击检测过程的检
测粒度达到指令级别,是一种较细粒度的检测,有较低的漏报率和误报率;
4.在检测ROP攻击的同时,同时记录问题应用ROP攻击相关的情境信息,
可以辅助用户对ROP攻击发生过程进行复盘与分析。用户对于Android系统应
用白名单的维护,可以进一步提升检测结果的准确度,改善装置的检测效率。
附图说明
图1:本发明实施例的装置构架原理图;
图2:本发明实施例装置的性能监视单元构架原理图;
图3:本发明实施例方法的注入系统关键进程流程图;
图4:本发明实施例方法的ROP攻击检测流程图.
具体实施方式
为了便于本领域普通技术人员理解和实施本发明,下面结合附图及实施例对
本发明作进一步的详细描述,应当理解,此处所描述的实施示例仅用于说明和解
释本发明,并不用于限定本发明。
请见图1和图2,本发明提供的一种基于情境的ROP攻击检测系统,包括用
户交互模块、注入器模块、监控模块、情境收集模块、ROP攻击检测模块、记
录模块和性能监视单元;
(1)用户交互模块提供了检测系统与用户交互的接口。用户可以通过交互
模块指定应用检测范围,查验检测结果与相关情境信息,还包括根据结果维护应
用白名单。
(2)注入器模块完成将监控模块注入系统关键进程等注入过程,还包括初
始监控模块,以监控应用的敏感行为等初始启动过程。
(3)监控模块用于监控应用的敏感行为,当ROP攻击发生时,对其敏感行
为进行拦截。
(4)情境收集模块用于收集被检应用的情境信息,当触发关键点时,调用
核心模块ROP攻击检测模块,判断是否发生ROP攻击。当发生ROP攻击时,
继续收集问题应用的情境信息,还包括反馈监控模块,对问题应用的敏感行为进
行拦截;调用记录模块,对情境信息进行记录。
(5)ROP攻击检测模块,为检测系统的核心模块。该模块分析情境收集模
块获得的ARM指令等情境信息,根据预先配置的ROP攻击检测策略判断是否
发生ROP攻击。还包括当检测到应用进程受到ROP攻击时,调用记录模块,对
ROP攻击发生的问题模块、问题函数等相关情境信息进行记录,还包括检测到
ROP攻击时反馈情境收集模块,进一步收集相关情境信息。
(6)记录模块用于记录ROP攻击检测结果和相关的情境信息,如发生ROP
攻击后的问题应用Package名、问题模块、问题函数等,还包括问题应用的敏感
行为监控与拦截情况,并将以上信息形成ROP攻击检测记录。用户可以通过用
户交互模块,同步数据库查验检测记录,维护生成Android系统应用的白名单。
ROP攻击检测记录和应用白名单被统一保存在数据库当中。
ROP攻击会导致程序的执行流发生变化,最终会体现在一些硬件事件上。
ARM提供的性能监视单元(PerformanceMonitorUnits,PMU)可以对硬件事件的
值进行读取,用于检测ROP攻击。
如图2所示,ARM架构的性能监视单元主要通过APB接口或者CP15接口
获得性能监视计数器的值。性能监视单元包括事件选择模块、性能计数器模块和
中断模块。事件选择模块决定需要记录的性能事件,性能计数器模块对相应性能
事件的值进行记录,每当有相应的事件发生则对应的性能计数器的值将加一。中
断模块主要负责何时读取性能计数器的值,本专利中每隔16000条指令读取一
次。
本专利选取了与ROP攻击最相关的4个性能事件,如表1所示.
表1:用于检测ROP的性能事件
事件
事件说明
RET
执行的return指令的数目
STORE
执行的store指令的数目
MISP_BR
分支预测失败的数目
MIS_ITLB
指令页表没有命中的次数
具体实现步骤如下:
①数据处理,鉴于性能和有效性的考量,每隔16000条指令读取一次性能监
视计数器的值,然后利用指数转换对收集到的数据进行处理;
②建立分类器,利用非监督式学习方法对收集到的数据进行机器学习;
③通过步骤②建立的分类器识别是否存在ROP攻击。
本发明提供的一种基于情境的ROP攻击检测方法,包括注入系统关键进程、
收集被检应用情境信息及ROP攻击检测三部分内容。
一、注入系统关键进程;
该部分主要完成将监控模块,注入Android系统关键进程,并初始监控模块
的过程。运行后的监控模块完成对系统内运行应用敏感行为的捕获与拦截,是对
Android系统Native层Hook技术的扩展,如图3,具体步骤:
1.注入器模块查找系统中与敏感行为相关的关键系统进程的PID号。关键系
统进程具体是指:与Android系统各种服务相关的system_server,与通话、短信
等业务相关的com.android.phone,与录制视频、语音相关的
/system/bin/media_server。
2.鉴于Android系统基于linux内核,注入器模块通过ptrace()函数attach以
上四个关键系统进程,加载监控模块到其进程空间,调用mprotect()函数改变监
控模块所在进程空间的可执行属性,最终由dlopen()函数执行库函数_init()运行
监控模块。
3.监控模块被注入关键系统进程中运行之后,以修改当前进程全局对象列表
(GlobalObjectTable,以下简称GOT)的方式,对libbinder.so库中的ioctl()函数
进行HOOK,实现对Android系统范围内应用行为的监控与拦截,至此完成对监
控模块的初始化。
二、收集被检应用情境信息;
该部分为情境收集模块完成对应用情境信息的收集过程。在相关研究工作
中,情境是指可以用来描述实体状态的任何信息。在本装置中,包括系统实时信
息与用户预定义两个方面,具体步骤:
1.获取系统实时信息,包括:
①获取应用执行的ARM指令,当前寄存器的值,栈空间布局。若当前ARM
指令为ROP攻击的关键指令,包括movlr,pc指令,跳转指令b,以及切换指
令集的跳转指令bx,保存返回地址的跳转指令bl以及切换数据集并保存返回地
址的跳转指令blx时,调用ROP检测模块,判断是否发生ROP攻击。
②获取应用程序执行时硬件事件的值,并实时检测硬件事件的值是否存在异
常。
③在ROP攻击发生时,获取问题应用已加载的模块、加载模块的名称、内
存基址、长度、以及导出函数表(如果存在的话),使用函数调用返回地址偏移
进行遍历和匹配,就可以定位到产生漏洞的模块名、函数名和相对于函数首址的
偏移。
④在ROP攻击发生后,监控、拦截与记录应用的敏感行为。
2.获取用户预定义,即指用户维护的白名单:
①对于白名单应用,对其敏感行为不进行拦截,也不收集其情境信息。
三、ROP攻击检测;
该部分为发明装置的核心模块,分析情境收集模块中获得的ARM指令及相
关的情境信息,进而分析应用程序的控制流和数据流,检测ROP攻击的发生,
如图4,具体步骤:
1.跳转异常检查;
通过当前跳转指令所在的地址与其跳转的目的地址之间的差值是否大于给
定阈值来检测ROP攻击。为提高检测效率,降低误报率,只有当两个连续的跳
转指令出现且中间没有出现函数调用指令时,才对跳转指令进行异常检测,并且
直接跳转指令因为不能被ROP攻击利用,所以只关注间接跳转指令。
具体涉及movlr,pc指令,跳转指令b,以及切换指令集的跳转指令bx。
如果它的操作数是立即数,则代表其是直接跳转,返回继续执行;如果跳转指令
的操作数不是立即数,本发明就认为它是间接跳转。即movlr,pc指令为间接
跳转指令,其余跳转指令的操作数不为立即数时为间接跳转指令,为检测中关注
的指令。
这个限制对于正常程序而言并没有任何影响,只对可能出现在gadget中的
跳转指令进行异常检测。
对于满足条件的跳转指令,即当两个连续的跳转指令出现且中间没有出现函
数调用指令的间接跳转指令,取出此条指令所在的地址,记作jumpSourceAddress;
取出跳转指令操作数的值,即间接跳转的目的地址,记为jumpSinkAddress;计
算|jumpSourceAddress-jumpSinkAddress|是否大于给定阈值,如果是,则认为
发生了ROP攻击。
2.函数调用异常检查;
检查函数调用异常要分析函数调用指令,具体涉及保存返回地址的跳转指令
bl以及切换数据集并保存返回地址的跳转指令blx。
正常函数中函数调用跳转指令的目的地址应该是被调函数的入口地址,如果
不是,那么本发明怀疑它可能是ROP攻击。即如果bl指令或blx指令跳转的目
的指令序列为“push{r7,lr};movr7,sp”(其中“r7”可变,其余固定),则本发明
认为它是正常的函数调用;如果不是,则本发明认为其是ROP攻击。
具体实现步骤如下:
①获取函数调用跳转指令的目标地址开始的基本块。
②在基本块的起始部分,提取两条反汇编指令,检查第一条指令是否为push,
操作数中最后一个寄存器是不是lr;对于第二条指令,检查是否为mov指令,
且最后一个操作数为sp。如果全部满足,则是正常的函数调用,退出检测;如果
不满足,则认为是ROP攻击。
3.函数返回异常检查;
为了检查返回异常,建立一个影子栈ShadowStack。当执行到函数调用的
bl指令或blx指令时,将函数返回地址压入ShadowStack;当执行到函数返回的
bxlr指令时,取出ShadowStack栈顶的地址,并比较这个地址与返回控制流跳
转目的地是否一致。如果这两个地址不一致,则认为是ROP攻击。也就是说,
每当执行新的函数调用过程时,本发明更新ShadowStack。函数返回异常检查能
够发现没有对应函数调用返回的,利用函数片段构造的ROP攻击。
具体实现步骤如下:
①在对应用进行情境收集过程中,情境收集模块创建维护一个影子栈
ShadowStack,当执行函数调用指令时,用于存放函数返回地址;
②当检测到应用程序当前执行函数调用指令bl或blx时,将函数返回地址压
入影子栈ShadowStack中;
③当检测到当前指令为函数返回的bxlr指令时,分析影子栈顶返回地址与
函数返回控制流跳转目的地址是否一致,如果不一致,则报告为ROP攻击。
ROP检测方法除以上三点外,当检测到ROP时,将ROP攻击检测结果、问
题应用的相关情境信息与敏感行为的监控、拦截情况形成检测记录,呈现给用户。
用户分析查验检测结果维护一个Android系统应用的白名单来提升检测的效率,
并降低误报率。
以下结合具体实例对上述方案做进一步说明。
实例基于Android系统ROP攻击检测装置的实现。
以运行在Android系统的Package名为com.example.helloworld的应用为例进
行说明。在Android系统运行时,首先由注入器模块查找到系统关键进程的PID:
system_server为739,com.android.phone为149,/system/bin/media_server为152,
将监控模块monitor.so注入到每个关键进程的进程空间,初始化监控模块完成对
ioctl()函数的HOOK。情境收集模块从数据库加载用户维护的应用白名单,如果
应用com.example.helloworld不在白名单上,查找其PID号,得到其PID号为
11432;否则继续正常运行应用。情境收集模块通过ptrace()获取应用
com.example.helloworld的情境信息,包括获取应用执行的ARM指令,当前寄存
器的值,栈空间布局。解析当前ARM指令,当前ARM指令为函数调用的bl指
令或blx指令时,建立影子栈ShadowStack保存函数的返回地址;为movlr,pc
指令,跳转指令b,以及切换指令集的跳转指令bx,保存返回地址的跳转指令
bl以及切换数据集并保存返回地址的跳转指令blx时,调用ROP检测模块。ROP
检测模块分析传入的应用情境信息,按照ROP检测策略,进行跳转异常检查、
函数调用异常检查与函数返回异常检查。
若ROP模块判断未发生ROP攻击,则继续执行程序;若判断ROP攻击已
经发生,情境收集模块获取应用已加载的模块、加载模块的名称、内存基址、长
度、以及导出函数表(如果存在的话),使用函数调用返回bx值进行遍历和匹配,
就可以定位到产生漏洞的模块名、函数名和相对于函数首址的偏移。将发生ROP
攻击的应用Package名com.exaple.helloworld、问题模块名、问题函数名以及相
对首地址的偏移存入数据库。
ROP攻击发生后,监控模块开始监控拦截问题应用的敏感行为,生成记录
存入数据库。
用户交互模块同步更新数据库中的检测记录,由用户对检测结果进行查验,
考虑是否更新应用白名单。
本发明实现了对Android系统中ROP攻击的有效检测,防止攻击者使用ROP
技术执行恶意代码或绕过安全机制,避免用户遭受ROP攻击的危害,提升系统
的安全性。
应当理解的是,本说明书未详细阐述的部分均属于现有技术。
应当理解的是,上述针对较佳实施例的描述较为详细,并不能因此而认为是
对本发明专利保护范围的限制,本领域的普通技术人员在本发明的启示下,在不
脱离本发明权利要求所保护的范围情况下,还可以做出替换或变形,均落入本发
明的保护范围之内,本发明的请求保护范围应以所附权利要求为准。