CN115510430A - 一种函数指针及其数据依赖的识别与保护方法、装置 - Google Patents
一种函数指针及其数据依赖的识别与保护方法、装置 Download PDFInfo
- Publication number
- CN115510430A CN115510430A CN202211121918.2A CN202211121918A CN115510430A CN 115510430 A CN115510430 A CN 115510430A CN 202211121918 A CN202211121918 A CN 202211121918A CN 115510430 A CN115510430 A CN 115510430A
- Authority
- CN
- China
- Prior art keywords
- function
- pointer
- function pointer
- data
- memory
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
- G06F21/54—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by adding security routines or objects to programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/14—Protection against unauthorised use of memory or access to memory
- G06F12/1458—Protection against unauthorised use of memory or access to memory by checking the subject access rights
- G06F12/1491—Protection against unauthorised use of memory or access to memory by checking the subject access rights in a hierarchical protection system, e.g. privilege levels, memory rings
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/30—Authentication, i.e. establishing the identity or authorisation of security principals
- G06F21/44—Program or device authentication
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
- G06F21/53—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by executing in a restricted environment, e.g. sandbox or secure virtual machine
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
- G06F21/604—Tools and structures for managing or administering access control systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
- G06F21/62—Protecting access to data via a platform, e.g. using keys or access control rules
- G06F21/6218—Protecting access to data via a platform, e.g. using keys or access control rules to a system of files or objects, e.g. local or distributed file system or database
- G06F21/6281—Protecting access to data via a platform, e.g. using keys or access control rules to a system of files or objects, e.g. local or distributed file system or database at program execution time, where the protection is within the operating system
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
- G06F21/64—Protecting data integrity, e.g. using checksums, certificates or signatures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/70—Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer
- G06F21/78—Protecting specific internal or peripheral components, in which the protection of a component leads to protection of the entire computer to assure secure storage of data
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/10—Providing a specific technical effect
- G06F2212/1052—Security improvement
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/21—Indexing scheme relating to G06F21/00 and subgroups addressing additional information or applications relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/2141—Access rights, e.g. capability lists, access control lists, access tables, access matrices
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Health & Medical Sciences (AREA)
- Bioethics (AREA)
- Health & Medical Sciences (AREA)
- Databases & Information Systems (AREA)
- Automation & Control Theory (AREA)
- Storage Device Security (AREA)
Abstract
本发明公开了一种函数指针及其数据依赖的识别与保护方法、装置,其中的方法首先从给定的程序中识别出属于函数指针或至少包含一个函数指针的内存对象,然后采用污点分析的方法对函数指针及其数据依赖进行识别,再使用Intel MPK对这些数据进行保护。确保了它们的完整性,从而阻止了程序的执行路径被修改,提高了程序的安全性。
Description
技术领域
本发明涉及软件安全技术领域,尤其涉及一种函数指针及其数据依赖的识别与保护方法、装置。
背景技术
C/C++之类的语言给予开发者很大的自由度,使其能够自如地控制所有资源。这使得开发者能够极大地提升程序的效率,然而并不是所有人都能完美地手动管理内存和遵守类型规则,这就导致了安全问题的出现。攻击者利用缓冲区溢出、堆溢出之类的漏洞,引发内存损坏以读取和修改敏感数据或者执行恶意代码。
这已经成了迁延数十年的安全问题,针对它的攻防战也在不断进行。早期攻击者一般采用代码注入的方式,通过跳转执行注入的代码实现恶意行为。为了阻止这类攻击,研究者们提出了DEP(Data Execution Prevention)、Stack Canaries和地址空间布局随机化(Address Space Layout Randomization)等机制。而为了突破这些机制,攻击者又探索出代码重用攻击,通过修改control data如return addresses,不断将控制流转向选择好的地址,通常是被攻击程序中的代码片段,将它们连接起来以实现强有力的攻击(Turing-complete)。现在流行的代码重用攻击包括Return-to-libc、ROP(Return OrientedProgramming)、JOP(Jump Oriented Programming)等。由于不需要注入新代码而是直接重用已有的代码片段,所以DEP无效;而BROP等攻击在运行时动态搜索gadget,普通的ASLR也被绕过。除了针对control-data,攻击者还通过修改non-control data中user identitydata和decision-making data等关键数据,在不违背control-flow integrity的情况下影响程序行为,从而实现泄露数据或提权的目的。最近的研究限制,non-control dataattack能够实现更丰富的功能,是图灵完备的。
鉴于控制流劫持攻击的危险性,研究人员尝试从两个方面来防御它:控制流的完整性和代码指针的完整性。控制流完整性(CFI)是针对控制流劫持攻击的常用解决方案。它通过保证间接控制流转移指令(ICT)的转移目标不被攻击者恶意改变来阻止控制流劫持攻击。代码指针完整性(CPI)通过保护代码指针的内存安全来阻止控制流劫持攻击。早期的CPI通常只意识到需要对代码指针本身进行保护。而正式提出代码指针完整性这个概念的CPI,意识到为了保证代码指针的内存安全,还需要保护那些用于访问代码指针的数据指针。否则,通过修改这些数据指针,攻击者可以使程序从错误的内存中取出被认为是函数指针的值,从而间接修改代码指针。PARTS则更进一步,将代码指针完整性扩展为指针完整性,对所有的代码指针和数据指针进行保护,从而获得了更高的安全性。然而,CPI用来保护敏感指针的信息隐藏技术已经被证明不够安全,可以被timing side-channel attack和thread spraying攻破;PARTS则依赖于ARM架构的pointer authentication(PA)进行保护。所以,一种新的针对控制流劫持攻击的安全机制是有必要的。
发明内容
本发明提供了一种函数指针及其数据依赖的识别与保护方法、装置,用以解决或者至少部分解决现有技术中存在的安全性不高的技术问题。
为了解决上述技术问题,本发明第一方面提供了一种函数指针及其数据依赖的识别与保护方法,包括:
S1:对给定的程序进行基于类型和基于指针的分析,从中识别出属于函数指针或至少包含一个函数指针的内存对象;
S2:将每个函数的定义信息和使用信息进行串连构造过程间数据流图;
S3:将识别出的属于或者包含函数指针的内存对象作为污点源,并将所有间接函数调用点作为汇聚点,在构造的过程间数据流图中进行深度优先搜索实现前向污点传播,得到的从在污点源到汇聚点的路径表示一种可能的函数指针的计算流程,将路径上的指令作为参与函数指针计算的敏感指令;
S4:将得到的敏感指令作为污点源,以识别出的属于或者包含函数指针的内存对象作为汇聚点,在构造的过程间数据流图中进行深度优先搜索实现后向污点传播,得到的从污点源到汇聚点的路径,将路径上的内存对象作为敏感指令中函数指针所依赖的数据;
S5:将识别出的所有函数指针及其依赖的数据分配到硬件保护的内存中;
S6:将所述硬件保护的内存使用Intel MPK进行保护,并使用call gate切换特权用以允许程序中原本会写入函数指针及其依赖的数据的指令的访问。
在一种实施方式中,步骤S1包括:
依次遍历给定的程序的中的类型,如果一个类型是函数指针类型,则为敏感类型,如果一个类型是包含一个或多个敏感类型的复合类型,则递归判断该复合类型中的所有元素,若有一个元素为敏感类型,则该类型为敏感类型;在识别出所有敏感类型后,再次遍历给定的程序中的所有变量,如果一个变量的类型是敏感类型,则是这个变量为敏感变量;
采用基于指针的分析方法进行分析,如果一个指针的目标集合中存在函数,则将该指针视作为函数指针,并加入敏感变量集合中,同时将指针包含变量也加入敏感变量集合中。
在一种实施方式中,S3的前向污点传播过程中,从包含函数指针的内存对象开始,在间接函数调用点处结束,前向污点传播结束后,确定了所有从污点源到间接调用点的污点路径,每一条污点路径由一组污点指令组成,用以描述一个函数指针从创建到调用的生命周期。
在一种实施方式中,S4在后向污点传播中,从步骤S2识别出的污点指令开始,在碰到内存对象时结束传播,后向污点传播结束后,确定了所有从污点源到内存对象的污点路径,将污点路径上的内存对象作为函数指针依赖的数据。
在一种实施方式中,步骤S5包括:
如果函数指针及其依赖的数据是局部变量,则在分离的栈为所在的函数分配对应的栈帧;
如果函数指针及其依赖的数据是动态分配的变量,则用分离的堆的内存申请和释放函数替换原本的函数;
如果函数指针及其依赖的数据是在BBS段或DATA段中的静态变量,在pass中创建一个新的段和对应的全局变量,并将静态变量转移到全局变量中。
基于同样的发明构思,本发明第二方面提供了一种函数指针及其数据依赖的识别与保护装置,包括:
函数指针识别模块,用于对给定的程序进行基于类型和基于指针的分析,从中识别出属于函数指针或至少包含一个函数指针的内存对象;
过程间数据流图构造模块,用于将每个函数的定义信息和使用信息进行串连构造过程间数据流图;
敏感指令识别模块,用于将识别出的属于或者包含函数指针的内存对象作为污点源,并将所有间接函数调用点作为汇聚点,在构造的过程间数据流图中进行深度优先搜索实现前向污点传播,得到的从在污点源到汇聚点的路径表示一种可能的函数指针的计算流程,将路径上的指令作为参与函数指针计算的敏感指令;
数据依赖识别模块,用于将得到的敏感指令作为污点源,以识别出的属于或者包含函数指针的内存对象作为汇聚点,在构造的过程间数据流图中进行深度优先搜索实现后向污点传播,得到的从污点源到汇聚点的路径,将路径上的内存对象作为敏感指令中函数指针所依赖的数据;
内存分配模块,用于将识别出的所有函数指针及其依赖的数据分配到硬件保护的内存中;
保护模块,用于将所述硬件保护的内存使用Intel MPK进行保护,并使用callgate切换特权用以允许程序中原本会写入函数指针及其依赖的数据的指令的访问。
基于同样的发明构思,本发明第三方面提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被执行时实现第一方面所述的方法。
基于同样的发明构思,本发明第四方面提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现第一方面所述的方法。
相对于现有技术,本发明的优点和有益的技术效果如下:
本发明公开的函数指针及其数据依赖的识别与保护方法,首先采用基于类型和基于指针的分析方法识别出属于函数指针或至少包含一个函数指针的内存对象,并构造过程间数据流图,进一步地使用前向污点传播和后向污点传播对识别出的内存对象进行分析,识别出目标函数指针(敏感指令)及其所依赖的数据,再使用Intel MPK对这些函数指针和依赖的数据进行保护。确保了数据的完整性,并且阻止了程序的执行路径被修改,从而可以提高程序的安全性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例的函数指针及其依赖数据的完整性保护方法的流程图;
图2是本发明实施例的separated stack和separated heap的布局示意图;
图3是本发明实施例的call gate汇编代码示意图;
图4为本发明实施例提供的函数指针及其数据依赖的识别与保护方法装置的结构框图;
图5为本发明实施例提供的计算机可读存储介质的结构示意图;
图6为本发明实施例提供的计算机设备的结构示意图。
具体实施方式
本发明主要基于污点分析和基于硬件的隔离机制,考虑函数指针的声明周期中使用到的所有数据,提出的一种函数指针及其数据依赖的识别与保护方法及装置,充分考虑了函数指针的特性,通过污点分析(前向污点传播和后向污点传播)来识别需要保护的数据,保证了数据的完整性,进一步地,通过硬件保护的内存来对识别出的数据进行保护,从而能够为软件提供更高的安全性。
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例一
本发明实施例提供了一种函数指针及其数据依赖的识别与保护方法,包括:
S1:对给定的程序进行基于类型和基于指针的分析,从中识别出属于函数指针或至少包含一个函数指针的内存对象;
S2:将每个函数的定义信息和使用信息进行串连构造过程间数据流图;
S3:将识别出的属于或者包含函数指针的内存对象作为污点源,并将所有间接函数调用点作为汇聚点,在构造的过程间数据流图中进行深度优先搜索实现前向污点传播,得到的从在污点源到汇聚点的路径表示一种可能的函数指针的计算流程,将路径上的指令作为参与函数指针计算的敏感指令;
S4:将得到的敏感指令作为污点源,以识别出的属于或者包含函数指针的内存对象作为汇聚点,在构造的过程间数据流图中进行深度优先搜索实现后向污点传播,得到的从污点源到汇聚点的路径,将路径上的内存对象作为敏感指令中函数指针所依赖的数据;
S5:将识别出的所有函数指针及其依赖的数据分配到硬件保护的内存中;
S6:将所述硬件保护的内存使用Intel MPK进行保护,并使用call gate切换特权用以允许程序中原本会写入函数指针及其依赖的数据的指令的访问。
请参见图1,是本发明实施例的函数指针及其依赖数据的完整性保护方法的流程图。
具体来说,通过基于类型的分析方法可以得到大部分的函数指针,进一步结合基于指针的分析方法得到可能遗漏的函数指针,从而保证识别的准确性。
过程间数据流图通过将每个函数的def-use chain(定义信息和使用信息链)串连起来构造。包含数据的定义信息和使用信息,例如哪条指令使用了哪个数据。
步骤S3和步骤S4的污点分析是基于过程间数据流图来实现的,其中,sources是污点源,sinks是汇聚点。前向污点传播以污点源作为起点,进行深度优先搜索,如果一条路径抵达了汇聚点,则找到了一条污点路径。后向污点传播则是以步骤S3中的敏感指令为污点源,以识别出的属于或者包含函数指针的内存对象作为汇聚点,进行深度优先搜索来实现,传播过程中在碰到内存对象时结束传播,所有被污染的内存对象都是函数指针依赖的数据。
在一种实施方式中,步骤S1包括:
依次遍历给定的程序的中的类型,如果一个类型是函数指针类型,则为敏感类型,如果一个类型是包含一个或多个敏感类型的复合类型,则递归判断该复合类型中的所有元素,若有一个元素为敏感类型,则该类型为敏感类型;在识别出所有敏感类型后,再次遍历给定的程序中的所有变量,如果一个变量的类型是敏感类型,则是这个变量为敏感变量;
采用基于指针的分析方法进行分析,如果一个指针的目标集合中存在函数,则将该指针视作为函数指针,并加入敏感变量集合中,同时将指针包含变量也加入敏感变量集合中。
具体实施过程中,首先使用基于类型的静态分析进行识别,一个变量是sensitivevariable(敏感变量)当且仅当它的类型是sensitive type(敏感类型),sensitive type包括函数指针类型和包含一个或多个sensitive type的复合类型。在确定sensitive type时,依次遍历目标程序的所有类型,并分别对不同类型进行处理:如果一个类型是基本类型,比如整型,那么它应该被忽略;如果是函数指针,那显然是sensitive type;如果是其它指针,那么忽略;如果是复合,那么递归判断它的所有元素,只要有一个属于sensitivetype,那么它就是sensitive type。在识别出所有sensitive type后,再次遍历程序的所有变量,如果一个变量的类型是sensitive type,那么这个变量就是sensitive variable。
需要说明的是,敏感类型和敏感变量是指与程序安全相关的分析出来的类型和变量。
基于类型的静态分析得到的sensitive variables是不全的:通用指针实际上也可能指向函数。以char*为例,在C/C++标准中,尽管它的类型显示它应该指向字符串,但它实际上允许指向任何类型的对象,其中也包括函数。然而由于它的类型中没有明确指明为函数类型,之前的方法遗漏了这种情况。
为此,使用context-,flow-and field sensitive(上下文敏感、流敏感且域敏感)的指针分析对基于类型的静态分析得到的结果进行补充:如果一个指针的points-to set(目标集合,其包含了该指针可能指向的所有内存对象)中存在函数的话,也将其视为函数指针,加入sensitive variable set(敏感变量集合)中,并将包含它的变量(递归的)也加入其中。这个筛选方法基于这样一个事实,即指针分析得到的结果是指针在整个程序中所有可能指向的内存对象的集合,如果这个集合中存在函数,就意味着它在程序运行过程中可能用于间接调用。
在一种实施方式中,S3的前向污点传播过程中,从包含函数指针的内存对象开始,在间接函数调用点处结束,前向污点传播结束后,确定了所有从污点源到间接调用点的污点路径,每一条污点路径由一组污点指令组成,用以描述一个函数指针从创建到调用的生命周期。
具体来说,将步骤S1中得到的包含函数指针的内存对象作为sources,并将所有间接函数调用点作为sinks,进行前向污点传播。前向污点传播从包含函数指针的内存对象开始,在间接函数调用点处结束。在这个过程中,如果一条指令的任何一个操作数被污染了,那么这条指令的结果也同样会被污染。前向污点传播结束后,确定了所有从污点源到间接调用点的污点路径。每一条污点路径都由一组污点指令组成,描述了一个函数指针从创建到调用的生命周期。注意,在LLVM IR中,一条指令和它的结果值(如果存在)在语义上是等价的,可以相互替代。
在一种实施方式中,S4在后向污点传播中,从步骤S2识别出的污点指令开始,在碰到内存对象时结束传播,后向污点传播结束后,确定了所有从污点源到内存对象的污点路径,将污点路径上的内存对象作为函数指针依赖的数据。
具体来说,将步骤S2中得到的所有污点指令作为sources,进行后向污点传播,并在碰到内存对象时结束传播。在后向污点传播中,如果一条指令是污点指令,那么它的所有操作数都会被污染。如果一条内存操作指令是污点指令,那么这条指令的地址操作数指向的所有内存都将被污染。后向污点传播得到的结果是被污染的内存对象,也就是函数指针所依赖的数据。
具体实施过程中,指向的内存使用指令分析来获取,即位于该地址操作数的points-to set中的内存。举例来说,如果一条phi指令是污点指令,那么它所对应的condition也(分支条件,即分支语句中的条件语句)将会被污染。Phi指令用于实现StaticSingle Assignment(静态单赋值形式SSA)形式中的phi node。在SSA形式中,每一个变量只能被赋值一次,如果一个变量在不同的执行路径中都被赋值了,SSA就用一个phi node来表示它,在运行时根据执行的路径来选择它的值。因此,决定执行哪条路径的变量也是phi指令的依赖,如果phi指令被污染了,那么对应的变量也将被污染。这个变量位于这些路径的共同起点,即一个分支指令。为了找到这个分支指令,需要根据函数的控制流图构建它的支配树。在控制流图中,一个节点a支配另一个节点b当且仅当所有从入口节点抵达节点b的路径都必须通过节点a。所以。被污染的phi指令的immediately dominator(立刻支配者,指支配树中某一节点最近的一个支配节点)就是要找的分支指令。
在一种实施方式中,步骤S5包括:
如果函数指针及其依赖的数据是局部变量,则在分离的栈为所在的函数分配对应的栈帧;
如果函数指针及其依赖的数据是动态分配的变量,则用分离的堆的内存申请和释放函数替换原本的函数;
如果函数指针及其依赖的数据是在BSS段或DATA段中的静态变量,在pass中创建一个新的段和对应的全局变量,并将静态变量转移到全局变量中。
具体来说,separated stack、separated heap和separated section分别表示分离的栈、分离的堆和ELF段。Section指可执行文件中的段,safe section是本发明实施例创建的一个专门用于存放需要保护的全局变量的section。Intel MPK是Intel芯片的一个硬件特性,Call gate意为调用门,指的是在一段时间内给予程序高特权,并在时间结束后立刻收回。
原本的函数是内存分配和释放函数,如malloc和free等。
请参见图2,是本发明实施例的separated stack和separated heap的布局示意图;
具体实施过程中,首先要维护一个separated stack(分离的栈),以存放需要保护的局部变量。具体来说,在S中分配一个内存区域,并将separated stack的栈指针初始化为该内存区域的高地址,如图2所示。给定一个栈变量,先根据类型和对齐方式计算其大小;然后,利用sub指令来调整栈指针的位置以分配栈空间。最后,sub指令的结果被转换为变量原本的类型,用于引用这个变量。为了回收stack frame,在函数入口处保存了栈指针的位置,并在所有的返回指令之前恢复栈指针的位置。
然后维护一个separated heap(分离的堆),以存放需要动态分配内存的变量。separated heap(分离的堆)将整块内存划分为16字节的chunk,从低地址开始分配动态内存。当有动态分配请求时,会找到一个由连续的chunk组成的、符合请求大小的block,并返回该block的基址。为了找到可用的chunk,COLLATE维护了一个free_list,将未分配的chunks连接成一个单链表,如图2所示。free_list记录了每个block的大小和后续block的地址,有利于分配和删除操作的实施。
最后,提供一个separated section(分离的ELF段),其中存放着静态分配的变量。具体来说,首先为创建一个特殊的ELF段,然后在该段的开始和结束处分别插入两个填充变量。当可执行文件被加载到内存时,这两个填充变量可以用来确定内存段的实际内存地址范围。在执行main函数之前,将该内存段映射到S以进行保护。
对于每个可以写入内存的内存操作指令,利用指针分析来获得其指针操作数的points-to set,如果包含受保护的内存对象,就使用call gate允许它的访问。在外部call指令的情况下,如果其参数的points-to set包含任何受保护数据,也同样进行处理。
为了保护步骤4中的内存,利用Intel MPK修改它的权限,默认为只读,防止被恶意修改。只有在执行上述可信指令时,才使用call gate授予指令访问它的权限。
图3显示了call gate的汇编代码。Xor:异或指令,用来将ecx和edx寄存器归零,这样才能写入PKRU寄存器,Mov:内存移动指令,将要写入PKRU寄存器的值放入eax寄存器中,WRPKRU:专门用于写PKRU寄存器的指令,会将eax寄存器中的值写入PKRU寄存器中。每个call gate先使用WRPKRU指令将PKRU_ALLOW_D1写入PKRU寄存器(第1-5行),允许之后的指令写入受保护的内存。PKRU\ALLOW_D1是一个宏,代表了所有内存都可读可写时的PKRU寄存器的值。接下来,可信指令被执行(第7行)。执行后,call gate将PKRU_DISALLOW_D1写入PKRU寄存器(第9-13行),禁止之后的代码写入受保护的内存。关于WRPKRU指令是否会被攻击者利用,因为控制流劫持攻击必须首先破坏能够影响控制流的数据,而本发明通过保护与控制有关的数据,在源头上阻止了它的发生,因此,WRPKRU指令不会被攻击者利用。需要说明的是,WRPKRU指令是Intel MPK的专有指令,用来写入PKRU寄存器,修改CPU对每个Intel MPK保护的内存的访问权限。
实施例二
基于同样的发明构思,本实施例提供了一种函数指针及其数据依赖的识别与保护装置,请参见图4,该装置包括:
函数指针识别模块201,用于对给定的程序进行基于类型和基于指针的分析,从中识别出属于函数指针或至少包含一个函数指针的内存对象;
过程间数据流图构造模块202,用于将每个函数的定义信息和使用信息进行串连构造过程间数据流图;
敏感指令识别模块203,用于将识别出的属于或者包含函数指针的内存对象作为污点源,并将所有间接函数调用点作为汇聚点,在构造的过程间数据流图中进行深度优先搜索实现前向污点传播,得到的从在污点源到汇聚点的路径表示一种可能的函数指针的计算流程,将路径上的指令作为参与函数指针计算的敏感指令;
数据依赖识别模块204,用于将得到的敏感指令作为污点源,以识别出的属于或者包含函数指针的内存对象作为汇聚点,在构造的过程间数据流图中进行深度优先搜索实现后向污点传播,得到的从污点源到汇聚点的路径,将路径上的内存对象作为敏感指令中函数指针所依赖的数据;
内存分配模块205,用于将识别出的所有函数指针及其依赖的数据分配到硬件保护的内存中;
保护模块206,用于将所述硬件保护的内存使用Intel MPK进行保护,并使用callgate切换特权用以允许程序中原本会写入函数指针及其依赖的数据的指令的访问。
由于本发明实施例二所介绍的装置为实施本发明实施例一中函数指针及其数据依赖的识别与保护方法所采用的装置,故而基于本发明实施例一所介绍的方法,本领域所属人员能够了解该装置的具体结构及变形,故而在此不再赘述。凡是本发明实施例一中方法所采用的装置都属于本发明所欲保护的范围。
实施例三
基于同一发明构思,请参见图5,本发明还提供了一种计算机可读存储介质300,其上存储有计算机程序311,该程序被执行时实现如实施例一中所述的方法。
由于本发明实施例三所介绍的计算机可读存储介质为实施本发明实施例一中函数指针及其数据依赖的识别与保护方法所采用的计算机可读存储介质,故而基于本发明实施例一所介绍的方法,本领域所属人员能够了解该计算机可读存储介质的具体结构及变形,故而在此不再赘述。凡是本发明实施例一的方法所采用的计算机可读存储介质都属于本发明所欲保护的范围。
实施例四
基于同一发明构思,请参见图6,本申请还提供了一种计算机设备,包括存储器401、处理器402及存储在存储器上并可在处理器上运行的计算机程序403,处理器执行上述程序时实现实施例一中的方法。
由于本发明实施例四所介绍的计算机设备为实施本发明实施例一中函数指针及其数据依赖的识别与保护方法所采用的计算机设备,故而基于本发明实施例一所介绍的方法,本领域所属人员能够了解该计算机设备的具体结构及变形,故而在此不再赘述。凡是本发明实施例一中方法所采用的计算机设备都属于本发明所欲保护的范围。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明实施例进行各种改动和变型而不脱离本发明实施例的精神和范围。这样,倘若本发明实施例的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (8)
1.一种函数指针及其数据依赖的识别与保护方法,其特征在于,包括:
S1:对给定的程序进行基于类型和基于指针的分析,从中识别出属于函数指针或至少包含一个函数指针的内存对象;
S2:将每个函数的定义信息和使用信息进行串连构造过程间数据流图;
S3:将识别出的属于或者包含函数指针的内存对象作为污点源,并将所有间接函数调用点作为汇聚点,在构造的过程间数据流图中进行深度优先搜索实现前向污点传播,得到的从在污点源到汇聚点的路径表示一种可能的函数指针的计算流程,将路径上的指令作为参与函数指针计算的敏感指令;
S4:将得到的敏感指令作为污点源,以识别出的属于或者包含函数指针的内存对象作为汇聚点,在构造的过程间数据流图中进行深度优先搜索实现后向污点传播,得到的从污点源到汇聚点的路径,将路径上的内存对象作为敏感指令中函数指针所依赖的数据;
S5:将识别出的所有函数指针及其依赖的数据分配到硬件保护的内存中;
S6:将所述硬件保护的内存使用Intel MPK进行保护,并使用call gate切换特权用以允许程序中原本会写入函数指针及其依赖的数据的指令的访问。
2.如权利要求1所述的函数指针及其数据依赖的识别与保护方法,其特征在于,步骤S1包括:
依次遍历给定的程序的中的类型,如果一个类型是函数指针类型,则为敏感类型,如果一个类型是包含一个或多个敏感类型的复合类型,则递归判断该复合类型中的所有元素,若有一个元素为敏感类型,则该类型为敏感类型;在识别出所有敏感类型后,再次遍历给定的程序中的所有变量,如果一个变量的类型是敏感类型,则是这个变量为敏感变量;
采用基于指针的分析方法进行分析,如果一个指针的目标集合中存在函数,则将该指针视作为函数指针,并加入敏感变量集合中,同时将指针包含变量也加入敏感变量集合中。
3.如权利要求1所述的函数指针及其数据依赖的识别与保护方法,其特征在于,S3的前向污点传播过程中,从包含函数指针的内存对象开始,在间接函数调用点处结束,前向污点传播结束后,确定了所有从污点源到间接调用点的污点路径,每一条污点路径由一组污点指令组成,用以描述一个函数指针从创建到调用的生命周期。
4.如权利要求1所述的函数指针及其数据依赖的识别与保护方法,其特征在于,S4在后向污点传播中,从步骤S2识别出的污点指令开始,在碰到内存对象时结束传播,后向污点传播结束后,确定了所有从污点源到内存对象的污点路径,将污点路径上的内存对象作为函数指针依赖的数据。
5.如权利要求1所述的函数指针及其数据依赖的识别与保护方法,其特征在于,步骤S5包括:
如果函数指针及其依赖的数据是局部变量,则在分离的栈为所在的函数分配对应的栈帧;
如果函数指针及其依赖的数据是动态分配的变量,则用分离的堆的内存申请和释放函数替换原本的函数;
如果函数指针及其依赖的数据是在BBS段或DATA段中的静态变量,在pass中创建一个新的段和对应的全局变量,并将静态变量转移到全局变量中。
6.一种函数指针及其数据依赖的识别与保护装置,其特征在于,包括:
函数指针识别模块,用于对给定的程序进行基于类型和基于指针的分析,从中识别出属于函数指针或至少包含一个函数指针的内存对象;
过程间数据流图构造模块,用于将每个函数的定义信息和使用信息进行串连构造过程间数据流图;
敏感指令识别模块,用于将识别出的属于或者包含函数指针的内存对象作为污点源,并将所有间接函数调用点作为汇聚点,在构造的过程间数据流图中进行深度优先搜索实现前向污点传播,得到的从在污点源到汇聚点的路径表示一种可能的函数指针的计算流程,将路径上的指令作为参与函数指针计算的敏感指令;
数据依赖识别模块,用于将得到的敏感指令作为污点源,以识别出的属于或者包含函数指针的内存对象作为汇聚点,在构造的过程间数据流图中进行深度优先搜索实现后向污点传播,得到的从污点源到汇聚点的路径,将路径上的内存对象作为敏感指令中函数指针所依赖的数据;
内存分配模块,用于将识别出的所有函数指针及其依赖的数据分配到硬件保护的内存中;
保护模块,用于将所述硬件保护的内存使用Intel MPK进行保护,并使用call gate切换特权用以允许程序中原本会写入函数指针及其依赖的数据的指令的访问。
7.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被执行时实现如权利要求1至5中任一项权利要求所述的方法。
8.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至5中任一项权利要求所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211121918.2A CN115510430A (zh) | 2022-09-15 | 2022-09-15 | 一种函数指针及其数据依赖的识别与保护方法、装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211121918.2A CN115510430A (zh) | 2022-09-15 | 2022-09-15 | 一种函数指针及其数据依赖的识别与保护方法、装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115510430A true CN115510430A (zh) | 2022-12-23 |
Family
ID=84503378
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211121918.2A Pending CN115510430A (zh) | 2022-09-15 | 2022-09-15 | 一种函数指针及其数据依赖的识别与保护方法、装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115510430A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116340942A (zh) * | 2023-03-01 | 2023-06-27 | 软安科技有限公司 | 一种基于对象传播图和指针分析的函数调用图构建方法 |
CN116467712A (zh) * | 2023-04-23 | 2023-07-21 | 北京安普诺信息技术有限公司 | 动态污点追踪方法、装置及相关污点传播分析系统 |
-
2022
- 2022-09-15 CN CN202211121918.2A patent/CN115510430A/zh active Pending
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116340942A (zh) * | 2023-03-01 | 2023-06-27 | 软安科技有限公司 | 一种基于对象传播图和指针分析的函数调用图构建方法 |
CN116340942B (zh) * | 2023-03-01 | 2024-04-30 | 软安科技有限公司 | 一种基于对象传播图和指针分析的函数调用图构建方法 |
CN116467712A (zh) * | 2023-04-23 | 2023-07-21 | 北京安普诺信息技术有限公司 | 动态污点追踪方法、装置及相关污点传播分析系统 |
CN116467712B (zh) * | 2023-04-23 | 2023-12-01 | 北京安普诺信息技术有限公司 | 动态污点追踪方法、装置及相关污点传播分析系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Liljestrand et al. | {PAC} it up: Towards pointer integrity using {ARM} pointer authentication | |
JP7053486B2 (ja) | メタデータ処理のための技法 | |
De Clercq et al. | A survey of hardware-based control flow integrity (CFI) | |
US7886148B2 (en) | Secure execution of a computer program | |
US7603704B2 (en) | Secure execution of a computer program using a code cache | |
US20180211046A1 (en) | Analysis and control of code flow and data flow | |
CN112149145A (zh) | 基于不变指针的数据加密 | |
CN111381879B (zh) | 一种数据处理方法及装置 | |
CN115510430A (zh) | 一种函数指针及其数据依赖的识别与保护方法、装置 | |
US10528729B2 (en) | Methods and systems for defending against cyber-attacks | |
CN110598405B (zh) | 一种运行时访问控制方法及计算装置 | |
CN107003936A (zh) | 具有非可读页的存储器保护 | |
Park et al. | NoJITsu: Locking Down JavaScript Engines. | |
US20230236925A1 (en) | Tag checking apparatus and method | |
US11947663B2 (en) | Control flow protection based on phantom addressing | |
Gens | OS-level Attacks and Defenses: from Software to Hardware-based Exploits | |
US11361070B1 (en) | Protecting devices from remote code execution attacks | |
Pappas | Defending against return-oriented programming | |
CN114266036A (zh) | 一种基于Intel CET机制的保护通用内存完整性的方法 | |
Geden et al. | RegGuard: Leveraging CPU registers for mitigation of control-and data-oriented attacks | |
Kim et al. | Fast and space-efficient defense against jump-oriented programming attacks | |
Giannaris | Securing Operating Systems using Hardware-Enforced Compartmentalization | |
Chen | Defending In-process Memory Abuse with Mitigation and Testing | |
Yuksek | Security Tagged Architectures and Systems | |
Moghadam et al. | Memory Integrity Techniques for Memory-Unsafe Languages: A Survey |
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 |