CN110162967B - 一种基于mpx的内存时间错误防护方法 - Google Patents
一种基于mpx的内存时间错误防护方法 Download PDFInfo
- Publication number
- CN110162967B CN110162967B CN201910408995.8A CN201910408995A CN110162967B CN 110162967 B CN110162967 B CN 110162967B CN 201910408995 A CN201910408995 A CN 201910408995A CN 110162967 B CN110162967 B CN 110162967B
- Authority
- CN
- China
- Prior art keywords
- pointer
- metadata
- memory
- function
- shadow
- 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
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
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Storage Device Security (AREA)
Abstract
本发明公开了一种基于MPX的内存时间错误防护方法,首先进行代码指针元数据准备;然后对元数据指针元数据进行索引和管理;在代码指针加载时,将生成的指针元数据加载进影子内存;接着在代码指针解引用前,对代码指针进行合法性检查;最后进行影子内存中的指针元数据回收;本发明为MPX在指针解引用前添加了对指针指向对象的合法性检查,攻击者无法利用内存时间错误造成指针指向内存对象与程序正常控制流预期的内存对象不一致,能够实现对内存时间错误攻击的防护。
Description
技术领域
本发明属于信息安全技术领域,涉及一种内存时间错误防护方法,尤其涉及一种基于MPX的内存时间错误防护方法。
背景技术
Intel MPX(Memory Protection eXtensions)在2013年被首先提出,并且在2015年成为Skylake处理器架构的一部分。MPX的初衷是为传统的C/C++程序添加透明的边界检查。不同于其他的安全防护机制,MPX通过引入一套全新的CPU架构和指令集实现对代码指针的合法性检查。在MPX的帮助下,C/C++编译器可以在指针解引用前对指针的边界进行检查。
MPX技术提供的支持主要包括硬件上的一套新的微指令和一套全新的128位长的寄存器,同时,MPX引入了由这些指令抛出的边界越界异常#BR;在操作系统层面上,MPX添加了#BR异常的处理逻辑,它主要包含以下两个功能:(1)按需分配边界的存储空间和(2)无论何时检测到边界越界,程序的标志位进行置位;在编译器层面上,新的MPX转化pass实现了对MPX的代码优化。
返回导向编程(Return-oriented Programming,ROP)由Shacham于2007年提出。ROP利用目标应用程序中的一系列代码片段(gadget),使用ret指令将不同的gadget按照一定的顺序进行拼接组合,形成具有特定功能的gadget链。攻击者在攻击的准备阶段,对目标应用程序及其使用的动态链接库进行分析,搜索可用于发动攻击的gadget,并按照gadget的属性和功能特点将gadget的地址和参数按执行顺序组合,形成ROP攻击载荷。接着,攻击者触发内存漏洞,将攻击载荷注入到进程空间,并篡改目标应用程序的控制流,使控制流指向攻击载荷。
ROP攻击使用目标应用程序中的代码片段组成攻击载荷,攻击者可以按照自己的攻击思路自由选择所需的gadget,灵活性更高,可以调用多个系统库函数。攻击载荷来源丰富,攻击路径选择更加灵活,攻击能力更加强大,这些特点使ROP攻击从提出之日起迅速成为了软件控制流劫持攻击的主流攻击方式。
释放后引用漏洞(Use-After-Free)是由重新引用一块已经被释放的内存引起的。应用程序通过为对象分配内存实现对该对象的访问和管理,通常在该对象不再被使用时,出于节约系统资源的角度,程序会选择释放掉这块内存。如果在内存被释放之后,原先指向该内存的指针没有被修改为空值null,就会造成悬挂指针(Dangling Pointer)。悬挂指针通常有两种成因:
(1)应用程序在对象已经被释放后访问该对象;
(2)函数返回指向一个局部变量的指针,并且变量只在函数内有效,当函数的执行流结束时,该指针变为悬挂指针。
随着信息时代的快速发展,针对当前软件系统的控制流劫持攻击层出不穷。为了保护软件的控制流完整性,Intel公司提出了MPX技术。但是在应用于控制流劫持攻击的防护时,MPX依旧有待于进一步的改进和增强。从安全性上,MPX缺少对内存时间错误的检查,使得针对MPX的UAF攻击成为可能;从性能上MPX基于二级索引的元数据管理机制依旧带来了高昂的性能开销,需要对MPX进行进一步的优化。
发明内容
本发明的目的是提供一种基于MPX的内存时间错误防护方法,通过扩展MPX的指针元数据字段,对MPX的元数据管理和回收机制进行替换,实现对MPX安全性和性能的改进,为软件的控制流完整性保护提供一种新的解决方案。
本发明所采用的技术方案是:一种基于MPX的内存时间错误防护方法,其特征在于,包括以下步骤:
步骤1:代码指针元数据准备;
具体实现包括以下子步骤:
步骤1.1:指针边界生成;
根据指针指向的内存对象,为指针计算与C/C++标准定义的内存对象大小相一致的指针边界;
步骤1.2:内存对象标识生成;
为每个内存对象生成唯一的标识Object_ID;
步骤1.3:函数调用标识生成;
为每个函数调用生成唯一的标识Function_ID;
步骤1.4:内存时间错误元数据生成;
根据指针指向的内存对象和所在的函数调用,将指针的元数据字段中的合法对象标识Obj_ID记录为指针指向的内存对象标识Object_IDi;将指针的元数据字段中的函数标识Fun_ID记录为指针所在的函数Function_IDi;
步骤2:对元数据指针元数据进行索引和管理;在代码指针加载时,将步骤1中生成的指针元数据加载进影子内存;
步骤3:在代码指针解引用前,对代码指针进行合法性检查;
步骤4:影子内存中的指针元数据回收。
本发明具有以下优势:
1)在指针解引用前添加了对指针指向对象的合法性检查,攻击者无法利用内存时间错误造成指针指向内存对象与程序正常控制流预期的内存对象不一致;
2)扩展了MPX的应用场景,能够抵御针对MPX的内存时间错误攻击;
3)优化了MPX的元数据管理和回收机制,实现更加简洁。
附图说明
图1为本发明实施例的整体流程图;
图2为本发明实施例中影子内存和影子调用栈维护的流程图。
具体实施方式
为了便于本领域普通技术人员理解和实施本发明,下面结合附图及实施例对本发明作进一步的详细描述,应当理解,此处所描述的实施示例仅用于说明和解释本发明,并不用于限定本发明。
本实施例选用支持Intel MPX技术的CPU,如SkyLake(英特尔六代核心处理器架构)系列。本发明为MPX在指针解引用前添加对指针指向内存对象合法性的检查。
请见图1,本发明提供了一种基于MPX的内存时间错误防护方法,包括以下步骤:
步骤1:代码指针元数据准备;
具体实现包括以下子步骤:
步骤1.1:指针边界生成;
根据指针指向的内存对象,按照标准C/C++的对象大小计算规范为指针计算与C/C++标准定义的内存对象大小相一致的指针边界;
步骤1.2:内存对象标识生成;
为每个内存对象生成唯一的标识Object_ID;
步骤1.3:函数调用标识生成;
为每个函数调用生成唯一的标识Function_ID;
步骤1.4:内存时间错误元数据生成;
根据指针指向的内存对象和所在的函数调用,将指针的元数据字段中的合法对象标识Obj_ID记录为指针指向的内存对象标识Object_IDi;将指针的元数据字段中的函数标识Fun_ID记录为指针所在的函数Function_IDi;
步骤2:对元数据指针元数据进行索引和管理;在代码指针加载时,将步骤1中生成的指针元数据加载进影子内存;
本实施例在元数据加载阶段,对于内存地址为PAddress的代码指针,将PAddress进行4位右移操作,得到影子内存地址temp,如果temp处的内存未被占用,则将temp记为影子内存地址ShadowAddress;如果temp处的内存被占用,向后方进行线性探测,每次进行5字节移位,直到寻找到未被占用的内存空间,将最终定位的内存地址记为影子内存地址ShadowAddress。
本实施例在元数据读取阶段,对于内存地址为PAddress的代码指针,将PAddress进行4位右移操作,得到影子内存地址temp,如果temp处的指针元数据中的指针值字段PointerValue与PAddress相同,则将temp记为影子内存地址ShadowAddress,并读取ShadowAddress处的元数据;如果PointerValue与PAddress不同,则向后方进行线性探测,每次进行5字节移位,直到寻找到PointerValue与PAddress相同的元数据,并将最终定位的内存地址记为影子内存地址ShadowAddress,读取ShadowAddress处的元数据。
步骤3:在代码指针解引用前,对代码指针进行合法性检查;
具体实现包括以下子步骤:
步骤3.1:元数据读取;
根据步骤2.2中给出的元数据读取策略,读取代码指针的元数据;
步骤3.2:指针合法性检查;
根据读取的指针元数据的指针边界字段,如果当前指针指向的地址Address小于元数据中记录的指针边界下界LowerBound或大于元数据中记录的指针边界上界UpperBound,判定指针访问非法,终止程序运行;根据读取的指针元数据的合法对象标识字段Obj_ID,如果Obj_ID与当前实际指向对象的标识Object_ID不符,判定指针访问非法,终止程序运行。
步骤4:影子内存中的指针元数据回收;
具体实现包括以下子步骤:
步骤4.1:使用LLVM MachineFunctionPass的函数isCall()进行函数调用判断,在每个函数调用的入口,将当前函数调用的标识Function_IDi压入影子调用栈;
步骤4.2:使用LLVM MachineFunctionPass的函数isReturn()进行函数调用返回判断,在每个函数调用的出口,将影子调用栈栈顶的函数调用标识Function_IDi从影子调用栈中弹出;
步骤4.3:遍历影子内存中存储的指针元数据中的函数标识符字段Fun_ID,若指针元数据x的函数标识符Fun_IDx与影子调用栈中弹出的函数标识符Function_IDi相同,则释放元数据x,影子内存和影子调用栈维护过程如图2所示。
本发明通过扩展MPX的指针元数据字段,对MPX的元数据管理和回收机制进行替换,实现对MPX安全性和性能的改进,为软件的控制流完整性保护提供一种新的解决方案。
应当理解的是,本说明书未详细阐述的部分均属于现有技术。
应当理解的是,上述针对较佳实施例的描述较为详细,并不能因此而认为是对本发明专利保护范围的限制,本领域的普通技术人员在本发明的启示下,在不脱离本发明权利要求所保护的范围情况下,还可以做出替换或变形,均落入本发明的保护范围之内,本发明的请求保护范围应以所附权利要求为准。
Claims (2)
1.一种基于MPX的内存时间错误防护方法,其特征在于,包括以下步骤:
步骤1:代码指针元数据准备,所述指针元数据,是内存时间错误元数据与指针边界组合;
具体实现包括以下子步骤:
步骤1.1:指针边界生成;
根据指针指向的内存对象,为指针计算与C/C++标准定义的内存对象大小相一致的指针边界;
步骤1.2:内存对象标识生成;
为每个内存对象生成唯一的标识Object_ID;
步骤1.3:函数调用标识生成;
为每个函数调用生成唯一的标识Function_ID;
步骤1.4:内存时间错误元数据生成;
根据指针指向的内存对象和所在的函数调用,将指针的元数据字段中的合法对象标识Obj_ID记录为指针指向的内存对象标识Object_IDi;将指针的元数据字段中的函数标识Fun_ID记录为指针所在的函数调用标识Function_IDi;
步骤2:对元数据指针元数据进行索引和管理;在代码指针加载时,将步骤1中生成的指针元数据加载进影子内存;
步骤2中所述指针元数据索引和管理,具体实现过程为:
在元数据加载阶段,对于内存地址为PAddress的代码指针,将PAddress进行4位右移操作,得到影子内存地址temp,如果temp处的内存未被占用,则将temp记为影子内存地址ShadowAddress;如果temp处的内存被占用,向后方进行线性探测,每次进行5字节移位,直到寻找到未被占用的内存空间,将最终定位的内存地址记为影子内存地址ShadowAddress;
在元数据读取阶段,对于内存地址为PAddress的代码指针,将PAddress进行4位右移操作,得到影子内存地址temp,如果temp处的指针元数据中的指针值字段PointerValue与PAddress相同,则将temp记为影子内存地址ShadowAddress,并读取ShadowAddress处的元数据;如果PointerValue与PAddress不同,则向后方进行线性探测,每次进行5字节移位,直到寻找到PointerValue与PAddress相同的元数据,并将最终定位的内存地址记为影子内存地址ShadowAddress,读取ShadowAddress处的元数据;
步骤3:在代码指针解引用前,对代码指针进行合法性检查;
步骤3的具体实现包括以下子步骤:
步骤3.1:元数据读取;
根据元数据读取策略,读取代码指针的元数据;
步骤3.2:指针合法性检查;
根据读取的指针元数据的指针边界字段,如果当前指针指向的地址Address小于元数据中记录的指针边界下界LowerBound或大于元数据中记录的指针边界上界UpperBound,判定指针访问非法,终止程序运行;根据读取的指针元数据的合法对象标识Obj_ID,如果Obj_ID与当前实际指向对象的标识Object_IDi不符,判定指针访问非法,终止程序运行;
步骤4:影子内存中的指针元数据回收。
2.根据权利要求1所述的基于MPX的内存时间错误防护方法,其特征在于,步骤4的具体实现包括以下子步骤:
步骤4.1:使用LLVM MachineFunctionPass的函数isCall()进行函数调用判断,在每个函数调用的入口,将当前函数调用标识Function_IDi压入影子调用栈;
步骤4.2:使用LLVM MachineFunctionPass的函数isReturn()进行函数调用返回判断,在每个函数调用的出口,将影子调用栈栈顶的函数调用标识Function_IDi从影子调用栈中弹出;
步骤4.3:遍历影子内存中存储的指针元数据中的函数标识Fun_ID,若指针元数据x的函数标识符Fun_IDx与影子调用栈中弹出的函数调用标识Function_IDi相同,则释放元数据x。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910408995.8A CN110162967B (zh) | 2019-05-15 | 2019-05-15 | 一种基于mpx的内存时间错误防护方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910408995.8A CN110162967B (zh) | 2019-05-15 | 2019-05-15 | 一种基于mpx的内存时间错误防护方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110162967A CN110162967A (zh) | 2019-08-23 |
CN110162967B true CN110162967B (zh) | 2023-02-24 |
Family
ID=67631035
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910408995.8A Active CN110162967B (zh) | 2019-05-15 | 2019-05-15 | 一种基于mpx的内存时间错误防护方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110162967B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112579988B (zh) * | 2020-12-10 | 2022-12-06 | 海光信息技术股份有限公司 | 影子栈数据完整性保护方法、装置和计算机设备 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5590329A (en) * | 1994-02-04 | 1996-12-31 | Lucent Technologies Inc. | Method and apparatus for detecting memory access errors |
US5644709A (en) * | 1994-04-21 | 1997-07-01 | Wisconsin Alumni Research Foundation | Method for detecting computer memory access errors |
WO2012148841A1 (en) * | 2011-04-29 | 2012-11-01 | Google Inc. | Method and apparatus for detecting memory access faults |
CN103745755A (zh) * | 2014-01-06 | 2014-04-23 | 中国科学院软件研究所 | 一种高效且高可用的空间内存错误检测方法 |
CN106940654A (zh) * | 2017-02-15 | 2017-07-11 | 南京航空航天大学 | 源代码中内存错误的自动检测和定位方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10198335B2 (en) * | 2016-09-23 | 2019-02-05 | Intel Corporation | Detecting root causes of use-after-free memory errors |
-
2019
- 2019-05-15 CN CN201910408995.8A patent/CN110162967B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5590329A (en) * | 1994-02-04 | 1996-12-31 | Lucent Technologies Inc. | Method and apparatus for detecting memory access errors |
US5644709A (en) * | 1994-04-21 | 1997-07-01 | Wisconsin Alumni Research Foundation | Method for detecting computer memory access errors |
WO2012148841A1 (en) * | 2011-04-29 | 2012-11-01 | Google Inc. | Method and apparatus for detecting memory access faults |
CN103745755A (zh) * | 2014-01-06 | 2014-04-23 | 中国科学院软件研究所 | 一种高效且高可用的空间内存错误检测方法 |
CN106940654A (zh) * | 2017-02-15 | 2017-07-11 | 南京航空航天大学 | 源代码中内存错误的自动检测和定位方法 |
Also Published As
Publication number | Publication date |
---|---|
CN110162967A (zh) | 2019-08-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10216522B2 (en) | Technologies for indirect branch target security | |
CN109918903B (zh) | 一种基于llvm编译器的程序非控制数据攻击防护方法 | |
US7954096B2 (en) | Shared loader system and method | |
EP2842041B1 (en) | Data processing system and method for operating a data processing system | |
CN111381879B (zh) | 一种数据处理方法及装置 | |
US9703622B2 (en) | Detection of data corruption in a data processing device | |
CN105260659A (zh) | 一种基于qemu的内核级代码重用型攻击检测方法 | |
US10528729B2 (en) | Methods and systems for defending against cyber-attacks | |
CN107908958B (zh) | SELinux安全标识符防篡改检测方法及系统 | |
CN114385189B (zh) | 一种面向深度嵌入式系统的函数地址空间布局随机化方法 | |
CN107577925A (zh) | 基于双重ARM指令虚拟的Android应用程序保护方法 | |
CN110162967B (zh) | 一种基于mpx的内存时间错误防护方法 | |
CN115510430A (zh) | 一种函数指针及其数据依赖的识别与保护方法、装置 | |
US20230236925A1 (en) | Tag checking apparatus and method | |
US11500982B2 (en) | Systems and methods for reliably injecting control flow integrity into binaries by tokenizing return addresses | |
US9639477B2 (en) | Memory corruption prevention system | |
CN115994348A (zh) | 程序流水线的控制方法、处理装置和存储介质 | |
CN113760193A (zh) | 用于资源受限制装置的数据读写方法、装置及指令集 | |
US11055202B1 (en) | Compilation scheme for tagged global variables | |
US11934517B2 (en) | Systems and methods for reliably injecting control flow integrity into binaries without source code | |
CN111898120A (zh) | 控制流完整性保护方法及装置 | |
CN106897588B (zh) | 一种标签函数的处理方法及装置 | |
US20240004991A1 (en) | Execution protection using data colouring | |
US20230418950A1 (en) | Methods, Devices, and Systems for Control Flow Integrity | |
Kim et al. | Fast and space-efficient defense against jump-oriented programming attacks |
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 |