CN114385189A - 一种面向深度嵌入式系统的函数地址空间布局随机化方法 - Google Patents
一种面向深度嵌入式系统的函数地址空间布局随机化方法 Download PDFInfo
- Publication number
- CN114385189A CN114385189A CN202210285035.9A CN202210285035A CN114385189A CN 114385189 A CN114385189 A CN 114385189A CN 202210285035 A CN202210285035 A CN 202210285035A CN 114385189 A CN114385189 A CN 114385189A
- Authority
- CN
- China
- Prior art keywords
- function
- memory
- program
- address
- nsw
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F7/00—Methods or arrangements for processing data by operating upon the order or content of the data handled
- G06F7/58—Random or pseudo-random number generators
- G06F7/588—Random number generators, i.e. based on natural stochastic processes
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Computational Mathematics (AREA)
- Mathematical Analysis (AREA)
- Mathematical Optimization (AREA)
- Pure & Applied Mathematics (AREA)
- Software Systems (AREA)
- Storage Device Security (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开一种面向深度嵌入式系统的函数地址空间布局随机化方法,解决在物联网领域,基于微控制器的深度嵌入式系统由于硬件资源受限,无法抵御代码重用攻击。该方法利用ARM TrustZone‑M以及内存保护单元,在系统运行过程中,当产生函数调用时将被调用函数随机加载到一块空闲内存区域中并执行,实现程序中每个函数的执行地址在每次运行时被随机地加载到内存中执行,实现函数地址空间的随机化。本方法首先利用MPU对存储在闪存中的程序代码段设置为不可执行,以使得函数调用时产生异常;然后利用MPU异常处理机制对被调用的函数触发的异常进行地址验证,在验证通过后将该函数随机加载至内存中;最后在内存中执行该函数。
Description
技术领域
本发明涉及一种面向深度嵌入式系统的函数地址空间布局随机化方法,涉及到函数地址空间布局随机化技术,属于物联网安全技术领域。
背景技术
近年来,随着智能家居的广泛普及和智慧城市建设的不断深入推进,物联网技术已经渗透到现代生活的各个方面,物联网设备的数量飞速增长。在这些物联网设备中,由于其低功耗、低成本的需求,大部分设备采用了基于微控制器(Micro Controller Unit)实现的嵌入式系统,比如车载控制设备、智能锁具、无人机、可植入医疗设备等。由于运行在这些设备中的嵌入式系统软件一般用C语言实现,因此与通用系统类似,嵌入式系统软件通常存在各类内存破坏漏洞,黑客可以利用这些漏洞来对系统进行恶意攻击。其中,代码重用攻击是一种十分典型的漏洞利用手段。
由于嵌入式系统硬件资源受限,通用系统中已广泛部署的防御机制很难直接应用于嵌入式系统。传统的地址空间布局随机化技术(AddressSpaceLayoutRandomization,ASLR)是一种抵御代码重用攻击的技术。在程序加载阶段,ASLR技术通过将程序代码和数据在内存空间的布局进行随机化以隐藏程序的地址信息,防止被攻击者利用并实施代码重用攻击。目前ASLR技术虽然在通用系统(如Windows、Linux、macOS、Android和iOS)上已经十分成熟,但在基于8-,16-,32位微控制器的嵌入式系统中,称为深度嵌入式系统(DeeplyEmbeddedSystem),无法部署应用。因为这些深度嵌入式系统的处理器工作频率大多在100MHz以下,在存储上只有几百KB的闪存以及几十KB的内存,并且它们普遍不支持内存管理单元(MemoryManagementUnit,MMU),因此没有足够的内存空间部署传统的ASLR,这给对代码重用攻击的防御带来了很大的挑战。
传统ASLR以程序段、数据段、栈、堆作为其随机化对象,并在加载阶段对随机化对象在内存空间的位置进行随机偏移,因此需要虚拟内存提供较大内存空间才能保证其随机熵足够大以抵御程序地址暴力破解攻击。但是在深度嵌入式领域,内存为实地址空间且空间容量较小,不足以对以上随机化对象进行较大随机熵的随机化,其次,深度嵌入式系统一般没有程序内存加载阶段,程序直接被烧录到闪存中并在闪存执行,因此无法在加载阶段对程序进行内存空间随机化。
发明内容
本发明正是针对现有技术中存在的问题,提供一种面向深度嵌入式系统的函数地址空间布局随机化方法,本发明利用ARMTrustZone-M技术保证函数随机加载程序的安全性,并以函数为随机化对象,在应用程序运行阶段对被调用的函数进行内存加载并随机化,保证函数在内存中运行时的随机性,该方案结合可信硬件ARMTrustZone-M以及内存保护单元(MemoryProtectionUnit,MPU),实现系统运行阶段对函数进行随机内存加载并执行,保证函数运行时地址的动态随机性,以抵御代码重用攻击(CodeReuseAttack,CRA)。此外,本发明还设计了函数内存随机化管理机制用于对空闲内存进行分配和回收管理,以最大化随机化粒度并且防止内存溢出。
为了实现上述目的,本发明的技术方案如下,一种面向深度嵌入式系统的函数地址空间布局随机化方法,所述方法包括以下步骤:
(1)编译阶段信息预处理,
编译阶段是对NSW程序以及SW程序的定制化编译,在NSW程序编译阶段,定制其编译参数,在SW程序编译阶段,对NSW程序的可执行文件进行信息提取,定义其数据类型并编译到SW程序的函数随机化加载程序中;
(2)运行阶段函数随机化处理,
运行阶段包括系统启动和系统运行两个阶段,系统启动阶段,对NSW程序的代码段设置为不可执行,系统运行过程中,每当有函数调用产生,对被调用的函数进行异常触发验证,验证通过后将该函数重定位到内存的随机地址段执行,在这个过程中,通过内存管理机制确定函数加载的位置并且对已经完成执行的函数进行内存的回收。
作为本发明的一种改进,所述步骤(1)编译阶段信息预处理,具体如下:
(11)在NSW程序编译过程对编译选项进行定制化,使得该程序只使用绝对寻址模式完成函数调用,保证当前函数可被加载到任意内存地址上执行;
(12)根据程序的可执行文件中的符号表,读取信息包括每个函数的入口地址、函数代码大小、该程序的地址空间布局。结合系统的实际内存大小以确定空闲的内存范围为函数内存随机加载区域,NSW程序在默认编译选项且不采用安全机制的情况下,该内存区域在NSW程序运行时是不会被使用的;
(13)函数随机化加载方法实现在SW的MPU(Memory Protection Unit,内存保护单元)异常处理机制中,每当运行一个函数时,会触发MPU异常处理机制将该函数加载至函数内存随机加载区域。利用TrustZone-M隔离技术以保证该随机化加载方法在可信执行环境中安全运行。
作为本发明的一种改进,所述步骤(12),具体如下:
(121)针对ELF格式的可执行文件进行自动化的符号表内信息离线读取;
(122)函数的入口地址及其大小以一个函数表的形式存储在SW的函数随机化加载程序中;
(123)系统的实际内存总大小根据设备配置文件离线获得,内存随机加载区域为实际内存总大小与程序所使用的内存大小两者之间的差值。
作为本发明的一种改进,所述步骤(2)运行阶段函数随机化处理,具体如下:
(22)利用异常处理机制在每一次函数调用阶段对函数进行劫持,将当前函数加载到内存的一个随机地址上,并通过修改异常栈帧中异常返回地址为该函数随机化加载后的入口地址以正确返回并执行该函数;
(23)对触发异常的代码地址进行函数有效性验证,验证该地址是否为NSW程序中的函数入口地址,以防止控制流劫持攻击;
(24)在MPU异常处理机制中对每次函数的调用进行顺序标记,以识别已经执行完成的函数,为函数内存释放做准备;
(25)利用随机化内存管理机制对内存随机加载区域进行内存分配和释放;
(26)在对函数进行随机化时,根据当前函数的大小,随机分配一块内存区域用于加载该函数;
(27)对已执行完成的函数进行内存释放,以避免内存溢出。
作为本发明的一种改进,所述步骤(21),具体如下:
(211)MPU的使能配置实现于系统的Reset Handler中,在NSW程序运行前,对其代码施加不可执行保护;
(212)根据(12)中所获取的NSW程序代码地址范围,设置MPU寄存器使NSW的代码段不可被执行。
作为本发明的一种改进,所述步骤(22),具体如下:
(221)MPU异常处理程序利用真随机数生成器(TrueRandomNumberGenertor,TRNG)在步骤(12)中所获得的内存随机加载区域内生成一个随机地址,将其作为函数随机后的入口地址;
(222)MPU异常处理程序将当前函数的代码内容从原地址范围加载到随机化后的内存地址范围;
(223)MPU异常处理程序将原异常返回地址替换为函数随机化后的函数入口地址。
作为本发明的一种改进,所述步骤(23),具体如下:
(231)通过读取NSW程序的栈指针寄存器获取异常栈帧,该栈帧内保存NSW程序触发异常时的指令地址;
(232)根据触发异常的指令地址与(122)中函数表中的入口地址进行匹配,如果匹配成功则认为该异常有效,否则,则会重启系统。
作为本发明的一种改进,所述步骤(24),具体如下:
(241)构建一个函数栈用于记录函数的调用顺序;
(242)函数执行前,将函数的信息(随机化后的函数入口地址以及函数大小)压入栈中;
(243)根据当前执行函数的调用函数在栈中的位置,识别该位置之后入栈的函数为已执行完成的函数。
作为本发明的一种改进,所述步骤(25),具体如下:
(251)用空闲块链表对内存随机加载区域进行内存管理;
(252)空闲块链表的每个块中包含块大小、块指针、负载数据以及填充数据,每个块需要按照4字节对齐。
作为本发明的一种改进,步骤(26),具体如下:
(261)根据空闲块链表,在符合函数大小的内存块中随机寻找一个内存块,并在该内存块中生成一个随机的入口地址用于加载函数;
(262)随机加载完函数后,内存块剩余的空间将会以块的形式重新插入到空闲块链表中。
作为本发明的一种改进,步骤(27),具体如下:
(271)在对函数进行随机化前进行内存回收;
(272)对步骤(243)中确定已执行完成的函数进行内存的回收,并将回收内存加入到空闲块链表中。
相对于现有技术,本发明具有如下优点,1)该技术方案提出了一种面向微控制器系统的函数地址空间布局随机化技术,以抵御代码重用攻击;2)该方案基于函数的动态加载机制,可以实现细粒度的代码随机化,并且有较高的随机熵;3)该方案利用ARMTrustZone-M以及MPU等硬件技术,包括利用TrustZone-M随机化加载程序与NSW程序隔离,保证加载随机化过程的安全性;利用MPU保护闪存中的代码,防止被攻击者利用实施代码重用攻击,并具有较低的性能和内存开销;4)该方案通过MPU硬件技术对函数的调用进行劫持,相对于软件劫持技术具有较高的执行效率,仅需对原NSW程序可执行文件进行分析和信息提取,并在安全世界的代码中实现随机化加载程序,无需对原NSW程序做任何修改,具有较高的可扩展性。
附图说明
图1为本发明基于函数的地址空间布局随机化方法的整体程序流程图;
图2为本发明在系统运行阶段内存随机分配的内存管理结构图,
其中(a)为单个内存块的数据结构图,(b)为函数随机分配前的内存布局图,(c)为函数随机分配后的内存布局图;
图3为本发明在系统运行阶段函数栈的结构图,
其中(a)为函数关系调用图,(b)为执行函数D前的函数栈结构图,(c)为执行函数D后的函数栈结构图。
具体实施方式
为了加深对本发明的理解,下面结合附图对本实施例做详细的说明。
实施例1:参见图1-图3,一种面向深度嵌入式系统的函数地址空间布局随机化方法,所述方法包括以下步骤:
(1)编译阶段信息预处理,
编译阶段是对NSW程序以及SW程序的定制化编译,在NSW程序编译阶段,定制其编译参数,在SW程序编译阶段,对NSW程序的可执行文件进行信息提取,定义其数据类型并编译到SW程序的函数随机化加载程序中;
(2)运行阶段函数随机化处理,
运行阶段包括系统启动和系统运行两个阶段,系统启动阶段,对NSW程序的代码段设置为不可执行,系统运行过程中,每当有函数调用产生,对被调用的函数进行异常触发验证,验证通过后将该函数重定位到内存的随机地址段执行,在这个过程中,通过内存管理机制确定函数加载的位置并且对已经完成执行的函数进行内存的回收。
其中,所述步骤(1)编译阶段信息预处理,具体如下:
(11)在NSW程序编译过程对编译选项进行定制化,使得该程序只使用绝对寻址模式完成函数调用,保证当前函数可被加载到任意内存地址上执行;
(12)根据程序的可执行文件中的符号表,读取信息包括每个函数的入口地址、函数代码大小、该程序的地址空间布局。结合系统的实际内存大小以确定空闲的内存范围为函数内存随机加载区域,NSW程序在默认编译选项且不采用本安全机制的情况下,该内存区域在NSW程序运行时是不会被使用的;
(13)函数随机化加载方法实现在SW的MPU(Memory Protection Unit,内存保护单元)异常处理机制中,每当运行一个函数时,会触发MPU异常处理机制将该函数加载至函数内存随机加载区域。利用TrustZone-M隔离技术以保证该随机化加载方法在可信执行环境中安全运行。
其中,所述步骤(12),具体如下:
(121)针对ELF格式的可执行文件进行自动化的符号表内信息离线读取;
(122)函数的入口地址及其大小以一个函数表的形式存储在SW的函数随机化加载程序中;
(123)系统的实际内存总大小根据设备配置文件离线获得,内存随机加载区域为实际内存总大小与程序所使用的内存大小两者之间的差值。
其中,所述步骤(2)运行阶段函数随机化处理,具体如下:
(22)利用异常处理机制在每一次函数调用阶段对函数进行劫持,将当前函数加载到内存的一个随机地址上,并通过修改异常栈帧中异常返回地址为该函数随机化加载后的入口地址以正确返回并执行该函数;
(23)对触发异常的代码地址进行函数有效性验证,验证该地址是否为NSW程序中的函数入口地址,以防止控制流劫持攻击;
(24)在MPU异常处理机制中对每次函数的调用进行顺序标记,以识别已经执行完成的函数,为函数内存释放做准备;
(25)利用随机化内存管理机制对内存随机加载区域进行内存分配和释放;
(26)在对函数进行随机化时,根据当前函数的大小,随机分配一块内存区域用于加载该函数。
(27)对已执行完成的函数进行内存释放,以避免内存溢出。
其中,所述步骤(21),具体如下:
(211)MPU的使能配置实现于系统的Reset Handler中,在NSW程序运行前,对其代码施加不可执行保护;
(212)根据(12)中所获取的NSW程序代码地址范围,设置MPU寄存器使NSW的代码段不可被执行。
其中,所述步骤(22),具体如下:
(221)MPU异常处理程序利用真随机数生成器(TrueRandomNumberGenertor,TRNG)在步骤(12)中所获得的内存随机加载区域内生成一个随机地址,将其作为函数随机后的入口地址;
(222)MPU异常处理程序将当前函数的代码内容从原地址范围加载到随机化后的内存地址范围;
(223)MPU异常处理程序将原异常返回地址替换为函数随机化后的函数入口地址。
所述步骤(23),具体如下:
(231)通过读取NSW程序的栈指针寄存器获取异常栈帧,该栈帧内保存NSW程序触发异常时的指令地址;
(232)根据触发异常的指令地址与(122)中函数表中的入口地址进行匹配,如果匹配成功则认为该异常有效。否则,则会重启系统。
其中,所述步骤(24),具体如下:
(241)构建一个函数栈用于记录函数的调用顺序;
(242)函数执行前,将函数的信息(随机化后的函数入口地址以及函数大小)压入栈中;
(243)根据当前执行函数的调用函数在栈中的位置,识别该位置之后入栈的函数为已执行完成的函数。
其中,所述步骤(25),具体如下:
(251)用空闲块链表对内存随机加载区域进行内存管理;
(252)空闲块链表的每个块中包含块大小、块指针、负载数据以及填充数据,每个块需要按照4字节对齐。
步骤(26),具体如下:
(261)根据空闲块链表,在符合函数大小的内存块中随机寻找一个内存块,并在该内存块中生成一个随机的入口地址用于加载函数;
(262)随机加载完函数后,内存块剩余的空间将会以块的形式重新插入到空闲块链表中。
步骤(27),具体如下:
(271)在对函数进行随机化前进行内存回收;
(272)对步骤(243)中确定已执行完成的函数进行内存的回收,并将回收内存加入到空闲块链表中。
具体实施例:参见图1-图3,一种面向深度嵌入式系统的函数地址空间布局随机化方法,利用ARM TrustZone-M以及MPU,在系统运行过程中,当产生函数调用时将被调用函数随机加载到一块空闲内存区域中并执行,从而实现程序中每个函数的执行地址在运行时随机地加载到内存中执行。其整体的程序流程如图1所示。其中,应用程序运行在非安全世界(Non-secure World, NSW),可信执行环境(Trusted Execution Environment,TEE)的程序运行在安全世界(Secure World, SW)。该方法分为两个步骤,分别是编译阶段和运行阶段。
所述基于函数的地址空间布局随机化方法具体包括:
步骤(1)编译阶段信息预处理
本发明提出的基于函数的地址空间随机化方法需要配置编译选项并提取NSW程序中的函数信息。在NSW程序的编译阶段,定制其编译参数。在SW程序的编译阶段,对NSW程序的可执行文件进行信息提取,定义其数据类型并编写到SW程序的随机化加载程序中并编译。
1.1 NSW程序编译配置
本发明提出的方法需要将NSW程序设置为绝对地址模式的函数调用。在NSW程序的编译阶段,设置arm-none-eabi-gcc编译选项-mlong-calls以及-fno-jump-tables使得程序只使用绝对寻址模式跳转。此外,同样对NSW程序所依赖的C程序库进行重新编译。
1.2 信息提取
本发明提出的方法需要获取函数的信息以及内存随机加载区域信息,利用python脚本工具对NSW程序的可执行文件的符号表进行信息提取,信息包括每个函数信息以及程序中代码段、数据段、堆和栈的地址空间布局。其中,代码段的信息用于确定MPU保护的范围,而数据段和堆栈得地址空间布局用于确定剩余的内存空间,改内存空间作为随机加载区域。
1.3获取函数信息
本发明提出的方法需要获取函数的信息,函数信息主要包括函数的入口地址以及函数的代码大小。该信息通过读取NSW程序可执行文件的符号表获得,并在SW程序中建立一个函数表,该表中的每一个表项存储一个NSW程序函数的信息。
1.4函数信息结构存储
为了方便SW读取函数信息,函数的入口地址及其大小以一个数组的形式存储在SW的函数随机化加载程序中。
定义函数信息的数据结构:
可以看到,函数信息包含两个数据类型,即函数的入口地址以及函数大小。
1.5代码段MPU配置
利用MPU将NSW程序的代码段设置为不可执行,这样每次函数的调用就会触发MPU在SW程序中的异常处理机制。
在SW程序可执行文件信息中获取其代码段的起止范围地址,将该范围存储在SW程序中。在系统启动阶段,在ResetHandler中基于该范围对MPU进行设置,将代码段配置为不可执行,保证对该范围的代码访问会触发MPU异常,并在SW程序中执行异常处理程序。
步骤(2)运行阶段函数随机化处理
系统运行阶段需要修改SW程序中的MPU异常处理程序,首先需要对MPU的异常触发进行触发地址验证,然后对触发异常的被调用函数进行内存随机化加载,最后恢复该函数在内存中的执行。
2.1运行时设置MPU不可执行
为了使每次函数的调用会触发MPU在SW程序中的异常处理机制。在程序运行ResetHandler时,基于1.2中确定的NSW的代码段范围,对代码段设置为不可执行。一旦程序执行该区域的代码便会触发MPU的异常处理机制。
2.2 MPU的异常触发地址验证
MPU异常处理程序首先从异常栈桢中获取触发异常的返回地址,然后根据该返回地址与1.2中所提取的NSW程序函数表中每个函数的起始地址进行匹配,如果匹配成功则认为验证成功,表明其为正常的函数调用;如果匹配失败,则认为验证失败,并直接重启系统。
2.3函数内存随机化加载
函数内存随机化加载过程涉及内存随机分配、函数内存的回收以及函数重定位。
(1)函数内存随机分配
基于1.2中确定的内存随机加载区域,利用空闲块链表的数据结构管理该内存空间,如图2所示,一个块包含一个元数据、一块负载数据以及填充数据。元数据为两个字大小,分别对应块的大小以及指向下一个块的指针。负载数据用于存放随机化后的函数代码,如图2(a)所示。为满足内存对齐要求,对函数代码进行相应的数据填充。
在系统启动阶段,整个内存随机加载区域空间会被初始化为一个空闲块。当请求分配指定大小内存时,首先对所有的空闲块进行扫描,随机的选择一个大于指定大小的内存块。然后利用真随机生成器在块中随机的生成一个地址(该地址仍满足指定的内存大小要求)。最后,将该地址作为起始地址生成一个指定大小的块,剩余的区域分裂成两个单独的空闲块。此外,针对相邻的空闲块,将会被自动的合并为一个空闲块。图2(b)表示函数随机分配前的内存布局,图2(c)表示函数随机分配后的内存布局。
对于释放的内存块会重新插入空闲块的链表中。
(2)函数内存回收
函数内存回收负责对一些已经完成的函数所占用的内存进行回收。本发明使用的方法对函数的调用过程用一个称为函数栈的数据结构进行记录。每当函数内存加载之前,函数记录会被压入该函数栈。栈上的一条函数记录包括函数的加载地址以及函数的大小,其数据结构如下:
在图3(a)中所示,A函数依次调用B函数与D函数,然后B函数调用C函数。在函数栈中先将A函数记录入栈,然后在A函数调用B函数时B函数记录入栈,然后在B函数调用C函数时将C函数记录入栈,如图3(b)所示。最后当C函数和B函数都执行完,系统将要执行D函数时,通过匹配函数栈中的函数记录信息,发现B函数和C函数都已执行完,则将其从函数栈弹出,如图3中(c)所示。
函数内存回收发生在异常处理地址验证之后,通过比较该函数的调用者在函数栈的位置来确定已执行完成的函数。首先,利用NSW程序的栈指针以获取异常栈中存储的函数返回地址。然后将该返回地址与函数栈中的函数记录进行匹配,通过比较该返回地址是否在该函数的代码范围内以确定是否为该函数的调用函数。最后将函数栈中在调用函数之前入栈的函数标记为已完成并将其交给(1)中所提到的方法进行内存释放。
(3)函数重定位
函数重定位负责将触发异常的函数随机加载到一块内存区域并重新执行。首先通过(1)中所提到的内存分配方案获得一块内存区域,将该地址作为新的函数入口地址,将原函数的代码完整的拷贝到该内存区域中。然后将异常栈桢中的返回地址替换为随机分配后的地址,最后执行返回操作,异常返回机制会恢复原有函数的寄存器上下文并且跳转到新的函数入口地址执行。
需要说明的是上述实施例,并非用来限定本发明的保护范围,在上述技术方案的基础上所作出的等同变换或替代均落入本发明权利要求所保护的范围。
Claims (10)
1.一种面向深度嵌入式系统的函数地址空间布局随机化方法,其特征在于,所述方法包括以下步骤:
(1)编译阶段信息预处理,
编译阶段是对NSW程序以及SW程序的定制化编译,在NSW程序编译阶段,定制其编译参数,使程序只使用绝对寻址模式,在SW程序编译阶段,对NSW程序的可执行文件进行程序地址空间及函数信息提取,定义其数据类型并编译到SW程序的函数随机化加载程序中;
(2)运行阶段函数随机化处理,
运行阶段包括系统启动和系统运行两个阶段,系统启动阶段,对NSW程序的代码段设置为不可执行以对函数执行进行异常捕获,系统运行过程中,每当有函数调用产生,将触发异常,在异常处理中对异常触发地址进行函数调用验证,验证通过后将该函数重定位并加载到内存的随机地址段执行,在这个过程中,通过随机化内存管理机制分配函数加载的地址并且对已经完成执行的函数进行内存的回收。
2.根据权利要求1所述的面向深度嵌入式系统的函数地址空间布局随机化方法,其特征在于,所述步骤(1)编译阶段信息预处理,具体如下:
(11)在NSW程序编译过程对编译选项进行定制化,使得该程序只使用绝对寻址模式完成函数调用,保证当前函数可被加载到任意内存地址上执行;
(12)根据程序的可执行文件中的符号表,读取信息包括每个函数的入口地址、函数代码大小、该程序的地址空间布局,结合系统的实际内存大小以确定空闲的内存范围为函数内存随机加载区域,NSW程序在默认编译选项且不采用安全机制的情况下,该内存区域在NSW程序运行时是不会被使用的;
(13)函数随机化加载方法实现在SW的内存保护单元(MPU)异常处理机制中,每当运行一个函数时,会触发MPU异常处理机制将该函数加载至函数内存随机加载区域,利用TrustZone-M隔离技术以保证该随机化加载方法在可信执行环境中安全运行。
3.根据权利要求1所述的面向深度嵌入式系统的函数地址空间布局随机化方法,其特征在于,所述步骤(2)运行阶段函数随机化处理,具体如下:
(21)利用MPU将NSW程序的代码段全部设置为不可执行;
(22)利用异常处理机制在每一次函数调用阶段对函数进行劫持,将当前函数加载到内存的一个随机地址上,并通过修改异常栈帧中异常返回地址为该函数随机化加载后的入口地址以正确返回并执行该函数;
(23)对触发异常的代码地址进行函数有效性验证,验证该地址是否为NSW程序中的函数入口地址,以防止控制流劫持攻击;
(24)在MPU异常处理机制中对每次函数的调用进行顺序标记,以识别已经执行完成的函数,为函数内存释放做准备;
(25)利用随机化内存管理机制对内存随机加载区域进行内存分配和释放;
(26)在对函数进行随机化时,根据当前函数的大小,随机分配一块内存区域用于加载该函数;
(27)对已执行完成的函数进行内存释放,以避免内存溢出。
4.根据权利要求2所述的面向深度嵌入式系统的函数地址空间布局随机化方法,其特征在于,所述步骤(12),具体如下:
(121)针对ELF格式的可执行文件进行自动化的符号表内信息离线读取;
(122)函数的入口地址及其大小以一个函数表的形式存储在SW的函数随机化加载程序中;
(123)系统的实际内存总大小根据设备配置文件离线获得,内存随机加载区域为实际内存总大小与程序所使用的内存大小两者之间的差值。
5.根据权利要求3所述的面向深度嵌入式系统的函数地址空间布局随机化方法,其特征在于,所述步骤(21),具体如下:
(211)MPU的使能配置实现于系统的Reset Handler中,在NSW程序运行前,对其代码施加不可执行保护;
(212)根据(12)中所获取的NSW程序代码地址范围,设置MPU寄存器使NSW的代码段不可被执行。
6.根据权利要求3所述的面向深度嵌入式系统的函数地址空间布局随机化方法,其特征在于,所述步骤(22),具体如下:
(221)MPU异常处理程序利用真随机数生成器(TrueRandomNumberGenertor,TRNG)在步骤(12)中所获得的内存随机加载区域内生成一个随机地址,将其作为函数随机后的入口地址;
(222)MPU异常处理程序将当前函数的代码内容从原地址范围加载到随机化后的内存地址范围;
(223)MPU异常处理程序将原异常返回地址替换为函数随机化后的函数入口地址。
7.根据权利要求3所述的面向深度嵌入式系统的函数地址空间布局随机化方法,其特征在于,所述步骤(23),具体如下:
(231)通过读取NSW程序的栈指针寄存器获取异常栈帧,该栈帧内保存NSW程序触发异常时的指令地址;
(232)根据触发异常的指令地址与(122)中函数表中的入口地址进行匹配,如果匹配成功则认为该异常有效,否则,则会重启系统。
8.根据权利要求3所述的面向深度嵌入式系统的函数地址空间布局随机化方法,其特征在于,其特征在于,所述步骤(24),具体如下:
(241)构建一个函数栈用于记录函数的调用顺序;
(242)函数执行前,将函数的信息即随机化后的函数入口地址以及函数大小压入栈中;
(243)根据当前执行函数的调用函数在栈中的位置,识别该位置之后入栈的函数为已执行完成的函数。
9.根据权利要求3所述的面向深度嵌入式系统的函数地址空间布局随机化方法,其特征在于,步骤(25),具体如下:
(251)用空闲块链表对内存随机加载区域进行内存管理;
(252)空闲块链表的每个块中包含块大小、块指针、负载数据以及填充数据,每个块需要按照4字节对齐。
10.根据权利要求3所述的面向深度嵌入式系统的函数地址空间布局随机化方法,其特征在于,步骤(26),具体如下:
(261)根据空闲块链表,在符合函数大小的内存块中随机寻找一个内存块,并在该内存块中生成一个随机的入口地址用于加载函数;
(262)随机加载完函数后,内存块剩余的空间将会以块的形式重新插入到空闲块链表中;
步骤(27),具体如下:
(271)在对函数进行随机化前进行内存回收;
(272)对步骤(243)中确定已执行完成的函数进行内存的回收,并将回收内存加入到空闲块链表中。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210285035.9A CN114385189B (zh) | 2022-03-23 | 2022-03-23 | 一种面向深度嵌入式系统的函数地址空间布局随机化方法 |
PCT/CN2022/100283 WO2023178857A1 (zh) | 2022-03-23 | 2022-06-22 | 一种面向深度嵌入式系统的函数地址空间布局随机化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210285035.9A CN114385189B (zh) | 2022-03-23 | 2022-03-23 | 一种面向深度嵌入式系统的函数地址空间布局随机化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114385189A true CN114385189A (zh) | 2022-04-22 |
CN114385189B CN114385189B (zh) | 2022-06-21 |
Family
ID=81205041
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210285035.9A Active CN114385189B (zh) | 2022-03-23 | 2022-03-23 | 一种面向深度嵌入式系统的函数地址空间布局随机化方法 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN114385189B (zh) |
WO (1) | WO2023178857A1 (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115659322A (zh) * | 2022-12-15 | 2023-01-31 | 中国海洋大学 | 一种基于运行时顺序调度装载的代码复用攻击防御方案 |
CN116401668A (zh) * | 2023-06-08 | 2023-07-07 | 中国海洋大学 | 基于函数分组动态激活的代码重用攻击防御系统及方法 |
WO2023178857A1 (zh) * | 2022-03-23 | 2023-09-28 | 东南大学 | 一种面向深度嵌入式系统的函数地址空间布局随机化方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108090346A (zh) * | 2017-12-04 | 2018-05-29 | 华中科技大学 | 一种基于数据流监控的代码复用攻击防御方法及系统 |
US20180157827A1 (en) * | 2016-12-01 | 2018-06-07 | Korea Advanced Institute Of Science And Technology | Memory alignment randomization method for mitigation of heap exploit |
CN113672906A (zh) * | 2021-08-17 | 2021-11-19 | 中国科学院软件研究所 | 基于risc-v与地址空间布局随机化的内存地址检测攻击防御方法及装置 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108491694A (zh) * | 2018-03-26 | 2018-09-04 | 湖南大学 | 一种动态随机化防御Cache攻击的方法 |
WO2020037115A1 (en) * | 2018-08-15 | 2020-02-20 | RunSafe Security, Inc. | Systems and methods for defeating stack-based cyber attacks by randomizing stack frame size |
CN112446064B (zh) * | 2020-12-14 | 2022-09-27 | 中国人民解放军海军工程大学 | 基于控制流隐藏的轻量级密码芯片总线防护系统及方法 |
CN114385189B (zh) * | 2022-03-23 | 2022-06-21 | 东南大学 | 一种面向深度嵌入式系统的函数地址空间布局随机化方法 |
-
2022
- 2022-03-23 CN CN202210285035.9A patent/CN114385189B/zh active Active
- 2022-06-22 WO PCT/CN2022/100283 patent/WO2023178857A1/zh unknown
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20180157827A1 (en) * | 2016-12-01 | 2018-06-07 | Korea Advanced Institute Of Science And Technology | Memory alignment randomization method for mitigation of heap exploit |
CN108090346A (zh) * | 2017-12-04 | 2018-05-29 | 华中科技大学 | 一种基于数据流监控的代码复用攻击防御方法及系统 |
CN113672906A (zh) * | 2021-08-17 | 2021-11-19 | 中国科学院软件研究所 | 基于risc-v与地址空间布局随机化的内存地址检测攻击防御方法及装置 |
Non-Patent Citations (2)
Title |
---|
YAOHUI CHEN 等: "《NORAX: Enabling Execute-Only Memory》", 《2017 IEEE SYMPOSIUM ON SECURITY AND PRIVACY》, 26 May 2017 (2017-05-26) * |
赵波 等: "嵌入式系统安全综述", 《武汉大学学报》, 30 April 2018 (2018-04-30) * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023178857A1 (zh) * | 2022-03-23 | 2023-09-28 | 东南大学 | 一种面向深度嵌入式系统的函数地址空间布局随机化方法 |
CN115659322A (zh) * | 2022-12-15 | 2023-01-31 | 中国海洋大学 | 一种基于运行时顺序调度装载的代码复用攻击防御方案 |
CN116401668A (zh) * | 2023-06-08 | 2023-07-07 | 中国海洋大学 | 基于函数分组动态激活的代码重用攻击防御系统及方法 |
CN116401668B (zh) * | 2023-06-08 | 2023-08-15 | 中国海洋大学 | 基于函数分组动态激活的代码重用攻击防御系统及方法 |
Also Published As
Publication number | Publication date |
---|---|
WO2023178857A1 (zh) | 2023-09-28 |
CN114385189B (zh) | 2022-06-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN114385189B (zh) | 一种面向深度嵌入式系统的函数地址空间布局随机化方法 | |
CN108090346B (zh) | 一种基于数据流监控的代码复用攻击防御方法及系统 | |
US10990667B2 (en) | Systems and/or methods for automatically protecting against memory corruption vulnerabilities | |
US10460099B2 (en) | System and method of detecting malicious code in files | |
US10146938B2 (en) | Method, apparatus and virtual machine for detecting malicious program | |
Bojinov et al. | Address space randomization for mobile devices | |
CN105260659B (zh) | 一种基于qemu的内核级代码重用型攻击检测方法 | |
Davidson et al. | ILR: Where'd My Gadgets Go? | |
US20160275019A1 (en) | Method and apparatus for protecting dynamic libraries | |
US10528729B2 (en) | Methods and systems for defending against cyber-attacks | |
CN110325994B (zh) | 增强软件应用的控制流完整性的设备和方法 | |
CN111191243B (zh) | 一种漏洞检测方法、装置和存储介质 | |
CN116150739A (zh) | 一种基于关键地址动态保护的栈溢出自动防御方法 | |
CN115659322B (zh) | 一种基于运行时顺序调度装载的代码复用攻击防御方法 | |
Barbu et al. | Application-replay attack on Java Cards: when the garbage collector gets confused | |
US20090113207A1 (en) | Secure overlay manager protection | |
CN112784261B (zh) | 用于程序运行的方法及相应的系统、计算机设备和介质 | |
CN112883374B (zh) | 一种基于ART环境下的Android平台应用程序通用脱壳方法及系统 | |
Roth et al. | Implicit buffer overflow protection using memory segregation | |
CN112955887A (zh) | 面向返回的编程防护 | |
CN111881485A (zh) | 一种基于arm指针验证的内核敏感数据完整性保护方法 | |
EP3293660A1 (en) | System and method of detecting malicious code in files | |
US20220108003A1 (en) | Apparatus and method for kernel runtime randomization | |
Zou et al. | Backward Edge Pointer Protection Technology Based on Dynamic Instrumentation | |
WO2024183879A1 (en) | Data processing apparatus and method for data flow attestation |
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 |