CN108875369B - 一种控制流完整性校验方法、装置和计算机存储介质 - Google Patents

一种控制流完整性校验方法、装置和计算机存储介质 Download PDF

Info

Publication number
CN108875369B
CN108875369B CN201710340488.6A CN201710340488A CN108875369B CN 108875369 B CN108875369 B CN 108875369B CN 201710340488 A CN201710340488 A CN 201710340488A CN 108875369 B CN108875369 B CN 108875369B
Authority
CN
China
Prior art keywords
indirect jump
jump instruction
program
control flow
instruction
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201710340488.6A
Other languages
English (en)
Other versions
CN108875369A (zh
Inventor
辛军
王奥辉
陈凯
梁瑞刚
彭华熹
刘颖卿
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
China Mobile Communications Group Co Ltd
China Mobile Communications Ltd Research Institute
Original Assignee
China Mobile Communications Group Co Ltd
China Mobile Communications Ltd Research Institute
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by China Mobile Communications Group Co Ltd, China Mobile Communications Ltd Research Institute filed Critical China Mobile Communications Group Co Ltd
Priority to CN201710340488.6A priority Critical patent/CN108875369B/zh
Publication of CN108875369A publication Critical patent/CN108875369A/zh
Application granted granted Critical
Publication of CN108875369B publication Critical patent/CN108875369B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/562Static detection
    • G06F21/563Static detection by source code analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/562Static detection
    • G06F21/565Static detection by checking file integrity
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security

Abstract

本发明实施例公开了一种控制流完整性校验方法、装置和计算机存储介质。所述方法包括:识别程序中的第一间接跳转指令,获得所述第一间接跳转指令的特征信息;基于所述特征信息对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,将所述程序中的第一间接跳转指令修改为所述第二间接跳转指令;基于插入所述程序中的补充程序,在所述程序执行所述第二间接跳转指令时,通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验。

Description

一种控制流完整性校验方法、装置和计算机存储介质
技术领域
本发明涉及智能终端安全领域,具体涉及一种控制流完整性校验方法、装置和计算机存储介质。
背景技术
目前安卓(Android)系统当中已经存在多种对漏洞利用的缓解机制,诸如栈保护、堆栈不可执行、特权执行从不(PXN,Privileged eXecute-Never)、地址随机化等等。在这些安全机制的保护下,对Android系统的传统漏洞攻击技术也逐一失效,但是攻防对抗在不断升级。在Android这些的防护机制下,又有绕过这些漏洞利用缓解措施的攻击方式出现。近些年来,针对控制流劫持的攻击,已经有很多的工作在研究如何抵抗控制流劫持攻击,也取得了不错的成果。
现有技术方案的控制流转移方法是通过将原有的跳转指令进行修改,将程序的控制流定向到控制流完整性校验代码中。而修改后的指令往往会指令长度上大于原本存在于该位置的指令。为了能够保证程序正常的运行,则需要对二进制文件进行重写,而并不是每一个二进制文件的代价很大,有的甚至不能重写成功。
发明内容
为解决现有存在的技术问题,本发明实施例提供一种控制流完整性校验方法、装置和计算机存储介质。
为达到上述目的,本发明实施例的技术方案是这样实现的:
本发明实施例提供一种控制流完整性校验方法,所述方法包括:
识别程序中的第一间接跳转指令,获得所述第一间接跳转指令的特征信息;
基于所述特征信息对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,将所述程序中的第一间接跳转指令修改为所述第二间接跳转指令;
基于插入所述程序中的补充程序,在所述程序执行所述第二间接跳转指令时,通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验。
上述方案中,所述获得所述第一间接跳转指令的特征信息,包括:
获得所述第一间接跳转指令的特征信息,所述特征信息包括:所述第一间接跳转指令的类型、是否对寄存器进行解引用、是否具有偏移以及寄存器信息;
所述第一间接跳转指令的类型包括:表征函数间接跳转指令的第一类型和表征函数内间接跳转指令的第二类型。
上述方案中,所述通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验,包括:
当所述第二间接跳转指令属于第一类型时,获得所述第二间接跳转指令的目的地址;
判断所述目的地址是否满足第一预设数据集合中的数据特征;当所述目的地址不满足第一预设数据集合中的数据特征时,确定发生所述控制流劫持攻击;
或者,判断所述目的地址是否满足所述程序的地址;当所述目的地址不满足所述程序的地址时,确定发生所述控制流劫持攻击。
上述方案中,所述通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验,包括:
当所述第二间接跳转指令属于第二类型时,获得所述第二间接跳转指令的目的地址;
判断所述目的地址是否满足所述程序的地址;当所述目的地址不满足所述程序的地址时,确定发生所述控制流劫持攻击;
或者,判断所述目的地址是否在第二预设数据集合中、且所述第二间接跳转指令是否表征特定结构的间接跳转;
当所述目的地址不在第二预设数据集合中,或者所述第二间接跳转指令不表征特定结构的间接跳转时,确定发生所述控制流劫持攻击。
上述方案中,所述基于所述特征信息对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,包括:
基于预设规则对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,使所述第二间接跳转指令的第一字节携带特定指令;所述第二间接跳转指令的第二字节表示所述特征信息;
所述特定指令用于将所述第二间接跳转指令转移至所述补充程序,以由所述补充程序对所述第二间接跳转指令进行控制流完整性校验。
上述方案中,所述将所述程序中的第一间接跳转指令修改为所述第二间接跳转指令之后,所述方法还包括:在所述程序中插入所述补充程序,以使所述程序加载之前执行所述补充程序中的注册信号处理。
本发明实施例还提供了一种控制流完整性校验装置,所述装置包括:指令识别单元、编码单元和校验单元;其中,
所述指令识别单元,用于识别程序中的第一间接跳转指令,获得所述第一间接跳转指令的特征信息;
所述编码单元,用于基于所述指令识别单元获得的所述特征信息对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,将所述程序中的第一间接跳转指令修改为所述第二间接跳转指令;
所述校验单元,用于基于插入所述程序中的补充程序,在所述程序执行所述第二间接跳转指令时,通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验。
上述方案中,所述指令识别单元,用于获得所述第一间接跳转指令的特征信息,所述特征信息包括:所述第一间接跳转指令的类型、是否对寄存器进行解引用、是否具有偏移以及寄存器信息;所述第一间接跳转指令的类型包括:表征函数间接跳转指令的第一类型和表征函数内间接跳转指令的第二类型。
上述方案中,所述校验单元,用于当所述第二间接跳转指令属于第一类型时,获得所述第二间接跳转指令的目的地址;判断所述目的地址是否满足第一预设数据集合中的数据特征;当所述目的地址不满足第一预设数据集合中的数据特征时,确定发生所述控制流劫持攻击;或者,判断所述目的地址是否满足所述程序的地址;当所述目的地址不满足所述程序的地址时,确定发生所述控制流劫持攻击。
上述方案中,所述校验单元,用于当所述第二间接跳转指令属于第二类型时,获得所述第二间接跳转指令的目的地址;判断所述目的地址是否满足所述程序的地址;当所述目的地址不满足所述程序的地址时,确定发生所述控制流劫持攻击;或者,判断所述目的地址是否在第二预设数据集合中、且所述第二间接跳转指令是否表征特定结构的间接跳转;当所述目的地址不在第二预设数据集合中,或者所述第二间接跳转指令不表征特定结构的间接跳转时,确定发生所述控制流劫持攻击。
上述方案中,所述编码单元,用于基于预设规则对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,使所述第二间接跳转指令的第一字节携带特定指令;所述第二间接跳转指令的第二字节表示所述特征信息;所述特定指令用于将所述第二间接跳转指令转移至所述补充程序,以由所述补充程序对所述第二间接跳转指令进行控制流完整性校验。
上述方案中,所述校验单元,用于在所述程序中插入所述补充程序,以使所述程序加载之前执行所述补充程序中的注册信号处理。
本发明实施例还提供了一种控制流完整性校验装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现本发明实施例所述的控制流完整性校验方法的步骤。
本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现本发明实施例所述的控制流完整性校验方法的步骤。
本发明实施例提供的控制流完整性校验方法、装置和计算机存储介质,所述方法包括:识别程序中的第一间接跳转指令,获得所述第一间接跳转指令的特征信息;基于所述特征信息对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,将所述程序中的第一间接跳转指令修改为所述第二间接跳转指令;基于插入所述程序中的补充程序,在所述程序执行所述第二间接跳转指令时,通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验。采用本发明实施例的技术方案,有效的保护了安卓系统下控制流完整性,保护不受各种内存破坏类漏洞的攻击,比如释放后重用、双重释放、内存未初始化、堆溢出等漏洞;通过对程序中的间接跳转指令进行编码,使编码后的间接跳转指令长度在两个字节内,避免了对二进制文件的大范围重写。
附图说明
图1为本发明实施例的控制流完整性校验方法的流程示意图;
图2为本发明实施例的控制流完整性校验方法中对间接跳转指令的一种编码示意图;
图3为本发明实施例的控制流完整性校验方法中将补充程序插入至程序的应用示意图;
图4为本发明实施例的控制流完整性校验装置的组成结构示意图;
图5为本发明实施例的控制流完整性校验装置的一种硬件组成结构示意图。
具体实施方式
下面结合附图及具体实施例对本发明作进一步详细的说明。
本发明实施例提供了一种控制流完整性校验方法。图1为本发明实施例的控制流完整性校验方法的流程示意图;如图1所示,所述方法包括:
步骤101:识别程序中的第一间接跳转指令,获得所述第一间接跳转指令的特征信息。
步骤102:基于所述特征信息对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,将所述程序中的第一间接跳转指令修改为所述第二间接跳转指令。
步骤103:基于插入所述程序中的补充程序,在所述程序执行所述第二间接跳转指令时,通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验。
本实施例的控制流完整性校验方法应用于安卓操作系统的终端设备中,所述终端设备具体可以是手机、平板电脑等智能终端设备。安卓操作系统中的本地以及远程提权漏洞、远程代码执行漏洞往往是利用程序、内核中的内存破坏类漏洞对程序的控制流进行劫持,从而达到攻击目的。尽管现有技术中已经在控制流完整性方面做出很多工作,目前的安卓操作系统当中并没有可以实际应用的控制流完整性保护方案。控制流的转移主要有三种方式:第一是直接的跳转和直接的函数调用,这种控制流的转移目的地是已经确定的,而且由于堆栈不可执行等防护措施的存在,所以这种控制流的跳转已经被很好的保护。第二是返回指令,对返回指令的控制流劫持则往往是栈溢出,通过对返回地址的覆盖造成函数返回时的控制流劫持攻击。由于像Stack Canary以及Stack Smashing Protection等防护措施的存在,针对返回指令的控制流跳转也得到很好的保护。第三种是间接跳转指令例如call rax以及jmp rax等。这种控制流的转移通常是用于函数指针的调用、C++虚函数的调用以及switch结构等,由于这些跳转地址的值并不确定,通常存在于内存当中,因而是攻击者的重点研究对象。本发明实施例针对上述第三种控制流的转移方式进行保护,以实现控制流完整性校验。
本实施例中,首先识别移动终端中任一程序中可能存在的间接跳转指令,在重新编码前,识别出的间接跳转指令记为第一间接跳转指令;相应的,重新编码后的间接跳转指令记为第二间接跳转指令。
具体的,程序中的间接跳转指令的类型主要包括两种:表征函数间接跳转指令的第一类型和表征函数内间接跳转指令的第二类型。其中,第一类型的第一间接跳转指令主要具有三种形式:call reg、call[reg]、call[reg+offset];其中,reg表示通用寄存器,作为一种实施方式,在x86平台下reg可以是eax、ebx、ecx、edx等通用寄存器类型;offset表示偏移,可以是正值或负值。第二类型的第一间接跳转指令例如switch分支调用,第二类型的第一间接跳转指令主要具有三种形式:jmp reg、jmp[reg]、jmp[reg+offset];其中,reg表示通用寄存器,在x86平台下reg可以是eax、ebx、ecx、edx等通用寄存器类型;offset表示偏移,可以是正值或负值。基于此,本实施例中可对程序中的指令的字段进行识别,当识别出的指令的字段满足上述形式时,可确定相应的指令为第一间接跳转指令;以及,识别出的指令中包括call或jmp字段时,可分别确定所述第一间接跳转指令为第一类型的第一间接跳转指令或第二类型的第一间接跳转指令,以获得所述第一间接跳转指令的类型特征信息。
本实施例中,所述获得所述第一间接跳转指令的特征信息包括:获得所述第一间接跳转指令的特征信息,所述特征信息包括:所述第一间接跳转指令的类型、是否对寄存器进行解引用、是否具有偏移以及寄存器信息;所述第一间接跳转指令的类型包括:表征函数间接跳转指令的第一类型和表征函数内间接跳转指令的第二类型。从而基于获得的特征信息对所述第一间接指令进行编码生成通过两个字节表示的第二间接跳转指令,将所述程序中的第一间接跳转指令修改为所述第二间接跳转指令。由于间接跳转指令(即所述第一间接跳转指令)的长度在2个字节到6个字节之间,如果在原有指令上进行操作,不会超过本身指令长度;如果对间接跳转指令的定制超过了指令本身的长度,就需要对二进制文件(即程序本身)进行大范围地重写。因此,本发明实施例保证在指令的长度范围内进行操作,只针对间接跳转指令进行修改,修改后的间接跳转指令(即第二间接跳转指令)通过两个字节表示,避免了二进制文件需要大范围的重写。
本实施例中,所述基于所述特征信息对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,包括:基于预设规则对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,使所述第二间接跳转指令的第一字节携带特定指令;所述第二间接跳转指令的第二字节表示所述特征信息;所述特定指令用于将所述第二间接跳转指令转移至所述补充程序,以由所述补充程序对所述第二间接跳转指令进行控制流完整性校验。
具体的,所述第二间接跳转指令的第一个字节定义为所述特定指令,也即0至7比特位内容定义为所述特定指令;所述特定指令例如可表示为0xCC,也即0至7比特位内容定义为0xCC;0xCC可在x86平台下使所述程序接收到SIGTRAP信号,通过所述程序中的注册SIGTRAP的信号处理程序,可将所述程序的控制流转移到本实施例中的补充程序中,通过补充程序对控制流的完整性进行校验。本实施例中,所述第一间接跳转指令的特征信息包括:所述第一间接跳转指令的类型、是否对寄存器进行解引用、是否具有偏移以及寄存器信息等等。作为一种实施方式,可通过一比特位(例如比特位8)定义是否对寄存器进行解引用,如call eax和call[eax],直接使用寄存器记为0,对寄存器进行解引用记为1。可通过一比特位(例如比特位9)定义间接跳转指令的类型是call类型还是jmp类型,call指令可记为0,jmp指令可记为1。可通过一比特位(例如比特位10)定义是否需要偏移,如call[eax]和call[eax+offset],使用偏移记为0,不使用偏移记为1。可通过四个比特位(例如比特位11至14)标记使用的寄存器信息,存器编码可按照EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP以及EIP从0开始编码。对间接跳转指令的一种编码示意可如图2所示,比特(Bit)0至7定义“0xCC”;Bit8定义是否对寄存器进行解引用;Bit9定义间接跳转指令的类型是call类型还是jmp类型,可标记为“call or jmp”;Bit10定义是否需要偏移,可标记为“offset set?”;Bit11-14标记使用的寄存器信息,可标记为“register”;Bit15定义为取消定义,可标记为“undef”。例如,若第一间接跳转指令为call[ecx],则按照图2所示的编码规则进行重新编码后的第二间接跳转指令可表示为“\xFF\xA4”。进一步地,将程序中的第一间接跳转指令修改为重新编码获得的通过两个字节表示的第二间接跳转指令,这样,通过对程序中的间接跳转指令的修改,避免了二进制文件大范围的重写。
本实施例中,预先配置补充程序,所述补充程序用于对控制流进行完整性校验,即判定是否发生控制流劫持攻击。具体的,在程序执行到间接跳转指令(即所述第二间接跳转指令)时,可通过所述间接跳转指令中第一字节定义的特定指令,将所述间接跳转指令转移至所述补充程序,通过所述补充程序的执行对所述间接跳转指令进行完整性校验,以判定所述间接跳转指令是否发生控制流劫持攻击。本实施例中依据所述第二间接跳转指令的类型的不同预先定义所述补充程序中的校验规则。
作为第一种实施方式,所述通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验,包括:当所述第二间接跳转指令属于第一类型时,获得所述第二间接跳转指令的目的地址;判断所述目的地址是否满足第一预设数据集合中的数据特征;当所述目的地址不满足第一预设数据集合中的数据特征时,确定发生所述控制流劫持攻击;或者,判断所述目的地址是否满足所述程序的地址;当所述目的地址不满足所述程序的地址时,确定发生所述控制流劫持攻击。
具体的,对于属于第一类型的第二间接跳转指令,也可以理解为“call”形式的间接跳转指令,例如call reg、call[reg]、call[reg+offset]等等,属于第一类型的第二间接跳转指令(即call形式的间接跳转指令)的目的地址是函数。则预先收集函数特征并生成第一预设数据集合;则当所述第二间接跳转地址的目的地址满足所述第一预设数据集合中的数据特征时,表明所述第二间接跳转指令是正常的控制流;相应的,若所述第二间接跳转地址的目的地址不满足所述第一预设数据集合中的数据特征,则表明发生控制流劫持攻击。另一方面,基于所述第二间接跳转指令的目的地址是否满足所述程序所在的地址,也即判断所述第二间接跳转指令的目的地址是否在所述程序内部;当所述第二间接跳转指令的目的地址满足所述程序所在的地址时,表明所述第二间接跳转指令的目的地址在所述程序内部,也即表明所述第二间接跳转指令是正常的控制流;相应的,当所述第二间接跳转指令的目的地址不满足所述程序所在的地址时,表明所述第二间接跳转指令的目的地址不在所述程序内部,表明发生控制流劫持攻击。
作为第二种实施方式,所述通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验,包括:当所述第二间接跳转指令属于第二类型时,获得所述第二间接跳转指令的目的地址;判断所述目的地址是否满足所述程序的地址;当所述目的地址不满足所述程序的地址时,确定发生所述控制流劫持攻击;或者,判断所述目的地址是否在第二预设数据集合中、且所述第二间接跳转指令是否表征特定结构的间接跳转;当所述目的地址不在第二预设数据集合中,或者所述第二间接跳转指令不表征特定结构的间接跳转时,确定发生所述控制流劫持攻击。
具体的,对于属于第二类型的第二间接跳转指令,也可以理解为“jmp”形式的间接跳转指令,例如jmp reg、jmp[reg]、jmp[reg+offset]等等。属于第二类型的第二间接跳转指令(即jmp形式的间接跳转指令)的用途在于两个方面,一是用于switch结构的跳转,另一个是函数指针的调用。一方面,基于所述第二间接跳转指令的目的地址是否满足所述程序所在的地址,也即判断所述第二间接跳转指令的目的地址是否在所述程序内部;当所述第二间接跳转指令的目的地址满足所述程序所在的地址时,表明所述第二间接跳转指令的目的地址在所述程序内部,也即表明所述第二间接跳转指令是正常的控制流;相应的,当所述第二间接跳转指令的目的地址不满足所述程序所在的地址时,表明所述第二间接跳转指令的目的地址不在所述程序内部,表明发生控制流劫持攻击。另一方面,预先对所述程序进行静态分析,获得所有的switch结构的间接跳转指令并记录switch表(switch table)的地址生成第二预设数据集合;则一方面,判断所述第二间接跳转指令的目的地址是否在所述第二预设数据集合中,具体是判断所述第二间接跳转指令的目的地址是否在所述第二预设数据集合的switch table中;当所述第二间接跳转指令的目的地址不在所述第二预设数据集合中,则表明发生控制流劫持攻击;另一方面,判断所述第二间接跳转指令是否表征特定结构的间接跳转,也即判断所述第二间接跳转指令是否表征switch结构跳转;当所述第二间接跳转指令不表征switch结构跳转时,则表明发生控制流劫持攻击;相应的,当所述第二间接跳转指令的目的地址在所述第二预设数据集合中、且所述第二间接跳转指令表征switch结构跳转时,表明所述第二间接跳转指令是正常的控制流。其中,判断所述第二间接跳转指令是否表征特定结构的间接跳转,具体可通过判断所述第二间接跳转指令的形式是否满足所述特定结构的形式判定,例如判断所述第二间接跳转指令是否满足switch结构,也即判断所述第二间接跳转指令是否满足例如jmp reg、jmp[reg]或jmp[reg+offset]等结构形式。
本实施例采用上述两种实施方式的判定依据配置补充程序,以基于所述补充程序对所述第二间接跳转指令进行控制流完整性校验。所述补充程序可通过shellcode表示。
作为另一种实施方式,所述将所述程序中的第一间接跳转指令修改为所述第二间接跳转指令之后,所述方法还包括:在所述程序中插入所述补充程序,以使所述程序加载之前执行所述补充程序中的注册信号处理。
具体的,所述补充程序中还包括注册信号处理子程序,所述注册信号处理子程序可通过注册信号处理函数实现;在程序中插入所述补充程序时,修改所述程序的入口点,使所述程序的入口点指向所述补充程序,具体是指向所述补充程序中的注册信号处理子程序,这样,在所述程序开始执行时执行所述补充程序中的注册信号处理子程序,在所述注册信号处理子程序执行完成、也即信号处理函数注册完成后,重新跳转回所述程序的入口点执行所述程序;在所述程序执行所述第二间接跳转指令时,跳转至所述补充程序,由所述补充程序对所述第二间接跳转指令进行完整性校验;具体的,将补充程序插入至程序以及跳转示意具体可参见图3中所示;图3中左图为补充程序插入程序之前、程序文件的结构示意图;图3中右图为补充程序插入程序之后的程序文件的结构示意;如图3右图所示,在插入所述补充文件后,在.text节所在的段中加入插入的补充程序的空间,将预先配置的补充程序写入该空间内。另外,修改程序的入口点,将程序的入口点指向所述补充程序中注册信号处理子程序,这样在程序开始执行时执行所述补充程序中的注册信号处理子程序。作为一种示意,所述补充程序中对间接跳转指令进行控制流完整性校验的算法描述可参照以下代码实现:
Figure BDA0001295114300000111
Figure BDA0001295114300000121
本实施例中,所述补充程序(即shellcode)的配置,在实际应用中可采用汇编或者内联汇编方式实现,其次实现的代码是位置无关的代码,而且所述补充程序中不依赖任何库函数的调用,必要的地方都需要通过系统调用实现。本实施例配置的补充程序具有以下特点:
1、能对程序控制流的完整性作出校验。当程序正常执行时保证程序能够正常地运行,当程序的控制流被劫持的情况下,能够检测出控制流被劫持从而退出程序的执行;
2、在程序控制流的完整性得到校验后能够返回程序的正常执行流程,保证程序的正常运行;
3、能区分各种间接跳转指令的特点,并对其做针对性的控制流完整性校验;
4、不仅可以保护可执行程序,也可以对动态链接的库文件进行保护。
基于此,本实施例中,在执行步骤103之后,所述方法还包括:当通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验后确定所述第二间接跳转指令是正常的控制流时,返回执行所述程序;当通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验后确定发生控制流劫持攻击时,终止执行所述程序。
采用本发明实施例的技术方案,有效的保护了安卓系统下控制流完整性,保护不受各种内存破坏类漏洞的攻击,比如释放后重用、双重释放、内存未初始化、堆溢出等漏洞;通过对程序中的间接跳转指令进行编码,使编码后的间接跳转指令长度在两个字节内,避免了对二进制文件的大范围重写,巧妙地利用类Unix平台下信号处理机制对程序的控制流进行校验完整性。
本发明实施例还提供了一种控制流完整性校验装置。图4为本发明实施例的控制流完整性校验装置的组成结构示意图;如图4所示,所述装置包括:指令识别单元41、编码单元42和校验单元43;其中,
所述指令识别单元41,用于识别程序中的第一间接跳转指令,获得所述第一间接跳转指令的特征信息;
所述编码单元42,用于基于所述指令识别单元41获得的所述特征信息对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,将所述程序中的第一间接跳转指令修改为所述第二间接跳转指令;
所述校验单元43,用于基于插入所述程序中的补充程序,在所述程序执行所述第二间接跳转指令时,通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验。
本实施例的控制流完整性校验装置可位于安卓操作系统的终端设备中,所述终端设备具体可以是手机、平板电脑等智能终端设备。
本实施例中,所述指令识别单元41识别移动终端中任一程序中可能存在的间接跳转指令,在重新编码前,识别出的间接跳转指令记为第一间接跳转指令;相应的,重新编码后的间接跳转指令记为第二间接跳转指令。
具体的,程序中的间接跳转指令的类型主要包括两种:表征函数间接跳转指令的第一类型和表征函数内间接跳转指令的第二类型。其中,第一类型的第一间接跳转指令主要具有三种形式:call reg、call[reg]、call[reg+offset];其中,reg表示通用寄存器,作为一种实施方式,在x86平台下reg可以是eax、ebx、ecx、edx等通用寄存器类型;offset表示偏移,可以是正值或负值。第二类型的第一间接跳转指令例如switch分支调用,第二类型的第一间接跳转指令主要具有三种形式:jmp reg、jmp[reg]、jmp[reg+offset];其中,reg表示通用寄存器,在x86平台下reg可以是eax、ebx、ecx、edx等通用寄存器类型;offset表示偏移,可以是正值或负值。基于此,本实施例中所述指令识别单元41可对程序中的指令的字段进行识别,当识别出的指令的字段满足上述形式时,可确定相应的指令为第一间接跳转指令;以及,识别出的指令中包括call或jmp字段时,可分别确定所述第一间接跳转指令为第一类型的第一间接跳转指令或第二类型的第一间接跳转指令,以获得所述第一间接跳转指令的类型特征信息。
本实施例中,所述指令识别单元41,用于获得所述第一间接跳转指令的特征信息,所述特征信息包括:所述第一间接跳转指令的类型、是否对寄存器进行解引用、是否具有偏移以及寄存器信息;所述第一间接跳转指令的类型包括:表征函数间接跳转指令的第一类型和表征函数内间接跳转指令的第二类型。从而所述编码单元42基于获得的特征信息对所述第一间接指令进行编码生成通过两个字节表示的第二间接跳转指令,将所述程序中的第一间接跳转指令修改为所述第二间接跳转指令。由于间接跳转指令(即所述第一间接跳转指令)的长度在2个字节到6个字节之间,如果在原有指令上进行操作,不会超过本身指令长度;如果对间接跳转指令的定制超过了指令本身的长度,就需要对二进制文件(即程序本身)进行大范围地重写。因此,本发明实施例保证在指令的长度范围内进行操作,只针对间接跳转指令进行修改,修改后的间接跳转指令(即第二间接跳转指令)通过两个字节表示,避免了二进制文件需要大范围的重写。
本实施例中,所述编码单元42,用于基于预设规则对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,使所述第二间接跳转指令的第一字节携带特定指令;所述第二间接跳转指令的第二字节表示所述特征信息;所述特定指令用于将所述第二间接跳转指令转移至所述补充程序,以由所述补充程序对所述第二间接跳转指令进行控制流完整性校验。
具体的,所述第二间接跳转指令的第一个字节定义为所述特定指令,也即0至7比特位内容定义为所述特定指令;所述特定指令例如可表示为0xCC,也即0至7比特位内容定义为0xCC;0xCC可在x86平台下使所述程序接收到SIGTRAP信号,通过所述程序中的注册SIGTRAP的信号处理程序,可将所述程序的控制流转移到本实施例中的补充程序中,通过补充程序对控制流的完整性进行校验。本实施例中,所述第一间接跳转指令的特征信息包括:所述第一间接跳转指令的类型、是否对寄存器进行解引用、是否具有偏移以及寄存器信息等等。作为一种实施方式,可通过一比特位(例如比特位8)定义是否对寄存器进行解引用,如call eax和call[eax],直接使用寄存器记为0,对寄存器进行解引用记为1。可通过一比特位(例如比特位9)定义间接跳转指令的类型是call类型还是jmp类型,call指令可记为0,jmp指令可记为1。可通过一比特位(例如比特位10)定义是否需要偏移,如call[eax]和call[eax+offset],使用偏移记为0,不使用偏移记为1。可通过四个比特位(例如比特位11至14)标记使用的寄存器信息,存器编码可按照EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP以及EIP从0开始编码。对间接跳转指令的一种编码示意可如图2所示,比特(Bit)0至7定义“0xCC”;Bit8定义是否对寄存器进行解引用;Bit9定义间接跳转指令的类型是call类型还是jmp类型,可标记为“call or jmp”;Bit10定义是否需要偏移,可标记为“offset set?”;Bit11-14标记使用的寄存器信息,可标记为“register”;Bit15定义为取消定义,可标记为“undef”。例如,若第一间接跳转指令为call[ecx],则按照图2所示的编码规则进行重新编码后的第二间接跳转指令可表示为“\xFF\xA4”。进一步地,所述编码单元42将程序中的第一间接跳转指令修改为重新编码获得的通过两个字节表示的第二间接跳转指令,这样,通过对程序中的间接跳转指令的修改,避免了二进制文件大范围的重写。
本实施例中,在所述校验单元43中预先配置补充程序,所述补充程序用于对控制流进行完整性校验,即判定是否发生控制流劫持攻击。具体的,在程序执行到间接跳转指令(即所述第二间接跳转指令)时,可通过所述间接跳转指令中第一字节定义的特定指令,将所述间接跳转指令转移至所述补充程序,通过所述补充程序的执行对所述间接跳转指令进行完整性校验,以判定所述间接跳转指令是否发生控制流劫持攻击。本实施例中依据所述第二间接跳转指令的类型的不同预先定义所述补充程序中的校验规则。
作为第一种实施方式,所述校验单元43,用于当所述第二间接跳转指令属于第一类型时,获得所述第二间接跳转指令的目的地址;判断所述目的地址是否满足第一预设数据集合中的数据特征;当所述目的地址不满足第一预设数据集合中的数据特征时,确定发生所述控制流劫持攻击;或者,判断所述目的地址是否满足所述程序的地址;当所述目的地址不满足所述程序的地址时,确定发生所述控制流劫持攻击。
具体的,对于属于第一类型的第二间接跳转指令,也可以理解为“call”形式的间接跳转指令,例如call reg、call[reg]、call[reg+offset]等等,属于第一类型的第二间接跳转指令(即call形式的间接跳转指令)的目的地址是函数。则预先收集函数特征并生成第一预设数据集合;则当所述第二间接跳转地址的目的地址满足所述第一预设数据集合中的数据特征时,表明所述第二间接跳转指令是正常的控制流;相应的,若所述第二间接跳转地址的目的地址不满足所述第一预设数据集合中的数据特征,则表明发生控制流劫持攻击。另一方面,基于所述第二间接跳转指令的目的地址是否满足所述程序所在的地址,也即判断所述第二间接跳转指令的目的地址是否在所述程序内部;当所述第二间接跳转指令的目的地址满足所述程序所在的地址时,表明所述第二间接跳转指令的目的地址在所述程序内部,也即表明所述第二间接跳转指令是正常的控制流;相应的,当所述第二间接跳转指令的目的地址不满足所述程序所在的地址时,表明所述第二间接跳转指令的目的地址不在所述程序内部,表明发生控制流劫持攻击。
作为第二种实施方式,所述校验单元43,用于当所述第二间接跳转指令属于第二类型时,获得所述第二间接跳转指令的目的地址;判断所述目的地址是否满足所述程序的地址;当所述目的地址不满足所述程序的地址时,确定发生所述控制流劫持攻击;或者,判断所述目的地址是否在第二预设数据集合中、且所述第二间接跳转指令是否表征特定结构的间接跳转;当所述目的地址不在第二预设数据集合中,或者所述第二间接跳转指令不表征特定结构的间接跳转时,确定发生所述控制流劫持攻击。
具体的,对于属于第二类型的第二间接跳转指令,也可以理解为“jmp”形式的间接跳转指令,例如jmp reg、jmp[reg]、jmp[reg+offset]等等。属于第二类型的第二间接跳转指令(即jmp形式的间接跳转指令)的用途在于两个方面,一是用于switch结构的跳转,另一个是函数指针的调用。一方面,基于所述第二间接跳转指令的目的地址是否满足所述程序所在的地址,也即判断所述第二间接跳转指令的目的地址是否在所述程序内部;当所述第二间接跳转指令的目的地址满足所述程序所在的地址时,表明所述第二间接跳转指令的目的地址在所述程序内部,也即表明所述第二间接跳转指令是正常的控制流;相应的,当所述第二间接跳转指令的目的地址不满足所述程序所在的地址时,表明所述第二间接跳转指令的目的地址不在所述程序内部,表明发生控制流劫持攻击。另一方面,预先对所述程序进行静态分析,获得所有的switch结构的间接跳转指令并记录switch表(switch table)的地址生成第二预设数据集合;则一方面,判断所述第二间接跳转指令的目的地址是否在所述第二预设数据集合中,具体是判断所述第二间接跳转指令的目的地址是否在所述第二预设数据集合的switch table中;当所述第二间接跳转指令的目的地址不在所述第二预设数据集合中,则表明发生控制流劫持攻击;另一方面,判断所述第二间接跳转指令是否表征特定结构的间接跳转,也即判断所述第二间接跳转指令是否表征switch结构跳转;当所述第二间接跳转指令不表征switch结构跳转时,则表明发生控制流劫持攻击;相应的,当所述第二间接跳转指令的目的地址在所述第二预设数据集合中、且所述第二间接跳转指令表征switch结构跳转时,表明所述第二间接跳转指令是正常的控制流。其中,判断所述第二间接跳转指令是否表征特定结构的间接跳转,具体可通过判断所述第二间接跳转指令的形式是否满足所述特定结构的形式判定,例如判断所述第二间接跳转指令是否满足switch结构,也即判断所述第二间接跳转指令是否满足例如jmp reg、jmp[reg]或jmp[reg+offset]等结构形式。
本实施例所述校验单元43采用上述两种实施方式的判定依据配置补充程序,以基于所述补充程序对所述第二间接跳转指令进行控制流完整性校验。所述补充程序可通过shellcode表示。
作为另一种实施方式,所述校验单元43,用于在所述程序中插入所述补充程序,以使所述程序加载之前执行所述补充程序中的注册信号处理。
具体的,所述补充程序中还包括注册信号处理子程序,所述注册信号处理子程序可通过注册信号处理函数实现;在程序中插入所述补充程序时,修改所述程序的入口点,使所述程序的入口点指向所述补充程序,具体是指向所述补充程序中的注册信号处理子程序,这样,在所述程序开始执行时执行所述补充程序中的注册信号处理子程序,在所述注册信号处理子程序执行完成、也即信号处理函数注册完成后,重新跳转回所述程序的入口点执行所述程序;在所述程序执行所述第二间接跳转指令时,跳转至所述补充程序,由所述补充程序对所述第二间接跳转指令进行完整性校验;具体的,将补充程序插入至程序以及跳转示意具体可参见图3中所示。
本实施例中,所述补充程序(即shellcode)的配置,在实际应用中可采用汇编或者内联汇编方式实现,其次实现的代码是位置无关的代码,而且所述补充程序中不依赖任何库函数的调用,必要的地方都需要通过系统调用实现。本实施例配置的补充程序具有以下特点:
1、能对程序控制流的完整性作出校验。当程序正常执行时保证程序能够正常地运行,当程序的控制流被劫持的情况下,能够检测出控制流被劫持从而退出程序的执行;
2、在程序控制流的完整性得到校验后能够返回程序的正常执行流程,保证程序的正常运行;
3、能区分各种间接跳转指令的特点,并对其做针对性的控制流完整性校验;
4、不仅可以保护可执行程序,也可以对动态链接的库文件进行保护。
基于此,本实施例中,所述校验单元43,还用于当通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验后确定所述第二间接跳转指令是正常的控制流时,返回执行所述程序;当通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验后确定发生控制流劫持攻击时,终止执行所述程序。
本发明实施例中,所述控制流完整性校验装置中的指令识别单元41、编码单元42和校验单元43,在实际应用中均可由中央处理器(CPU,Central Processing Unit)、数字信号处理器(DSP,Digital Signal Processor)、微控制单元(MCU,Microcontroller Unit)或可编程门阵列(FPGA,Field-Programmable Gate Array)实现。
本发明实施例还提供了一种控制流完整性校验装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现本发明实施例所述的控制流完整性校验方法的步骤。
图5为本发明实施例的控制流完整性校验装置的一种硬件组成结构示意图;如图5所示,控制流完整性校验装置700包括:至少一个处理器701、存储器702、至少一个网络接口704和用户接口703。控制流完整性校验装置700中的各个组件通过总线系统705耦合在一起。可理解,总线系统705用于实现这些组件之间的连接通信。总线系统705除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图5中将各种总线都标为总线系统705。
其中,用户接口703可以包括显示器、键盘、鼠标、轨迹球、点击轮、按键、按钮、触感板或者触摸屏等。
可以理解,存储器702可以是易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(ROM,Read Only Memory)、可编程只读存储器(PROM,Programmable Read-Only Memory)、可擦除可编程只读存储器(EPROM,Erasable Programmable Read-Only Memory)、电可擦除可编程只读存储器(EEPROM,Electrically Erasable Programmable Read-Only Memory)、磁性随机存取存储器(FRAM,ferromagnetic random access memory)、快闪存储器(Flash Memory)、磁表面存储器、光盘、或只读光盘(CD-ROM,Compact Disc Read-Only Memory);磁表面存储器可以是磁盘存储器或磁带存储器。易失性存储器可以是随机存取存储器(RAM,Random AccessMemory),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的RAM可用,例如静态随机存取存储器(SRAM,Static Random Access Memory)、同步静态随机存取存储器(SSRAM,Synchronous Static Random Access Memory)、动态随机存取存储器(DRAM,Dynamic Random Access Memory)、同步动态随机存取存储器(SDRAM,SynchronousDynamic Random Access Memory)、双倍数据速率同步动态随机存取存储器(DDRSDRAM,Double Data Rate Synchronous Dynamic Random Access Memory)、增强型同步动态随机存取存储器(ESDRAM,Enhanced Synchronous Dynamic Random Access Memory)、同步连接动态随机存取存储器(SLDRAM,SyncLink Dynamic Random Access Memory)、直接内存总线随机存取存储器(DRRAM,Direct Rambus Random Access Memory)。本发明实施例描述的存储器702旨在包括但不限于这些和任意其它适合类型的存储器。
本发明实施例中的存储器702用于存储各种类型的数据以支持控制流完整性校验装置700的操作。这些数据的示例包括:用于在控制流完整性校验装置700上操作的任何计算机程序,如操作系统7021和应用程序7022等等。其中,操作系统7021包含各种系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务。应用程序7022可以包含各种应用程序,例如媒体播放器(Media Player)、浏览器(Browser)等,用于实现各种应用业务。实现本发明实施例方法的程序可以包含在应用程序7022中。
上述本发明实施例揭示的方法可以应用于处理器701中,或者由处理器701实现。处理器701可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器701中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器701可以是通用处理器、DSP、或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。处理器701可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合本发明实施例所公开的方法的步骤,可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于存储介质中,该存储介质位于存储器702,处理器701读取存储器702中的信息,结合其硬件完成前述方法的步骤。
在示例性实施例中,控制流完整性校验装置700可以被一个或多个应用专用集成电路(ASIC,Application Specific Integrated Circuit)、DSP、可编程逻辑器件(PLD,Programmable Logic Device)、复杂可编程逻辑器件(CPLD,Complex Programmable LogicDevice)、FPGA、通用处理器、控制器、微控制器(MCU,Micro Controller Unit)、微处理器(Microprocessor)、或其他电子元件实现,用于执行前述方法。
在示例性实施例中,本发明实施例还提供了一种计算机可读存储介质,例如包括计算机程序的存储器702,上述计算机程序可由控制流完整性校验装置700的处理器701执行,以完成前述方法所述步骤。计算机可读存储介质可以是FRAM、ROM、PROM、EPROM、EEPROM、Flash Memory、磁表面存储器、光盘、或CD-ROM等存储器;也可以是包括上述存储器之一或任意组合的各种设备,如移动电话、计算机、平板设备、个人数字助理等。
本发明实施例提供的一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器运行时,执行:识别程序中的第一间接跳转指令,获得所述第一间接跳转指令的特征信息;
基于所述特征信息对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,将所述程序中的第一间接跳转指令修改为所述第二间接跳转指令;
基于插入所述程序中的补充程序,在所述程序执行所述第二间接跳转指令时,通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验。
本实施例中,该计算机程序被处理器运行时,执行:获得所述第一间接跳转指令的特征信息,所述特征信息包括:所述第一间接跳转指令的类型、是否对寄存器进行解引用、是否具有偏移以及寄存器信息;
所述第一间接跳转指令的类型包括:表征函数间接跳转指令的第一类型和表征函数内间接跳转指令的第二类型。
本实施例中,该计算机程序被处理器运行时,执行:当所述第二间接跳转指令属于第一类型时,获得所述第二间接跳转指令的目的地址;判断所述目的地址是否满足第一预设数据集合中的数据特征;当所述目的地址不满足第一预设数据集合中的数据特征时,确定发生所述控制流劫持攻击;或者,判断所述目的地址是否满足所述程序的地址;当所述目的地址不满足所述程序的地址时,确定发生所述控制流劫持攻击。
本实施例中,该计算机程序被处理器运行时,执行:当所述第二间接跳转指令属于第二类型时,获得所述第二间接跳转指令的目的地址;判断所述目的地址是否满足所述程序的地址;当所述目的地址不满足所述程序的地址时,确定发生所述控制流劫持攻击;或者,判断所述目的地址是否在第二预设数据集合中、且所述第二间接跳转指令是否表征特定结构的间接跳转;当所述目的地址不在第二预设数据集合中,或者所述第二间接跳转指令不表征特定结构的间接跳转时,确定发生所述控制流劫持攻击。
本实施例中,该计算机程序被处理器运行时,执行:基于预设规则对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,使所述第二间接跳转指令的第一字节携带特定指令;所述第二间接跳转指令的第二字节表示所述特征信息;所述特定指令用于将所述第二间接跳转指令转移至所述补充程序,以由所述补充程序对所述第二间接跳转指令进行控制流完整性校验。
本实施例中,该计算机程序被处理器运行时,执行:将所述程序中的第一间接跳转指令修改为所述第二间接跳转指令之后,在所述程序中插入所述补充程序,以使所述程序加载之前执行所述补充程序中的注册信号处理。
在本申请所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。
上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元,即可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。
另外,在本发明各实施例中的各功能单元可以全部集成在一个处理单元中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
或者,本发明上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本发明各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储设备、ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

Claims (14)

1.一种控制流完整性校验方法,其特征在于,所述方法包括:
识别程序中的第一间接跳转指令,获得所述第一间接跳转指令的特征信息;
基于所述特征信息对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,将所述程序中的第一间接跳转指令修改为所述第二间接跳转指令;
基于插入所述程序中的补充程序,在所述程序执行所述第二间接跳转指令时,通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验。
2.根据权利要求1所述的方法,其特征在于,所述获得所述第一间接跳转指令的特征信息,包括:
获得所述第一间接跳转指令的特征信息,所述特征信息包括:所述第一间接跳转指令的类型、是否对寄存器进行解引用、是否具有偏移以及寄存器信息;
所述第一间接跳转指令的类型包括:表征函数间接跳转指令的第一类型和表征函数内间接跳转指令的第二类型;
所述第二间接跳转指令的类型包括:所述第一类型和所述第二类型。
3.根据权利要求2所述的方法,其特征在于,所述通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验,包括:
当所述第二间接跳转指令属于第一类型时,获得所述第二间接跳转指令的目的地址;
判断所述目的地址是否满足第一预设数据集合中的数据特征;当所述目的地址不满足第一预设数据集合中的数据特征时,确定发生控制流劫持攻击;
或者,判断所述目的地址是否满足所述程序的地址;当所述目的地址不满足所述程序的地址时,确定发生控制流劫持攻击。
4.根据权利要求2所述的方法,其特征在于,所述通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验,包括:
当所述第二间接跳转指令属于第二类型时,获得所述第二间接跳转指令的目的地址;
判断所述目的地址是否满足所述程序的地址;当所述目的地址不满足所述程序的地址时,确定发生控制流劫持攻击;
或者,判断所述目的地址是否在第二预设数据集合中、且所述第二间接跳转指令是否表征特定结构的间接跳转;
当所述目的地址不在第二预设数据集合中,或者所述第二间接跳转指令不表征特定结构的间接跳转时,确定发生控制流劫持攻击。
5.根据权利要求1所述的方法,其特征在于,所述基于所述特征信息对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,包括:
基于预设规则对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,使所述第二间接跳转指令的第一字节携带特定指令;所述第二间接跳转指令的第二字节表示所述特征信息;
所述特定指令用于将所述第二间接跳转指令转移至所述补充程序,以由所述补充程序对所述第二间接跳转指令进行控制流完整性校验。
6.根据权利要求1所述的方法,其特征在于,所述将所述程序中的第一间接跳转指令修改为所述第二间接跳转指令之后,所述方法还包括:在所述程序中插入所述补充程序,以使所述程序加载之前执行所述补充程序中的注册信号处理。
7.一种控制流完整性校验装置,其特征在于,所述装置包括:指令识别单元、编码单元和校验单元;其中,
所述指令识别单元,用于识别程序中的第一间接跳转指令,获得所述第一间接跳转指令的特征信息;
所述编码单元,用于基于所述指令识别单元获得的所述特征信息对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,将所述程序中的第一间接跳转指令修改为所述第二间接跳转指令;
所述校验单元,用于基于插入所述程序中的补充程序,在所述程序执行所述第二间接跳转指令时,通过所述补充程序对所述第二间接跳转指令进行控制流完整性校验。
8.根据权利要求7所述的装置,其特征在于,所述指令识别单元,用于获得所述第一间接跳转指令的特征信息,所述特征信息包括:所述第一间接跳转指令的类型、是否对寄存器进行解引用、是否具有偏移以及寄存器信息;所述第一间接跳转指令的类型包括:表征函数间接跳转指令的第一类型和表征函数内间接跳转指令的第二类型;
所述第二间接跳转指令的类型包括:所述第一类型和所述第二类型。
9.根据权利要求8所述的装置,其特征在于,所述校验单元,用于当所述第二间接跳转指令属于第一类型时,获得所述第二间接跳转指令的目的地址;判断所述目的地址是否满足第一预设数据集合中的数据特征;当所述目的地址不满足第一预设数据集合中的数据特征时,确定发生控制流劫持攻击;或者,判断所述目的地址是否满足所述程序的地址;当所述目的地址不满足所述程序的地址时,确定发生控制流劫持攻击。
10.根据权利要求8所述的装置,其特征在于,所述校验单元,用于当所述第二间接跳转指令属于第二类型时,获得所述第二间接跳转指令的目的地址;判断所述目的地址是否满足所述程序的地址;当所述目的地址不满足所述程序的地址时,确定发生控制流劫持攻击;或者,判断所述目的地址是否在第二预设数据集合中、且所述第二间接跳转指令是否表征特定结构的间接跳转;当所述目的地址不在第二预设数据集合中,或者所述第二间接跳转指令不表征特定结构的间接跳转时,确定发生控制流劫持攻击。
11.根据权利要求7所述的装置,其特征在于,所述编码单元,用于基于预设规则对所述第一间接跳转指令进行编码生成通过两个字节表示的第二间接跳转指令,使所述第二间接跳转指令的第一字节携带特定指令;所述第二间接跳转指令的第二字节表示所述特征信息;所述特定指令用于将所述第二间接跳转指令转移至所述补充程序,以由所述补充程序对所述第二间接跳转指令进行控制流完整性校验。
12.根据权利要求7所述的装置,其特征在于,所述校验单元,用于在所述程序中插入所述补充程序,以使所述程序加载之前执行所述补充程序中的注册信号处理。
13.一种控制流完整性校验装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1至7任一项所述的控制流完整性校验方法的步骤。
14.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现权利要求1至7任一项所述的控制流完整性校验方法的步骤。
CN201710340488.6A 2017-05-15 2017-05-15 一种控制流完整性校验方法、装置和计算机存储介质 Active CN108875369B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710340488.6A CN108875369B (zh) 2017-05-15 2017-05-15 一种控制流完整性校验方法、装置和计算机存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710340488.6A CN108875369B (zh) 2017-05-15 2017-05-15 一种控制流完整性校验方法、装置和计算机存储介质

Publications (2)

Publication Number Publication Date
CN108875369A CN108875369A (zh) 2018-11-23
CN108875369B true CN108875369B (zh) 2020-07-07

Family

ID=64320442

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710340488.6A Active CN108875369B (zh) 2017-05-15 2017-05-15 一种控制流完整性校验方法、装置和计算机存储介质

Country Status (1)

Country Link
CN (1) CN108875369B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114924808B (zh) * 2022-05-12 2023-03-14 中国电子科技集团公司第二十九研究所 一种基于双份存储程序的sram型fpga在轨可靠加载方法

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103345445A (zh) * 2013-07-02 2013-10-09 华中科技大学 基于控制流检测的抗错误注入攻击的安全芯片设计方法
CN103679040A (zh) * 2012-09-06 2014-03-26 北京中天安泰信息科技有限公司 数据安全读取方法及装置
CN106325827A (zh) * 2015-06-16 2017-01-11 深圳市中兴微电子技术有限公司 一种随机测试程序生成方法及装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9329883B2 (en) * 2013-10-28 2016-05-03 Unisys Corporation Post-execution instruction tracing of virtualized instructions

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103679040A (zh) * 2012-09-06 2014-03-26 北京中天安泰信息科技有限公司 数据安全读取方法及装置
CN103345445A (zh) * 2013-07-02 2013-10-09 华中科技大学 基于控制流检测的抗错误注入攻击的安全芯片设计方法
CN106325827A (zh) * 2015-06-16 2017-01-11 深圳市中兴微电子技术有限公司 一种随机测试程序生成方法及装置

Also Published As

Publication number Publication date
CN108875369A (zh) 2018-11-23

Similar Documents

Publication Publication Date Title
CN108885660B (zh) 用于元数据处理的技术
US10467407B2 (en) Method and system for detecting kernel corruption exploits
De Clercq et al. A survey of hardware-based control flow integrity (CFI)
CN102592082B (zh) 通过操作码随机化的安全
CN108475223B (zh) 检测计算环境的堆栈的损坏的方法、系统和计算机程序产品
US8850573B1 (en) Computing device with untrusted user execution mode
US10228992B2 (en) Providing instructions to facilitate detection of corrupt stacks
EP2842041B1 (en) Data processing system and method for operating a data processing system
US9516056B2 (en) Detecting a malware process
EP3807797A1 (en) Pointer authentication and dynamic switching between pointer authentication regimes
TW201128383A (en) Portable executable file analysis
US20220374415A1 (en) Systems and methods for updating metadata
Peles et al. One class to rule them all: 0-day deserialization vulnerabilities in android
CN111837111A (zh) 用于存储有界指针的装置和方法
US10114948B2 (en) Hypervisor-based buffer overflow detection and prevention
GB2577947A (en) Verifying stack pointer
CN112541178A (zh) 控制流完整性实施的设备和方法
US10120745B2 (en) Providing instructions to protect stack return addresses in a hardware managed stack architecture
CN115510430A (zh) 一种函数指针及其数据依赖的识别与保护方法、装置
JP7377807B2 (ja) リンク付き分岐命令の分岐ターゲット・バリアント
CN108875369B (zh) 一种控制流完整性校验方法、装置和计算机存储介质
KR20170060815A (ko) 메모리의 커널영역을 보호하기 위한 전자장치 및 방법
CN109446755B (zh) 内核钩子函数保护方法、装置、设备以及存储介质
US9026859B1 (en) Safer mechanism for using pointers to code
CN112948863B (zh) 敏感数据的读取方法、装置、电子设备及存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant