CN112905998B - 基于代码段随机切换的地址导向型攻击防护方法及装置 - Google Patents
基于代码段随机切换的地址导向型攻击防护方法及装置 Download PDFInfo
- Publication number
- CN112905998B CN112905998B CN202110218259.3A CN202110218259A CN112905998B CN 112905998 B CN112905998 B CN 112905998B CN 202110218259 A CN202110218259 A CN 202110218259A CN 112905998 B CN112905998 B CN 112905998B
- Authority
- CN
- China
- Prior art keywords
- code
- address
- program
- segments
- target program
- 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
Links
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/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/562—Static detection
- G06F21/563—Static detection by source code analysis
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Computer Hardware Design (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Health & Medical Sciences (AREA)
- General Health & Medical Sciences (AREA)
- Virology (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种基于代码段随机切换的地址导向型攻击防护方法及装置,本发明方法包括:编译目标程序生成包含整体语义等价但内存布局不同的多个代码子段以及偏移关系数据库的二进制程序;加载并运行目标程序,在运行过程中引发随机性的切换操作使得CPU在目标程序不同的代码子段之间切换执行,切换代码子段后续指令的执行同没有切换代码子段之前有相同的语义和执行结果,实现程序代码执行地址及其内存布局模式的切换以阻止地址导向攻击的发生。本发明通过软硬件、以及编译系统结合的方式,实现程序执行代码段的动态随机切换,从而实现所执行的指令代码地址的高熵随机化,使攻击者无法实施所期望的攻击,从而对地址导向型攻击进行有效防护。
Description
技术领域
本发明涉及信息设备、程序、防止执行不正当程序代码的技术,具体涉及一种基于代码段随机切换的地址导向型攻击防护方法及装置。
背景技术
在冯.诺伊曼体系结构计算机中,指令代码和数据共同存储在RAM(Random AccessMemory随机存取存储器)等存储区域中,CPU(Central Processing Unit中央处理单元)从RAM取出指令并执行,由此完成各种既定程序,这就是著名的存储程序计算机原理。这种设计方式无法直接从内存的二进制形式上区分数据和代码,从而给了用户数据中包含的代码得以执行的机会,是目前计算机系统中很多漏洞存在的本质原因。
地址导向型攻击或者返回地址导向编程(Return-Oriented Programming,ROP)利用程序和库函数中现有的一组指令序列,并通过恶意修改堆栈中的返回地址将这些指令序列串连起来,形成攻击所需要的shellcode来发动攻击。这种攻击不需要注入新的恶意代码,取而代之的是重用漏洞程序中已有的函数完成攻击,让漏洞程序跳转到已有的代码序列(比如库函数的代码序列),从而能够绕过针对代码注入攻击的软硬件防护机制。
例如,在x86_64平台的攻击中,在向system()函数传递参数时需要将%rdi设定为特定的值,并“call”system函数。这个功能可以通过构建ROP链来实现。图1中给出了一个实例,其中分别用到了系统调用函数system的地址以及字符串“/bin/sh”的地址,两个地址分别置于rbx寄存器以及rdi寄存器中。
表1:地址导向型攻击实例的指令序列。
1 pop%rbx
2 retq
3 mov%rbx,%rax
4 add$0xe0,%rsp
5 pop%rbx
6 retq
7 move%rsp,%rdi
8 callq*%eax
表1的代码段中,第1句汇编指令将system()函数的地址放入rbx寄存器。然后返回执行第3句汇编指令。第3-6句汇编指令将rbx寄存器内容传入rax寄存器,即用rax寄存器保存system()函数的地址。最后两句汇编指令设定寄存器rdi的值,并调用eax指向的system()函数。指令完成后,system(“/bin/sh”)将被调用,从而得到一个攻击可用的shell。从上面的例子可以看出,地址导向型攻击代码的指令流在形式上具有一定的特征,即攻击代码中包含有大量的“return”(返回)指令。同时,每一小段指令序列通常都比较短小,一般只包含两到三个汇编语句,它们仅仅完成整个shellcode的一部分工作。这些指令通过“return”(返回)指令串连起来,形成ROP攻击链实现最终shellcode的执行。构建ROP攻击链有很多的技巧,这里不一而论。
目前对于地址导向型攻击,地址空间布局随机化(Address Space LayoutRandomization,ASLR)机制是最为有效的防御机制之一。ASLR可以实现对进程的堆、栈、代码和共享库等的地址在程序每次运行的时候的随机化,大大增加了定位到需要利用的代码的正确位置的难度,因此也就增加了地址导向型攻击的难度。由于程序运行时的地址被随机化,在攻击时攻击者无法直接定位到所需利用的随机化后的内存地址,而只能依赖于对这些数据、代码运行时的实际地址的猜测。因此攻击者猜对的可能性比较低,很难成功发起攻击。同时,也容易导致程序运行时崩溃,因而减小了检测到攻击的难度。PAX内核安全增强补丁和地址混淆(Address Randomization)是已经推出的地址空间随机化实例。
总体来说,这些方案存在多方面局限性。第一,性能损耗大;第二,防护对象受限,防护范围小;第三,防护能力不足(漏防);第四,需要修改源代码。
发明内容
本发明要解决的技术问题:针对现有技术的上述问题,提供一种基于代码段随机切换的地址导向型攻击防护方法及装置,本发明通过软硬件、以及编译系统结合的方式,实现程序执行代码段的动态随机切换,从而实现所执行的指令代码地址的高熵随机化,使攻击者无法通过漏洞插入返回地址(以及其它非指令数据)序列实施所期望的攻击,从而对地址导向型攻击进行有效防护。
为了解决上述技术问题,本发明采用的技术方案为:
一种基于代码段随机切换的地址导向型攻击防护方法,包括:
1)编译目标程序,生成包含整体语义等价但内存布局不同的多个代码子段以及偏移关系数据库的二进制程序;
2)加载运行目标程序,且在运行目标程序过程中,引发随机性的切换操作使得CPU在目标程序不同的代码子段之间切换执行,且切换代码子段后续指令的执行同没有切换代码子段之前有相同的语义和执行结果,从而实现程序代码执行地址及其内存布局模式的切换以阻止地址导向攻击的发生。
可选地,步骤1)中加载目标程序时,目标程序的软件执行体的虚地址空间包括代码段、BSS段、数据段、堆段和栈段,所述目标程序拥有的多重整体语义等价但内存布局不同的代码子段存储在代码段中。
可选地,步骤2)中引发随机性的切换操作使得CPU在目标程序不同的代码子段之间切换执行时,包括将CPU的运行环境能够切换到不同的代码子段所对应的硬件执行环境,不同的代码子段所对应的硬件执行环境包括通用寄存器、状态和控制寄存器、堆栈寄存器及指令寄存器;同时,操作系统对于内核或核外进程的数据段、堆栈段采用唯一的内存副本,使得数据段、堆栈段在切换代码子段后能直接为切换后的代码子段所使用。
可选地,所述将CPU的运行环境能够切换到不同的代码子段所对应的硬件执行环境是通过上下文管理内核组件来实现的,所述上下文管理内核组件将CPU的运行环境能够切换到不同的代码子段所对应的硬件执行环境时,通过查表方式快速获取哪些寄存器和内存值需要修改以及修改的偏移量,从而实现包括通用寄存器、状态和控制寄存器、堆栈寄存器及指令寄存器在内的硬件执行环境切换。
可选地,步骤2)中引发随机性的切换操作使得CPU在目标程序不同的代码子段之间切换执行之前还可包括下述步骤:判断目标程序的类型是内核程序还是用户程序,若是用户程序则引发随机性的切换操作,若是内核程序且需要保证系统性能,则不引发随机性的切换操作、按照普通程序的方式执行。
可选地,步骤1)包括对目标程序进行静态扫描用户进程代码或源代码确定受攻击风险类型的步骤,步骤2)中引发随机性的切换操作使得CPU在目标程序不同的代码子段之间切换执行之前还包括下述步骤:判断目标程序的受攻击风险类型,若是受攻击风险高的程序则引发随机性的切换操作,若是受攻击风险低的程序,则不引发随机性的切换操作、按照普通程序的方式执行以提高执行性能。
可选地,步骤2)中引发随机性的切换操作是通过CPU中的定时器发出的触发随机中断信号实现的,所述定时器的精度和CPU主频保持同样量级。
可选地,所述CPU中还包括随机数发生器,所述随机数发生器随机设定的随机数被作为定时器的触发延迟,当为定时器触发时,一方面将会生成一个触发随机中断信号通知CPU核,另一方面会启动随机数发生器生成下一个定时器的触发延迟。
可选地,所述引发随机性的切换操作使得CPU在目标程序不同的代码子段之间切换执行时,包括通过随机数发生器生成待执行的代码子段的步骤。
可选地,步骤1)之前包括编译生成目标程序的步骤:通过静态分析获取目标程序中函数指针变量,并分析间接函数,间接函数的调用过程包含两个部分:在函数指针赋值处把目标函数的地址写入指针,在间接函数调用处通过函数指针取出目标函数地址,然后跳转到目标地址执行;采用编译器辅助方式构建链表式数据库,记录执行体运行不同阶段的寄存器和数据内存中的代码子段的地址存储,以及不同代码子段之间的偏移关系;在迁移目标程序时,通过上下文管理内核模块通过查表方式快速获取哪些寄存器和内存值需要修改以及修改的偏移量记录为数据库,该数据库将在编译阶段生成并注入到目标程序的执行体中成为一个单独的数据段;步骤1)中加载目标程序时,包括内核将目标程序的单独的数据段以共享内存方式开放给内核访问的步骤。
此外,本发明还提供一种基于代码段随机切换的地址导向型攻击防护装置,包括相互连接的微处理器和存储器,所述微处理器被编程或配置以执行所述基于代码段随机切换的地址导向型攻击防护方法的步骤。
和现有技术相比,本发明具有下述优点:
1、本发明目标程序拥有多重整体语义等价但内存布局不同的代码子段,在运行目标程序时,系统会引发随机性的切换操作,造成CPU在不同的代码子段之间切换执行,从而实现程序代码执行地址及其内存布局模式的切换,这种随机切换的粒度足够细时,能够阻止地址导向攻击的发生,这是因为程序代码段地址的随机变化造成了攻击者注入的指令地址中不再是其期望的指令,因此造成地址导向的失效。本发明的目的是在计算机在运行期间,将送入CPU的代码序列中的二进制代码的内存地址进行随机化,但保持语义不变,使攻击者事先注入的返回地址序列无法对应正确的运行时指令地址。具体思想是,CPU通过高频度地随机地变换当前所运行的代码子段,保证程序逻辑语义仍在正确地被执行,但CPU上所执行的二进制编码的内存地址无法被有效预测,因此攻击者注入的返回地址被CPU自动采用时,会因为地址无法匹配而导致执行失败。
2、本发明能做到对任意的返回地址导向型攻击的防护。
3、本发明不但适用于针对用户程序的返回地址导向型攻击防护,也适用于针对操作系统和内核程序的返回地址导向型攻击的防护。
4、本发明不需要动态编译目标程序。
附图说明
图1为现有技术通过构建ROP链来实现调用系统函数(“call”system函数)的实例。
图2为本发明实施例方法的基本流程图。
图3为本发明实施例中目标程序的软件执行体的虚地址空间划分。
图4为本发明实施例中引发随机性的切换操作的硬件机制原理图。
图5为本发明实施例中目标程序的模块化结构示例。
图6为本发明实施例中操作系统的整体改进示意图。
具体实施方式
如图2所示,本实施例基于代码段随机切换的地址导向型攻击防护方法包括:
1)编译目标程序,生成包含整体语义等价但内存布局不同的多个代码子段以及偏移关系数据库的二进制程序;
2)加载运行目标程序,且在运行目标程序过程中,引发随机性的切换操作使得CPU在目标程序不同的代码子段之间切换执行,且切换代码子段后续指令的执行同没有切换代码子段之前有相同的语义和执行结果,从而实现程序代码执行地址及其内存布局模式的切换以阻止地址导向攻击的发生。
图3中记载了目标程序的执行体(包含进程、内核)的内存布局以及复合代码段的构成实施例。如图3所示,本实施例步骤1)中加载目标程序时,目标程序的软件执行体的虚地址空间包括代码段、BSS段(未初始化的数据段)、数据段、堆段和栈段,目标程序拥有的多重整体语义等价但内存布局不同的代码子段存储在代码段中。支持多地址布局代码段运行时随机切换的操作系统的显著特征是支持复合代码段(多个代码子段)的软件执行体运行。这里软件执行体包括了用户态进程和内核,也就是独立拥有完整虚地址运行空间的软件单位。传统的软件执行体将自己的虚地址空间划分为代码段、BSS段、数据段、堆栈段等部分,以便于二进制资源的有序管理。支持多编码模式运行时随机切换的操作系统为支持编码模式切换特别对执行体的代码段进行了扩展,使多种地址布局的代码子段共存并支持动态在CPU上切换运行,本发明将这种形式的代码段称为复合代码段,将其中的具体地址布局的表示执行体逻辑完整语义行为的子段(即传统代码段)称为代码子段。图2展示了这种复合代码段的具体实例和设计方式。在该实例中,针对两种不同的地址布局(A布局和B布局),复合代码段中包含了两个按照不同地址组织编译出的独立代码子段,分别是:A布局代码子段和B布局代码子段。实际系统还能支持更多地址布局,增加运行时的随机性。如图3所示,A布局代码子段和B布局代码子段的关系是两个子段采用相同的指令集编码,但编译生成的内存地址以及布局方式(例如两个函数的地址的先后关系、或者两个函数之间的位移关系等)不同。
本实施例中,步骤2)中引发随机性的切换操作使得CPU在目标程序不同的代码子段之间切换执行时,包括将CPU的运行环境能够切换到不同的代码子段所对应的硬件执行环境,不同的代码子段所对应的硬件执行环境包括通用寄存器、状态和控制寄存器、堆栈寄存器及指令寄存器;同时,操作系统对于内核或核外进程的数据段、堆栈段采用唯一的内存副本,使得数据段、堆栈段在切换代码子段后能直接为切换后的代码子段所使用。
本实施例中,将CPU的运行环境能够切换到不同的代码子段所对应的硬件执行环境是通过上下文管理内核组件来实现的,所述上下文管理内核组件将CPU的运行环境能够切换到不同的代码子段所对应的硬件执行环境时,通过查表方式快速获取哪些寄存器和内存值需要修改以及修改的偏移量,从而实现包括通用寄存器、状态和控制寄存器、堆栈寄存器及指令寄存器在内的硬件执行环境切换。上下文管理内核组件的职能主要是将切换之前所用代码子段时的上下文转换到切换后代码子段的上下文。当要切换的代码子段的指令地址无法对应时,需要对待切换的执行体上下文现场进行内容的地址迁移,这里的上下文现场已经不仅仅是寄存器现场,还包含执行体数据段、堆栈段等的其它段。很明显,如果仅靠对切换时的在线计算来追踪哪些寄存器和内存值需要地址迁移的计算量是非常大的,文献中给出的实例可能高达数百万个cycles。本发明对编译器提供的链表式数据库,通过查表方式快速获取哪些寄存器和内存值需要修改以及修改的偏移量。从而能够快速生成目标代码子段运行所需的上下文。上述设计使上下文的切换计算同执行过程无关,因而能够大幅提升切换的效率。
本发明通过复合代码段的设计,使执行体地址空间的实时跳变具备很大的灵活性,并能通过增加更多代码子段布局的方式提高随机性。此外,跳变机制既能根据硬件异常机制实施,又能根据编译器指示或者安全预测机制由软件实施,因此具备较好的灵活度。考虑到每种机制的防御目标以及引入开销的差别,可制定相应的实施策略,以获得防御效果和系统效率的折中:首先,内核和用户进程的执行效率有不同的需求,一般需要内核的执行效率更高。由于恶意攻击通常是发生在系统调用阶段,因此可以通过标记的方式仅在系统调用的部分阶段采用频繁的硬件异常实施,在其它时候可以根据软件指示减少跳变操作;其次,可以通过静态扫描等方式对用户进程代码(或源代码)进行分析,获知哪些代码是受攻击风险较高的,或者受哪些攻击的风险高,从而提供标记指示采取哪种跳变策略。此外,系统还可以提供配置接口给管理员,使其根据当前的运行环境,对跳变策略进行选取和配置。本实施例中制定相应的实施策略以获得防御效果和系统效率的折中的具体代码子段切换策略包括:
策略一:步骤2)中引发随机性的切换操作使得CPU在目标程序不同的代码子段之间切换执行之前还可包括下述步骤:判断目标程序的类型是内核程序还是用户程序,若是用户程序则引发随机性的切换操作,若是内核程序且需要保证系统性能,则不引发随机性的切换操作、按照普通程序的方式执行。
策略二:步骤1)包括对目标程序进行静态扫描用户进程代码或源代码确定受攻击风险类型的步骤,步骤2)中引发随机性的切换操作使得CPU在目标程序不同的代码子段之间切换执行之前还包括下述步骤:判断目标程序的受攻击风险类型,若是受攻击风险高的程序则引发随机性的切换操作,若是受攻击风险低的程序,则不引发随机性的切换操作、按照普通程序的方式执行以提高执行性能。
如图4所示,本实施例步骤2)中引发随机性的切换操作是通过CPU中的定时器发出的触发随机中断信号实现的,所述定时器的精度和CPU主频保持一个量级。
如图4所示,本实施例中CPU中还包括随机数发生器,所述随机数发生器随机设定的随机数被作为定时器的触发延迟,当为定时器触发时,一方面将会生成一个触发随机中断信号通知CPU核,另一方面会启动随机数发生器生成下一个定时器的触发延迟。
如图4所示,本实施例中引发随机性的切换操作使得CPU在目标程序不同的代码子段之间切换执行时,包括通过随机数发生器生成待执行的代码子段的步骤。
程序执行过程中,CPU通过取指令部件自动执行下一条指令,需要一个外在机制能够让CPU切换解码模式并从对应的另一个代码子段取指令,这种外在机制一般由中断或者异常实现,本发明统一称为中断。由于本发明需要对指令编码模式进行高频度的随机切换,因此中断引发的额外开销将非常显著,如果一次相关中断中只做判断,不引发实际的编码切换,这个中断处理所耗费的CPU资源就完全是浪费的。例如可以利用一个高精度定时器生成固定频率的中断,每个中断处理时,通过生成随机数的方式判断是否需要切换,这样也能实现随机切换编码模式的效果,但不做切换的中断处理就会浪费大量CPU时间。为了避免这种浪费,本发明进一步要求这种中断的触发时机本身具备随机性,中断之间的间隔是随机的,当中断到来时,其处理机制必然引发编码模式切换。本发明给出一个具体的随机中断触发器的设计实例,如图4所示。针对每个CPU核提供一个随机数发生器和一个高精度定时器(其精度和CPU主频保持一个量级),随机数发生器生成的随机数被作为定时器从当前时间器的触发延迟,当定时器触发时,一方面将会生成一个中断通知CPU核,另一方面会启动随机数发生器生成下一个定时器的随机延迟。CPU核心在收到随机中断并开始进行代码子段切换操作时,可以通过访问随机数发生器的方式来生成对待要切换的代码子段的选择决策。
通常一个应用程序在运行时包含代码空间和数据空间:代码空间内存放程序代码,数据空间包含堆、栈等,用于存放程序运行时的数据。地址空间布局的异构反映在代码空间的布局上,不同地址空间布局的可执行代码副本共享相同的数据空间,而拥有不同的代码布局。维护不同布局下间接函数调用的正确性需要解决两个问题:1、确定程序中哪些变量是函数指针;2、在间接函数调用处如何引用不同布局下正确的目标函数的地址。目标程序中函数指针变量的识别可以通过静态分析获取。在间接函数调用处引用正确的目标函数地址需要首先分析间接函数的过程。间接函数的调用过程包含两个部分:在函数指针赋值处把目标函数的地址写入指针,在间接函数调用处通过函数指针取出目标函数地址,然后跳转到目标地址执行。为了使地址迁移计算量受限并可接受,本发明采用编译器辅助方式构建链表式数据库(数据空间切换数据库),记录执行体运行不同阶段的寄存器和数据内存中的(代码子段)地址存储,以及(不同代码子段之间的)偏移关系。在迁移时,上下文管理内核模块通过查表方式快速获取哪些寄存器和内存值需要修改以及修改的偏移量。该数据库将在编译阶段生成并注入到执行体中成为一个单独的数据段,内核在载入进程时,将这个数据段以共享内存方式开放给内核访问。本实施例中,步骤1)之前包括编译生成目标程序的步骤:通过静态分析获取目标程序中函数指针变量,并分析间接函数,间接函数的调用过程包含两个部分:在函数指针赋值处把目标函数的地址写入指针,在间接函数调用处通过函数指针取出目标函数地址,然后跳转到目标地址执行;采用编译器辅助方式构建链表式数据库,记录执行体运行不同阶段的寄存器和数据内存中的代码子段的地址存储,以及不同代码子段之间的偏移关系;在迁移目标程序时,通过上下文管理内核模块通过查表方式快速获取哪些寄存器和内存值需要修改以及修改的偏移量记录为数据库,该数据库将在编译阶段生成并注入到目标程序的执行体中成为一个单独的数据段;步骤1)中加载目标程序时,包括内核将目标程序的单独的数据段以共享内存方式开放给内核访问的步骤。
为了能够适应多地址布局代码段程序的随机切换运行机制,操作系统需要为其上运行的绝大多数代码准备对应地址布局的代码段内存副本,并提供运行切换的机制支持,使代码段切换时,CPU的运行环境能够切换到不同的代码段副本所对应的硬件执行环境(包含通用寄存器、状态和控制寄存器、堆栈寄存器以及指令寄存器)。出于数据一致性的要求和对性能的考虑,操作系统对于内核或核外进程的其它段(数据段、堆栈段等)采用唯一的内存副本。在多数的解码规则切换时,这些段中的数据内容不必要进行修正就能为切换后的代码所使用。代码段地址布局切换执行工作原理是,系统通过一个随机发生机制引发操作系统执行切换动作,使操作系统暂停当前的程序执行,并根据可选规则将当前代码子段切换到不同地址布局的代码子段,并保证后续指令的执行同没有切换之前有相同的语义和执行结果。代码子段的切换使将要执行的二进制代码的地址失去可预测性,当这种随机切换的粒度足够细时,攻击者注入的返回地址序列将必然是一个错乱的返回地址序列并在CPU跳转执行时无法成功实施攻击。代码段地址布局的切换可以包含内核态的切换或者用户进程态的切换两种模式,可以分别实施或者仅实施其中一种。综上所述,应用本实施例基于代码段随机切换的地址导向型攻击防护方法的操作系统相对常规操作系统,主要区别包括:(1)对多地址布局代码子段的支持,也就是对每个可跳变的程序实体(内核、核外进程等)都会在其内存空间中建立多个代码段副本,它们拥有不同的有地址布局方式;(2)操作系统内核在内存管理方面支持对自身代码段多副本以及应用代码段多副本的地址空间分派和管理功能;(3)操作系统内核支持对当前运行软件实体进行码址跳变(即在其代码段副本间切换)的异常生成和处理机制;(4)操作系统在程序进行代码子段时能在相关异常处理中实现寄存器和内存信息的快速转换,这个转换过程需要使用编译器提供的静态关联信息,操作系统在程序执行体进行不同地址布局代码子段切换时能在相关异常处理中实施上下文快速转换。支持多地址布局代码段运行时随机切换的操作系统的运行结构如图5所示,其中主要突出展示了该操作系统和常规宏内核操作系统(如Linux)的区别。如图6所示,本实施例基于代码段随机切换的地址导向型攻击防护方法是一种软件和硬件集成的解决方案,分别包括软件部分、硬件部分和编译机制三个部分。软件部分包括应用程序支持、OS内核支持,其功能都依赖于编译机制实现,使得目标程序拥有多重整体语义等价但内存布局不同的代码子段。应用程序支持主要为代码子段的多样化实现,以及多个代码子段复用的公共数据段和公共堆栈段。OS内核的支持包括代码子段运行支持、代码子段切换支持、代码子段切换策略和数据空间切换数据库。硬件部分,则主要为硬件实现的随机中断触发器,包括定时器和随机数生成器,具体可参见前文。
本实施例基于代码段随机切换的地址导向型攻击防护方法的目标程序的二进制编码在执行时是需要放在特定的虚地址上,由CPU的指令指针所引用,并被自动加载执行。这些虚地址的定义和布局是由编译器自主决定的,可以通过调节编译策略或者编译参数使同样的源代码编译出对应不同虚地址定义的二进制代码。本实施例称每个地址布局的代码段为代码子段,要求程序执行体中包含至少两个代码子段,它们采用不同的地址布局,并且编译器保证它们使用相同的数据段和堆栈段。操作系统在进行程序加载时,将不同代码段都加载到虚地址空间中,并提供运行时切换的机制支持,使CPU的运行环境能够切换到不同的代码子段所对应的虚地址空间和硬件执行环境。本实施例称这种切换为程序代码段地址布局切换。代码段地址布局切换执行工作原理是,系统通过一个随机发生机制引发操作系统执行切换动作,并选取一个代码子段切换程序执行的上下文环境。代码子段的切换使将要执行的二进制代码的地址失去可预测性,当这种随机切换的粒度足够细时,攻击者注入的代码序列或者返回地址序列将必然是一个错乱的序列并在执行时产生异常而无法成功实施攻击。内核在进行代码子段切换时必须要保证切换前后程序执行语义和执行结果的一致性,也就是说程序按照其中任一个代码子段完整执行,或者程序在多个代码子段之间切换执行的效果是完全一样的。而操作系统进行编码切换的实质开销主要由两个方面构成,一是对于程序现场(主要是通用寄存器和状态控制寄存器)的保存和恢复,二是对编码切换时程序现场的语义转换,由于编译保证不同代码子段使用相同的数据段和堆栈段,因此主要转换现场数据中的函数指针。本实施例提出相应的机制,一方面尽量避免或减少程序现场的保存和恢复需要的操作,另一方面通过优化的虚拟内存管理机制,使编码模式切换时程序中断现场的语义转换保持较少的开销。针对不同的安全需求和场景,可以选择不同的切换频率和切换时机;由于在切换时要重新计算目标现场以及数据存储区域的函数指针,切换会引入不可忽视的开销,因此切换频率和时机会对系统的性能产生显著的影响。考虑到每种机制的防御目标以及引入开销的差别,我们可以制定相应的实施策略,以获得防御效果和系统效率的折中。本实施例在内核中建立相应的复合代码切换策略管理内核组件,针对安全性和性能的需求对代码子的段切换策略进行预先的或者运行时的动态管理。本实施例依赖编译机制生成一个支持数据空间切换的数据库,内核在执行代码子段切换时,能够通过查询数据库,获知当前的上下文寄存器以及内存数据段和堆栈段中,哪些数据是函数指针,从而快速地将这些函数指针切换到新的代码子段中。编码模式的切换可通过CPU的中断(或者异常)机制完成。每一次中断的处理都存在同编码模式切换无关的开销,因此本实施例推荐(但不强制)每一次切换相关的中断到来时,都进行代码子段的切换,否则这次中断只引发现场的保存和恢复,相当于一次多余的操作,浪费了CPU资源。从安全角度上,本实施例需要这种中断到来的时机是随机的。综合这些考虑,本实施例推荐采用一个可配置硬件方式能够随机性的生成中断,从而随机性地引发编码模式的切换。
此外,本实施例还提供一种基于代码段随机切换的地址导向型攻击防护装置,包括相互连接的微处理器和存储器,所述微处理器被编程或配置以执行前述基于代码段随机切换的地址导向型攻击防护方法的步骤。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可读存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (9)
1.一种基于代码段随机切换的地址导向型攻击防护方法,其特征在于,包括:
1)编译目标程序,生成包含整体语义等价但内存布局不同的多个代码子段以及偏移关系数据库的二进制程序;
2)加载并运行目标程序,且在运行目标程序过程中,引发随机性的切换操作使得CPU在目标程序不同的代码子段之间切换执行,且切换代码子段后指令的执行同不切换代码子段的程序执行有相同的语义和执行结果,从而实现程序代码执行地址及其内存布局模式的切换以阻止地址导向攻击的发生;
步骤1)之前包括编译生成目标程序的步骤:通过静态分析获取目标程序中函数指针变量,并分析间接函数,间接函数的调用过程包含两个部分:在函数指针赋值处把目标函数的地址写入指针,在间接函数调用处通过函数指针取出目标函数地址,然后跳转到目标地址执行;采用编译器辅助方式构建链表式数据库,记录执行体运行不同阶段的寄存器和数据内存中的代码子段的地址存储,以及不同代码子段之间的偏移关系;在迁移目标程序时,通过上下文管理内核模块通过查表方式快速获取哪些寄存器和内存值需要修改以及修改的偏移量记录为数据库,该数据库将在编译阶段生成并注入到目标程序的执行体中成为一个单独的数据段;步骤1)中加载目标程序时,包括内核将目标程序的单独的数据段以共享内存方式开放给内核访问的步骤。
2.根据权利要求1所述的基于代码段随机切换的地址导向型攻击防护方法,其特征在于,步骤1)中编译目标程序时,目标程序的软件执行体的虚地址空间包括代码段、BSS段、数据段、堆段和栈段,所述目标程序拥有的多重整体语义等价但内存布局不同的代码子段存储在代码段中。
3.根据权利要求1所述的基于代码段随机切换的地址导向型攻击防护方法,其特征在于,步骤2)中引发随机性的切换操作使得CPU在目标程序不同的代码子段之间切换执行时,包括将CPU的运行环境能够切换到不同的代码子段所对应的硬件执行环境,不同的代码子段所对应的硬件执行环境包括通用寄存器、状态和控制寄存器、堆栈寄存器及指令寄存器;同时,操作系统对于内核或核外进程的数据段、堆栈段采用唯一的内存副本,使得数据段、堆栈段在切换代码子段后能直接为切换后的代码子段所使用。
4.根据权利要求3所述的基于代码段随机切换的地址导向型攻击防护方法,其特征在于,所述将CPU的运行环境能够切换到不同的代码子段所对应的硬件执行环境是通过上下文管理内核组件来实现的,所述上下文管理内核组件将CPU的运行环境能够切换到不同的代码子段所对应的硬件执行环境时,通过查表方式快速获取哪些寄存器和内存值需要修改以及修改的偏移量,从而实现包括通用寄存器、状态和控制寄存器、堆栈寄存器及指令寄存器在内的硬件执行环境切换。
5.根据权利要求1所述的基于代码段随机切换的地址导向型攻击防护方法,其特征在于,步骤2)中引发随机性的切换操作使得CPU在目标程序不同的代码子段之间切换执行之前还包括下述步骤:判断目标程序的类型是内核程序还是用户程序,若是用户程序则引发随机性的切换操作,若是内核程序且需要保证系统性能,则不引发随机性的切换操作、按照普通程序的方式执行。
6.根据权利要求1所述的基于代码段随机切换的地址导向型攻击防护方法,其特征在于,步骤1)可包括对目标程序进行静态扫描用户进程代码或源代码确定受攻击风险类型的步骤,步骤2)中引发随机性的切换操作使得CPU在目标程序不同的代码子段之间切换执行之前还包括下述步骤:判断目标程序的受攻击风险类型,若是受攻击风险高的程序则引发随机性的切换操作,若是受攻击风险低的程序,则不引发随机性的切换操作、按照普通程序的方式执行以提高执行性能。
7.根据权利要求1所述的基于代码段随机切换的地址导向型攻击防护方法,其特征在于,步骤2)中引发随机性的切换操作是通过CPU中的定时器发出的触发随机中断信号实现的,所述定时器的精度和CPU主频保持一个量级。
8.根据权利要求7所述的基于代码段随机切换的地址导向型攻击防护方法,其特征在于,所述CPU中还包括随机数发生器,所述随机数发生器随机设定的随机数被作为定时器的触发延迟,当为定时器触发时,一方面将会生成一个触发随机中断信号通知CPU核,另一方面会启动随机数发生器生成下一个定时器的触发延迟;所述引发随机性的切换操作使得CPU在目标程序不同的代码子段之间切换执行时,包括通过随机数发生器生成待执行的代码子段的步骤。
9.一种基于代码段随机切换的地址导向型攻击防护装置,包括相互连接的微处理器和存储器,其特征在于,所述微处理器被编程或配置以执行权利要求1-8中任意一项所述基于代码段随机切换的地址导向型攻击防护方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110218259.3A CN112905998B (zh) | 2021-02-26 | 2021-02-26 | 基于代码段随机切换的地址导向型攻击防护方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110218259.3A CN112905998B (zh) | 2021-02-26 | 2021-02-26 | 基于代码段随机切换的地址导向型攻击防护方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112905998A CN112905998A (zh) | 2021-06-04 |
CN112905998B true CN112905998B (zh) | 2023-10-03 |
Family
ID=76108526
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110218259.3A Active CN112905998B (zh) | 2021-02-26 | 2021-02-26 | 基于代码段随机切换的地址导向型攻击防护方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112905998B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113541922B (zh) * | 2021-07-20 | 2023-02-03 | 山东大学 | 交换网络和跳转算法指令化的侧信道攻击抵抗方法及系统 |
CN113672237B (zh) * | 2021-09-03 | 2022-03-11 | 支付宝(杭州)信息技术有限公司 | 防内存越界的程序编译方法及装置 |
CN114254400B (zh) * | 2021-12-27 | 2024-05-03 | 中国人民解放军战略支援部队信息工程大学 | 基于动态影子栈的栈缓冲区溢出攻击防御方法及系统 |
CN115309402B (zh) * | 2022-07-13 | 2023-10-24 | 国网江苏省电力有限公司信息通信分公司 | 一种可量化差异的异构执行程序集合构成方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108090346A (zh) * | 2017-12-04 | 2018-05-29 | 华中科技大学 | 一种基于数据流监控的代码复用攻击防御方法及系统 |
US10579806B1 (en) * | 2019-08-27 | 2020-03-03 | Zeus Sw Defender, Llc | Systems and methods for dynamic reencryption of code pointers |
CN112199681A (zh) * | 2020-10-22 | 2021-01-08 | 中国人民解放军国防科技大学 | 基于多编码模式cpu的代码注入型攻击防护方法及装置 |
-
2021
- 2021-02-26 CN CN202110218259.3A patent/CN112905998B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108090346A (zh) * | 2017-12-04 | 2018-05-29 | 华中科技大学 | 一种基于数据流监控的代码复用攻击防御方法及系统 |
US10579806B1 (en) * | 2019-08-27 | 2020-03-03 | Zeus Sw Defender, Llc | Systems and methods for dynamic reencryption of code pointers |
CN112199681A (zh) * | 2020-10-22 | 2021-01-08 | 中国人民解放军国防科技大学 | 基于多编码模式cpu的代码注入型攻击防护方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN112905998A (zh) | 2021-06-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112905998B (zh) | 基于代码段随机切换的地址导向型攻击防护方法及装置 | |
Bletsch et al. | Jump-oriented programming: a new class of code-reuse attack | |
Homescu et al. | Librando: transparent code randomization for just-in-time compilers | |
US9250937B1 (en) | Code randomization for just-in-time compilers | |
CN102592082B (zh) | 通过操作码随机化的安全 | |
EP1800434B1 (en) | Proactive computer malware protection through dynamic translation | |
US20090049425A1 (en) | Code Obfuscation By Reference Linking | |
Chen et al. | Automatic construction of jump-oriented programming shellcode (on the x86) | |
CN104809401A (zh) | 一种操作系统内核完整性保护方法 | |
Wang et al. | Reranz: A light-weight virtual machine to mitigate memory disclosure attacks | |
Zhang et al. | Exploring branch predictors for constructing transient execution trojans | |
US10528729B2 (en) | Methods and systems for defending against cyber-attacks | |
CN112199681B (zh) | 基于多编码模式cpu的代码注入型攻击防护方法及装置 | |
Shuo et al. | Prevent kernel return-oriented programming attacks using hardware virtualization | |
Shapiro et al. | {“Weird}{Machines”} in {ELF}: A Spotlight on the Underappreciated Metadata | |
CN105868633B (zh) | 一种恶意软件感染后宿主软件中恶意代码识别方法 | |
Mortimer | Removing ROP gadgets from OpenBSD | |
Bletsch | Code-reuse attacks: new frontiers and defenses | |
Wang et al. | An efficient control-flow based obfuscator for micropython bytecode | |
Xu et al. | AT-ROP: Using static analysis and binary patch technology to defend against ROP attacks based on return instruction | |
Shao et al. | fASLR: Function-based ASLR for resource-constrained IoT systems | |
US11016767B2 (en) | Target injection safe method for inlining instance-dependent calls | |
CN110515652B (zh) | 代码摘要的生成方法、装置和存储介质 | |
JP2004240953A (ja) | コンピュータシステム、その同時多重スレッディング方法およびキャッシュコントローラシステム。 | |
CN110597571A (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 |