CN117972799A - 一种应用于arm处理器的指针保护方法、计算机系统 - Google Patents
一种应用于arm处理器的指针保护方法、计算机系统 Download PDFInfo
- Publication number
- CN117972799A CN117972799A CN202410173644.4A CN202410173644A CN117972799A CN 117972799 A CN117972799 A CN 117972799A CN 202410173644 A CN202410173644 A CN 202410173644A CN 117972799 A CN117972799 A CN 117972799A
- Authority
- CN
- China
- Prior art keywords
- pointer
- protected
- metadata
- memory
- value
- 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
- 238000000034 method Methods 0.000 title claims abstract description 71
- 238000012795 verification Methods 0.000 claims abstract description 110
- 238000004422 calculation algorithm Methods 0.000 claims abstract description 26
- 230000006870 function Effects 0.000 claims description 62
- 238000004590 computer program Methods 0.000 claims description 3
- 238000005516 engineering process Methods 0.000 description 47
- 238000002955 isolation Methods 0.000 description 20
- 230000007246 mechanism Effects 0.000 description 14
- 230000008569 process Effects 0.000 description 9
- 238000004458 analytical method Methods 0.000 description 8
- 230000009225 memory damage Effects 0.000 description 4
- 238000012545 processing Methods 0.000 description 4
- 230000003068 static effect Effects 0.000 description 4
- 238000010586 diagram Methods 0.000 description 3
- 238000013507 mapping Methods 0.000 description 3
- 238000004364 calculation method Methods 0.000 description 2
- 230000000644 propagated effect Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000015556 catabolic process Effects 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 239000012634 fragment Substances 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 230000002265 prevention Effects 0.000 description 1
- 230000002441 reversible effect Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000001629 suppression Effects 0.000 description 1
- 238000010200 validation analysis Methods 0.000 description 1
Landscapes
- Storage Device Security (AREA)
Abstract
本发明提供了一种应用于ARM处理器的指针保护方法,所述ARM处理器包括普通内存和隔离内存,所述ARM处理器上加载有被保护可执行文件,所述被保护可执行文件中配置有指针信息,所述方法包括:在所述ARM处理器执行被保护可执行文件时基于其中配置的指针信息按照预设的加密算法计算指针验证值,并将指针验证值存储至隔离内存中,所述指针验证值指示被保护可执行文件执行时指针信息是否被篡改;在所述ARM处理器执行被保护可执行文件时将其中配置的指针信息存储至普通内存中。本发明通过在普通内存中存储指针的信息,在隔离内存中存储指针验证值,使每次访问待保护指针时通过计算和比较指针验证值来确保待保护指针未被攻击者篡改,进而保护计算机系统的安全。
Description
技术领域
本发明涉及计算机系统安全技术领域,具体来说涉及计算机系统安全技术中的指针保护技术,更具体地说,涉及一种应用于ARM处理器的指针保护方法、计算机系统。
背景技术
近几十年IT技术蓬勃发展,计算机已经渗透到了人们生活的方方面面,在各行各业中扮演了极其重要的角色。随着计算机系统越来越复杂,安全漏洞也变得层出不穷,一旦这些漏洞被黑客掌握和利用,就会产生极其恶劣的安全问题,造成人民生命财产的重大损失。计算机系统安全问题大都是由安全漏洞导致的,其中内存破坏漏洞是最为常见的漏洞类型之一。内存破坏漏洞是一类以特定方式破坏计算机内存中关键数据的漏洞。利用内存破坏漏洞,攻击者可以篡改函数返回地址、SEH等关键数据,进而劫持程序的控制流。内存破坏漏洞的产生主要是有程序员使用非内存安全语言(C语言、C++语言等)编程时,自己管理计算机系统内存出错所导致的。攻击者通常利用内存破坏漏洞篡改指针来劫持程序的控制流,要么执行攻击者注入的恶意代码,要么执行已有的代码片段发动ROP攻击等。
为了防止内存破坏漏洞带来的安全问题,研究人员针对不同的计算机系统提出了不同的指针保护技术。对于基于ARM处理器的计算机系统,研究人员提出了基于密码的指针保护技术(加密保护技术),所谓加密保护技术对内存中的指针进行原地签名(也就是计算哈希值),并在指针解引用时进行验签操作以确保指针没有被攻击者篡改,这样就能利用签名技术将指针的安全性问题转化成密钥的安全性问题,然后利用安全存储等手段确保密钥的安全性,进而实现指针的安全。对于基于X86处理器的计算机系统,研究人员提出了基于内存隔离的指针保护技术(隔离保护技术),所谓的隔离保护技术是将指针隔离存储到安全内存区域(隔离内存)中,通过阻止攻击者访问该隔离内存来实现指针的安全存储。
虽然现有的指针保护技术能够在一定程度上防止内存破坏漏洞带来的安全问题,但是加密保护技术依然面临着指针替换攻击,即攻击者可以使用已有签名的指针替换目标签名的指针完成攻击。为了解决这一问题,有研究人员根据隔离保护技术在基于ARM处理器的计算机系统上引入MTE(Memory Tagging Extension)技术来加强程序内存安全。MTE技术可以以16字节为粒度对内存打标签,最多可以对内存打16种标签(一个标签4比特),标签信息以数组的方式连续存储在隔离的物理内存区域(标签内存)中;MTE技术还可以对每个指针打标签,最多可以打16种标签,标签信息存储在指针的高位。MTE技术提供两条指令LDG和STG用来访问标签内存,以此来获取和修改每16字节的内存对象所对应的标签值,每次访存时,MTE会自动地比较指针的标签值和访问的存储在标签内存中对应的标签值是否一致。如果一致就正常访问,不一致就拒绝访问。虽然在基于ARM处理器的计算机系统上引入MTE能够加强程序内存安全,但是由于最多可以对指针打16种标签,也就是说可能存在不同指针为同一标签的情形,这种情况被称为标签碰撞,攻击者可以利用标签碰撞来成功攻击系统,导致计算机系统出现安全问题。
综上所述,虽然研究人员引入了MTE技术来加强ARM处理器上的程序内存安全,但是由于MTE技术最多可以对指针打16种标签,也就是说可能存在不同指针为同一标签的情形(标签碰撞),当发生标签碰撞时,攻击者可以利用标签碰撞来成功攻击系统,进而导致计算机系统出现安全问题。
需要说明的是:本背景技术仅用于介绍本发明的相关信息,以便于帮助理解本发明的技术方案,但并不意味着相关信息必然是现有技术。在没有证据表明相关信息已在本发明的申请日以前公开的情况下,相关信息不应被视为现有技术。
参考文献:
[1]Liljestrand,H.,Nyman,T.,Wang,K.,Perez,C.C.,Ekberg,J.E.,&Asokan,N.(2019).{PAC}it up:Towards pointer integrity using{ARM}po interauthentication.In 28th USENIX Security Symposium(USENIX Secur ity 19)(pp.177-194).
[2]Liljestrand,H.,Nyman,T.,Gunn,L.J.,Ekberg,J.E.,&Asokan,N.(2021).{PACStack}:an authenticated call stack.In 30th USENIX SecuritySymposium(USENIX Security 21)(pp.357-374).
[3]Farkhani,R.M.,Ahmadi,M.,&Lu,L.(2021).{PTAuth}:Temporal MemorySafety via Robust Points-to Authentication.In 30th USENIX Sec urity Symposium(USENIX Security 21)(pp.1037-1054).
[4]Ismail,M.,Quach,A.,Jelesnianski,C.,Jang,Y.,&Min,C.(2022).Ti ghtlySeal Your Sensitive Pointers with{PACTight}.In 31st USENIX Sec uritySymposium(USENIX Security 22)(pp.3717-3734).
[5]Kuznetzov,V.,Szekeres,L.,Payer,M.,Candea,G.,Sekar,R.,&Song,D.(2018).Code-pointer integrity.In The Continuing Arms Race:Code-Reuse Attacksand Defenses(pp.81-116).
[6]Vahldiek-Oberwagner,A.,Elnikety,E.,Duarte,N.O.,Sammler,M.,Druschel,P.,&Garg,D.(2019).{ERIM}:Secure,Efficient In-process Isolati on withProtection Keys({{{{{MPK}}}}}).In 28th USENIX Security Sy mposium(USENIXSecurity 19)(pp.1221-1238).
[7]GWang,Z.,Wu,C.,Xie,M.,Zhang,Y.,Lu,K.,Zhang,X.,...&Yang,M.(2020,May).Seimi:Efficient and secure smap-enabled intra-process memoryisolation.In 2020IEEE Symposium on Security and Privacy(SP)(pp.592-607).IEEE.
[8]Xie,M.,Wu,C.,Zhang,Y.,Xu,J.,Lai,Y.,Kang,Y.,...&Wang,Z.(2022,November).CETIS:Retrofitting Intel CET for generic and efficient intra-process memory isolation.In Proceedings of the 2022ACM SIGSAC Conference onComputer and Communications Security(pp.2989-3002).
发明内容
因此,本发明的目的在于克服上述现有技术的缺陷,提供一种应用于ARM处理器的指针保护方法和一种计算机系统。
本发明的目的是通过以下技术方案实现的:
根据本发明的第一方面,提供一种应用于ARM处理器的指针保护方法,所述ARM处理器包括普通内存和隔离内存,所述ARM处理器上加载有被保护可执行文件,所述被保护可执行文件中配置有指针信息,所述方法包括:在所述ARM处理器执行被保护可执行文件时基于其中配置的指针信息按照预设的加密算法计算指针验证值,并将指针验证值存储至隔离内存中,所述指针验证值指示被保护可执行文件执行时指针信息是否被篡改;在所述ARM处理器执行被保护可执行文件时将其中配置的指针信息存储至普通内存中。
在本发明的一些实施例中,所述指针信息包括指针的值、指针的元数据和指针的索引,其中,所述指针的值指向普通内存中的存储地址;所述指针的元数据指示指针运行时的信息,其包括边界值和随机值;所述指针的索引指示指针的元数据在元数据表中所对应的元数据表项的位置,元数据表中每一个元数据表项用于存储指针的元数据,且每一个元数据表项配置有元数据表项有效位,所述元数据表项有效位指示其对应的元数据表中元数据表项所存储的指针的元数据是否有效。
在本发明的一些实施例中,所述方法包括:将所述元数据表项有效位存储于隔离内存中。
在本发明的一些实施例中,所述元数据表项有效位的值为0或1,其中,一个取值表示其对应的元数据表中元数据表项所存储的指针的元数据有效,另一个取值表示其对应的元数据表中元数据表项所存储的指针的元数据无效。
在本发明的一些实施例中,所述被保护可执行文件通过如下方式对待处理源代码进行指针加密得到:获取待处理源代码并对其进行解析处理以获取所述待处理源代码的中间表示;对所述待处理源代码的中间表示进行分析以识别待保护指针及其对应的操作指令;基于所述待保护指针及其对应的操作指令在所述待处理源代码的中间表示中加入预设的保护函数以生成被保护可执行文件。
在本发明的一些实施例中,所述预设的保护函数包括指针加密保护函数、指针验证保护函数、指针传播保护函数以及指针释放保护函数。
在本发明的一些实施例中,所述指针加密保护函数按照如下方式对所述待保护指针进行加密:读取所述待保护指针的值和元数据并按照预设的加密算法计算所述待保护指针的指针验证值并将其存入所述隔离内存中。
在本发明的一些实施例中,所述指针验证保护函数按照如下方式对所述待保护指针进行验证:读取所述待保护指针的值和元数据并采用预设的加密算法重新计算所述待保护指针的指针验证值,并将重新计算得到的所述待保护指针的指针验证值与隔离内存中存储的所述待保护指针的指针验证值进行比较是否相等,相等时指示所述待保护指针可以正常使用,不相等时指示所述待保护指针不可以正常使用。
在本发明的一些实施例中,所述指针传播函数按照如下方式对所述待保护指针进行传播:读取所述待保护指针的值、元数据和索引并将其复制后存储至普通内存中新的存储地址,并将隔离内存中读取的所述待保护指针的指针验证值复制后存储至隔离内存中新的存储地址。
在本发明的一些实施例中,所述指针释放保护函数按照如下方式对待保护指针进行释放:将所述待保护指针的索引所指示的待保护指针的元数据在元数据表中所对应的元数据表项的位置上的数据清除,并将隔离内存中存储的所述待保护指针的元数据表项有效位的值设置为其对应的元数据表中元数据表项所存储的待保护指针的元数据无效。
优选地,所述预设的加密算法为QARMA算法。
根据本发明的第二方面,提供一种计算机系统,所述系统包括:编译器,用于对待处理源代码进行指针加密以生成被保护可执行文件;ARM处理器,用于执行所述编译器生成的被保护可执行文件;其中,所述计算机系统被配置为采用如本发明第一方面所述方法进行指针保护。
与现有技术相比,本发明的优点在于:(1)在普通内存中存储指针的信息,在隔离内存中存储指针验证值,并且每个指针拥有独特的指针验证值,能够有效避免指针验证值碰撞,进而避免指针替换攻击;(2)每次访问指针时只需计算和比较指针验证值来确保指针未被篡改,无需引入额外的性能开销;(3)由于指针验证值被存储在隔离内存中,攻击者只能替换指针的值而无法替换指针验证值,能够有效地保护计算机系统的安全,防止内存破坏漏洞的发生;(4)指针验证值的大小只有16比特,相较于直接将指针存入隔离内存能够节约大量的内存空间。
附图说明
以下参照附图对本发明实施例作进一步说明,其中:
图1为根据本发明实施例的一种应用于ARM处理器的指针保护方法流程示意图;
图2为根据本发明实施例的一个指针在普通内存和隔离内存中的存储示例示意图;
图3为根据本发明实施例的指针验证保护函数对所述待保护指针进行验证的流程示意图;
图4为根据本发明实施例的编码器架构示意图。
具体实施方式
为了使本发明的目的,技术方案及优点更加清楚明白,以下结合附图通过具体实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
为了方便理解,先简单介绍一下基于ARM处理器的加密保护技术和基于X86处理器的隔离保护技术。
一、加密保护技术
加密保护技术:ARM处理器上引入的指针验证技术(Pointer Authentication,PA)是一种典型的加密保护技术。在该指针验证技术中,基于加密算法以指针原值和上下文信息计算指针的签名值并将其附到指针未使用的高位部分,在使用指针时会重复计算过程以计算指针的签名值并比较其与指针高位所存储的指针的签名值是否一致,以此来判定指针是否被篡改,若一致,则表明指针未被篡改;若不一致,指针验证技术会触发异常中止程序的执行。虽然指针验证技术能够在一定程度上防止内存破坏漏洞带来的安全问题,但是指针验证技术依然面临着指针替换攻击,即攻击者可以使用已有签名的指针替换目标签名的指针完成攻击。
为了解决这一问题,研究人员提出采用更为复杂的运行时信息参与指针的签名,以减少能够互相替换的指针集合(理论上签名时只有采用相同运行时信息的指针才能进行互相替换),以此来最大程度地确保指针的安全性。例如,参考文献[1]提出的PARTS(Pointer Authentication Run-Time Safety)技术用来保护两类指针,一是函数返回地址,另一个是函数指针;PARTS技术在现有的指针验证技术的基础上,在函数返回地址保护中添加了函数ID(function-id)作为额外的运行时信息,还在函数指针中添加了类型ID(type-id)作为额外的运行时信息。参考文献[2]提出的PACStack技术则在函数返回地址的保护上更进一步,在函数返回地址指针保护中采用了函数调用栈信息作为上下文信息,参与到指针的签名操作中。虽然参考文献[1]提出的PARTS技术和参考文献[2]提出的PACStack技术均引入了复杂的运行时信息来缓解指针替换攻击问题,但是并没有根本上指针替换攻击的问题无法完全保证时序安全和空间安全。参考文献[3]提出了PTAuth技术,引入了随机值作为指针的运行时信息,在PTAuth技术中,每次内存分配后,系统将会在特定内存区中存入一个随机值,并作为后续所有指向该内存区域的指针的运行时信息。虽然参考文献[3]提出的PTAuth技术引入的随机值能够防护指针的时序安全,但PTAuth技术假设的攻击模型中攻击者只有特定内存区与普通内存区的读权限,保护强度较弱。参考文献[4]提出了PACTight技术,该技术沿用了PTAuth技术的思路,保留了随机值作为指针运行时信息的一部分,同时在运行时信息中添加了指针的地址,在引入指针地址作为指针信息后,简单的指针替换将很难实现。但是PACTight技术使用指针的值索引存储的随机值,为指针的时间复用带来了可能,即攻击者可以使用同一地址在不同时刻的旧指针尝试复用新指针时,旧指针能够使用指针的值索引到其对应的随机值,此时,旧指针使用地址和对应的随机值能够在此处完成验证,也就意味着攻击者可以完成攻击,也就是说,PACTight技术并不能完全确保时序安全。综合前述可知,即使选用了高度复杂化的运行时信息参与指针签名,基于PA的指针完整性技术依然存在安全性问题,同时选取复杂的运行时信息还会带来更大的性能开销。
二、隔离保护技术
隔离保护技术:参考文献[5]提出的指针完整性技术(Code Pointer Integrity,CPI)是一类典型的隔离保护技术,CPI技术确保敏感指针的完整性,即指针及指向指针的数据指针(例如,含有函数指针的结构体指针)。CPI技术将敏感指针和其指向的对象的元数据信息(例如,起始位置和大小等)存入攻击者无法访问的隔离内存区中,并且在指针创建、传播、计算和销毁时动态维护隔离内存区中的内容,每次指针运算时都会进行严格的检查,以确保指向正确的对象;每次指针解引用时,CPI技术会基于隔离内存区中存储的信息判断普通内存区域中的指针是否发生修改。内存隔离机制的使用是影响安全性的关键,CPI技术采用信息隐藏技术实现的高效内存隔离,即将隔离内存隐藏到巨大的未分配地址空间中,普通内存区域不存在指向隔离内存区的指针,攻击者只能通过试探的方式定位隔离内存区域的位置,且错误的试探会引起程序的崩溃。虽然CPI技术能够在一定程度上防止内存破坏漏洞带来的安全问题,但是CPI技术所采用的信息隐藏技术已经不再安全有效,攻击者可以利用崩溃抑制、侧信道等方法实现持续地内存试探,直到定位到隔离内存的位置。换言之,CPI技术基于隔离的代码指针保护机制在理论上是安全的,但是必须选用的安全可靠的强内存隔离技术来实现内存隔离。
为了提升CPI技术的安全性,研究人员基于X86处理器提供的硬件机制,提出了不同的内存隔离机制并基于此构建了更加安全的CPI技术。例如,参考文献[6]提出的基于X86处理器的MPK(Memory Protection Keys)硬件机制来实现内存隔离,在MPK保护下,每个虚拟页被分配了一个4bit的id,由此将进程的整个内存空间分为了16个域,每个域的读写权限由PKRU寄存器存储,并通过二进制检测保证了所有更新PKRU寄存器的指令是安全的,进而保证了由MPK机制划分出的隔离区的安全。参考文献[7]则提出了利用X86处理器的SMAP(Supervisor-mode Access Prevention)硬件机制来实现内存隔离,利用SMAP阻止特权层级访问用户内存空间的数据,并逆向使用SMAP以将用户代码置入特权层级运行,这样使得用户的敏感数据依旧存放在用户内存空间,但是在SMAP的保护下,攻击者即使能够注入代码,也不能修改用户内存空间的数据,即用户空间的数据可以被视为受到了隔离保护。参考文献[8]提出改造X86处理器的CET(Control-flow Enforcement Technology)硬件机制中的影子栈来实现内存隔离,即利用影子栈构造了高效的隔离区:CET通过在页表项的R/W位和Dirty位置入独特的标志位分配了专用于影子栈的页,并设计了专门的WRSS指令用于修改被标识为影子栈的页(保护了所有WRSS指令使用时的安全性,借用了CET硬件机制中的影子栈实现了更为通用的隔离)。
如在背景技术部分提到的,虽然研究人员引入了MTE技术来加强ARM处理器上的程序内存安全,但是由于MTE技术最多可以对指针打16种标签,也就是说可能存在不同指针为同一标签的情形(标签碰撞),当发生标签碰撞时,攻击者可以利用标签碰撞来成功攻击系统,进而导致计算机系统出现安全问题。
为了解决上述问题,发明人对MTE技术进行详细的分析。MTE(Memory TaggingExtension)技术能够提供强内存隔离保障。具体来说,MTE技术包含两个机制,一个是Memory Tagging机制,该机制可以以16字节为粒度对内存打标签,最多可以对内存打16种标签(一个标签4比特),标签信息以数组的方式连续存储在隔离的物理内存区域(称之为标签内存)中。另一个是Pointer Tagging机制,该机制用于对每个指针打标签,最多可以打16种标签,标签信息存储在指针的高位。除了以上两种机制,MTE技术还提供了两条指令LDG和STG用来访问标签内存以获取和修改每16字节的内存对象所对应的标签值。每次访存时,MTE会自动地比较指针的标签值和访问的目标内存对象的标签值是否一致。如果一致就正常访问,不一致就拒绝访问。通常来讲,MTE技术被用来加强程序的内存安全:相邻的对象设置成不同的标签,指针的越界访问会触发异常;对象被释放后,内存标签设置成不同值,悬挂指针的解引用会触发异常。
基于对MTE技术的分析可知,MTE技术中的Pointer Tagging和Memory Tagging两个机制是可以解耦的,也就是说我们可以只利用Memory Tagging机制对内存打标签,这样指针访存时可以不再检查标签的正确性,但是仍可以使用LDG/STG访存指令访问标签内存。利用这个特性,可以考虑将待保护指针直接存储到标签内存中,且由于标签内存不能被除了LDG/STG访存指令之外的所有指令访问,这就能够很好的保护待保护指针。基于此,发明人考虑直接将待保护指针存储到标签内存中,每次需要访问待保护指针时都使用LDG/STG访存指令访问标签内存来获取待保护指针或者更新待保护指针的值,这样攻击者就不能利用标签碰撞来成功攻击系统。
虽然理论上的确可以直接将待保护指针存储到标签内存中,但是在实际应用时发明人发现这样存储待保护指针的方式存在两方面的不足。一方面是,性能开销问题;这是因为LDG/STG访存指令单次只能访问4比特的数据,并且每次访问的延迟也比普通访存指令要大,这意味着,如果直接将待保护指针直接存储到标签内存中,使用LDG/STG访存指令访问标签内存来获取待保护指针时需要至少访问8字节的标签内存(一个指针的大小),即需要16条LDG/STG访存指令(8*8=64比特,64/4=16条),而这会引入非常大的性能开销。另一个方面是内存布局问题;这是因为标签以数组的方式连续存储在标签内存中,每16字节的普通内存对象与标签内存中4比特的标签值是线性对应关系,我们可以将普通内存和标签内存数组化,普通内存对象数组和标签内存数组每项都是一一对应的(16字节的普通内存对应4比特的标签内存),基于这种对应关系,使用LDG/STG访存指令用来给定一个16字节普通内存对象的地址读写对应的4比特标签值(普通内存地址到标签内存地址是由硬件自动转换的),如果根据已有硬件映射关系,使用待保护指针在普通内存的地址利用LDG/STG访存指令连续获取16个标签值(16*4=64比特)作为隔离的一个待保护指针,此时64比特的隔离内存对应256字节(16*16=256比特)的普通内存,这意味着256字节的普通内存中只能有一个指针,否则隔离存储到标签内存中的两个待保护指针会有重叠。如果想要通过离散化存储的方式在隔离内存中存储待保护指针以避免内存布局问题,则需要额外引入动态映射算法,而这样会带来额外的性能开销。
根据上述分析,发明人意识到不能直接将待保护指针存储至标签内存中,这样存在性能开销和内存布局的问题。为了解决这个问题,在本发明中发明人提出一种新的指针验证方案来保护指针的安全以防止计算机系统出现安全问题。在本方案中,通过压缩单次标签内存的访问数据量并采用硬件直接的标签映射方法来减少性能开销,核心思想是将待保护指针的部分信息仍然存储在普通内存中,在隔离内存(基于MTE技术将内存分为普通内存区和隔离内存区)中存储待保护指针的指针验证值,每次访问待保护指针时通过计算和比较指针验证值来确保待保护指针未被攻击者篡改。且在本方案中,为了提升指针验证值的计算效率,采用ARM处理器引入的指针验证技术PA来计算指针验证值,计算得到的指针验证值的大小只有16比特(此时16比特隔离内存的大小对应64字节的普通内存,即64字节普通内存中只能存储一个待保护指针),能够节约大量的内存空间。
根据新的指针验证方案,如图1所示,本发明提供一种应用于ARM处理器的指针保护方法,所述ARM处理器包括普通内存和隔离内存,所述ARM处理器上加载有被保护可执行文件,所述被保护可执行文件中配置有指针信息,所述方法包括:在所述ARM处理器执行被保护可执行文件时基于其中配置的指针信息按照预设的加密算法计算指针验证值,并将指针验证值存储至隔离内存中,所述指针验证值指示被保护可执行文件执行时指针信息是否被篡改;在所述ARM处理器执行被保护可执行文件时将其中配置的指针信息存储至普通内存中。相较于现有的指针保护技术,本发明的方案中,在普通内存中存储指针的信息,在隔离内存中存储指针验证值,并且指针验证值通过指针信息计算得到每个指针拥有不同的指针验证值,能够有效避免指针验证值碰撞,进而避免指针替换攻击;每次访问指针时只需计算和比较指针验证值来确保指针未被篡改,无需引入额外的性能开销;由于指针验证值被存储在隔离内存中,攻击者只能替换指针的值而无法替换指针验证值,能够有效地保护计算机系统的安全,防止内存破坏漏洞的发生;指针验证值的大小只有16比特,相较于直接将指针存入隔离内存能够节约大量的内存空间。
指针验证值被存放在隔离内存中,攻击者只能替换指针的值并不能替换指针验证值,能够有效的保护指针;并且指针验证值通过指针信息得到,不同的指针拥有不同的指针验证值,这能够有效避免标签碰撞,进而避免指针替换攻击;不仅如此,指针验证值的大小只有16比特,相较于直接将待保护指针存入隔离内存能够节约大量的内存空间。
为了更好地理解本发明,下面结合具体的实施例和附图从指针信息、源代码指针加密、保护函数和计算机系统对本发明的方案进行详细的说明。
一、指针信息
根据本发明的一个实施例,所述指针信息包括指针的值、指针的元数据和指针的索引,其中,所述指针的值指向普通内存中的存储地址;所述指针的元数据指示指针运行时的信息,其包括边界值和随机值;所述指针的索引指示指针的元数据在元数据表中所对应的元数据表项的位置,元数据表中每一个元数据表项用于存储指针的元数据,且每一个元数据表项配置有元数据表项有效位,所述元数据表项有效位指示其对应的元数据表中元数据表项所存储的指针的元数据是否有效。
根据本发明的一个实施例,所述方法还包括:将所述元数据表项有效位存储于隔离内存中。在隔离内存中存储元数据表项有效位能够进一步确认指针信息是否被攻击者篡改,即在需要解/引用指针时,根据隔离内存中存储元数据表项有效位的值判断其对应的元数据表中元数据表项所存储的指针的元数据是否有效。
根据本发明的一个实施例,所述元数据表项有效位的值为0或1,其中,一个取值表示其对应的元数据表中元数据表项所存储的指针的元数据有效,另一个取值表示其对应的元数据表中元数据表项所存储的指针的元数据无效。
为了更直观地理解指针信息以及基于指针信息计算得到的指针验证值分别在普通内存和隔离内存中的存储方式,以图2所展示的一个指针在普通内存和隔离内存中的存储方式为例进行说明。在图2中,虚线左边表示普通内存,虚线右边表示隔离内存。在普通内存中存储有指针的值、指针的元数据和指针的索引,其中,ptr表示指针;value表示指针的值;指针的元数据包括边界值和64bit随机值;index表示指针的索引,其指示指针的元数据在元数据表中所对应的元数据表项的位置。在隔离内存中存储有元数据表项对应的的元数据表项有效位(valid位),指示其对应的元数据表中元数据表项所存储的指针的元数据是否有效;以及指针的指针验证值(pac),其指示指针信息是否被篡改。
二、源代码指针加密
根据本发明的一个实施例,所述被保护可执行文件通过如下方式对待处理源代码进行指针加密得到:获取待处理源代码并对其进行解析处理以获取所述待处理源代码的中间表示;对所述待处理源代码的中间表示进行分析以识别待保护指针及其对应的操作指令;基于所述待保护指针及其对应的操作指令在所述待处理源代码的中间表示中加入预设的保护函数以生成被保护可执行文件。需要说明的是,所述待保护指针类型由实际应用时确定,本发明不作具体限制。比如,所述待保护指针可以为敏感指针,敏感指针为代码指针及指向代码指针的数据指针,例如,含有函数指针的结构体指针。
三、保护函数
根据本发明的一个实施例,所述预设的保护函数包括指针加密保护函数、指针验证保护函数、指针传播保护函数以及指针释放保护函数。需要说明的是,所述预设的保护函数还包括指针创建保护函数。
根据本发明的一个实施例,所述指针创建保护函数按照如下方式对所述待保护指针进行创建:在元数据表中选择一个未使用的元数据表项并将所述待保护指针的边界值和一个随机生成的64比特的随机值填入该元数据表项中,并将该元数据表项的序列作为所述待保护指针的索引以便能够基于该索引从元数据表中正确找到该元数据表项。
根据本发明的一个实施例,所述指针加密保护函数按照如下方式对所述待保护指针进行加密:读取所述待保护指针的值和元数据并按照预设的加密算法计算所述待保护指针的指针验证值并将其存入所述隔离内存中。
根据本发明的一个实施例,所述指针验证保护函数按照如下方式对所述待保护指针进行验证:读取所述待保护指针的值和元数据并采用预设的加密算法重新计算所述待保护指针的指针验证值,并将重新计算得到的所述待保护指针的指针验证值与隔离内存中存储的所述待保护指针的指针验证值进行比较是否相等,相等时指示所述待保护指针可以正常使用,不相等时指示所述待保护指针不可以正常使用。需要说明的是,所述指针验证保护函数在对所述待保护指针进行验证时,还需要验证所述待保护指针是否越界:读取所述待保护指针的元数据以获取边界值,基于获取到边界值判断所述待保护指针是否越界,如果所述待保护指针未越界,则表示所述待保护指针可以正常使用,如果所述待保护指针越界,则表示所述待保护指针可以不正常使用。为了更好地理解指针验证保护函数,以图3所展示的指针验证保护函数的执行过程为例进行详细说明,由图3可知,所述指针验证保护函数对所述待保护指针进行验证的过程为:首先读取所述待保护指针的元数据以获取边界值,基于获取到边界值判断所述待保护指针是否越界,如果所述待保护指针越界,则表示所述待保护指针可以不正常使用,指针验证保护函数将报错并结束程序;如果所述待保护指针未越界,则读取所述待保护指针的值和元数据并采用预设的加密算法重新计算所述待保护指针的指针验证值,并将重新计算得到的所述待保护指针的指针验证值与隔离内存中存储的所述待保护指针的指针验证值进行比较是否相等,相等时指示所述待保护指针可以正常使用,不相等时指示所述待保护指针不可以正常使用,指针验证保护函数将报错并结束程序。
根据本发明的一个实施例,所述指针传播函数按照如下方式对所述待保护指针进行传播:读取所述待保护指针的值、元数据和索引并将其复制后存储至普通内存中新的存储地址,并将隔离内存中读取的所述待保护指针的指针验证值复制后存储至隔离内存中新的存储地址。需要说明的是,在普通内存中所存储的所述待保护指针的值、元数据和索引能够一起直接传播,而隔离内存中存储的所述待保护指针的指针验证值需要单独复制至新的存储地址中。
根据本发明的一个实施例,所述指针释放保护函数按照如下方式对待保护指针进行释放:将所述待保护指针的索引所指示的待保护指针的元数据在元数据表中所对应的元数据表项的位置上的数据清除,并将隔离内存中存储的所述待保护指针的元数据表项有效位的值设置为其对应的元数据表中元数据表项所存储的待保护指针的元数据无效。需要说明的是,前述实施例中所提及的保护函数均为具体代码执行过程中的实现原理。
根据本发明的一个实施例,所述预设的加密算法为QARMA算法。需要说明的是,在指针加密保护函数和指针验证保护函数中,均以所述待保护指针的值和元数据采用预设的加密算法计算所述待保护指针的验证值,但是在实际应用过程中,还可以采用其他与指针相关的参数计算指针的验证值,比如,指针的索引、指针的类型信息等,本发明不作特殊限制。还需要说明的是,所述预设的加密算法除了能够使用QARMA算法外,还能使用哈希算法、数字签名算法、随机数生成算法等加密算法,本发明不作具体限制。
四、计算机系统
基于前述实施例,本发明还提出了一种计算机系统,所述系统包括:编译器,用于对待处理源代码进行指针加密以生成被保护可执行文件;ARM处理器,用于执行所述编译器生成的被保护可执行文件;其中,所述计算机系统被配置为采用如前述实施例所述方法进行指针保护。
根据本发明的一个实施例,编译器可采用LLVM(Low Level Virtual Machine)编译器框架,该编译器是一套模块化、可重用的编译器以及工具链技术的集合。编译器LLVM的大部分逻辑都在处理编译优化和代码生成,这些功能由一个个Pass构成。本发明采用如图4所展示的编码架构对源代码进行处理,由图4可知,编码器以LLVM(Low Level VirtualMachine)编译器为基本架构,还添加了中端指针分析Pass和compiler-rt静态库(这两部分构成LLVM IR)。其中,编译器的工作方式为:首先,对源代码进行clang前段处理,即对源代码进行解析处理以获取源代码的中间表示;然后,采用中端指针分析Pass对源代码的中间表示进行分析以识别待保护指针及其对应的操作指令;其中,所述中端指针分析Pass会尝试遍历源代码的中间表示中每个函数中每一个基本块的每一条指令,判断每一条指令是否是待保护指针对应的操作指令;如果不是待保护指针对应的操作指令,则判断是否是最后一条指令,是最后一条指令就退出分析,不是最后一条指令则继续分析其余指令;如果是待保护指针对应的操作指令则将该指令记录在指针分配表中以便在后续处理过程中根据指针分配表中不同的指令在对应时间点从compiler-rt静态库选取对应的保护函数插入;最后,基于待保护指针及其对应的操作指令在源代码的中间表示中加入从compiler-rt静态库中存储的预设的保护函数进行LLVM后端处理以生成被保护可执行文件。
本发明的有益效果在于:(1)在普通内存中存储指针的信息,在隔离内存中存储指针验证值,并且每个指针拥有独特的指针验证值,能够有效避免指针验证值碰撞,进而避免指针替换攻击;(2)每次访问指针时只需计算和比较指针验证值来确保指针未被篡改,无需引入额外的性能开销;(3)由于指针验证值被存储在隔离内存中,攻击者只能替换指针的值而无法替换指针验证值,能够有效地保护计算机系统的安全,防止内存破坏漏洞的发生;(4)指针验证值的大小只有16比特,相较于直接将指针存入隔离内存能够节约大量的内存空间。
需要说明的是,虽然上文按照特定顺序描述了各个步骤,但是并不意味着必须按照上述特定顺序来执行各个步骤,实际上,这些步骤中的一些可以并发执行,甚至改变顺序,只要能够实现所需要的功能即可。
本发明可以是系统、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本发明的各个方面的计算机可读程序指令。
计算机可读存储介质可以是保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以包括但不限于电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式压缩盘只读存储器(CD-ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。
以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。
Claims (14)
1.一种应用于ARM处理器的指针保护方法,所述ARM处理器包括普通内存和隔离内存,所述ARM处理器上加载有被保护可执行文件,所述被保护可执行文件中配置有指针信息,其特征在于,所述方法包括:
在所述ARM处理器执行被保护可执行文件时基于其中配置的指针信息按照预设的加密算法计算指针验证值,并将指针验证值存储至隔离内存中,所述指针验证值指示被保护可执行文件执行时指针信息是否被篡改;
在所述ARM处理器执行被保护可执行文件时将其中配置的指针信息存储至普通内存中。
2.根据权利要求1所述的方法,其特征在于,所述指针信息包括指针的值、指针的元数据和指针的索引,其中,所述指针的值指向普通内存中的存储地址;所述指针的元数据指示指针运行时的信息,其包括边界值和随机值;所述指针的索引指示指针的元数据在元数据表中所对应的元数据表项的位置,元数据表中每一个元数据表项用于存储指针的元数据,且每一个元数据表项配置有元数据表项有效位,所述元数据表项有效位指示其对应的元数据表中元数据表项所存储的指针的元数据是否有效。
3.根据权利要求2所述的方法,其特征在于,所述方法包括:将所述元数据表项有效位存储于隔离内存中。
4.根据权利要求3所述的方法,其特征在于,所述元数据表项有效位的值为0或1,其中,一个取值表示其对应的元数据表中元数据表项所存储的指针的元数据有效,另一个取值表示其对应的元数据表中元数据表项所存储的指针的元数据无效。
5.根据权利要求4所述的方法,其特征在于,所述被保护可执行文件通过如下方式对待处理源代码进行指针加密得到:
获取待处理源代码并对其进行解析处理以获取所述待处理源代码的中间表示;
对所述待处理源代码的中间表示进行分析以识别待保护指针及其对应的操作指令;
基于所述待保护指针及其对应的操作指令在所述待处理源代码的中间表示中加入预设的保护函数以生成被保护可执行文件。
6.根据权利要求5所述的方法,其特征在于,所述预设的保护函数包括指针加密保护函数、指针验证保护函数、指针传播保护函数以及指针释放保护函数。
7.根据权利要求6所述的方法,其特征在于,所述指针加密保护函数按照如下方式对所述待保护指针进行加密:
读取所述待保护指针的值和元数据并按照预设的加密算法计算所述待保护指针的指针验证值并将其存入所述隔离内存中。
8.根据权利要求7所述的方法,其特征在于,所述指针验证保护函数按照如下方式对所述待保护指针进行验证:
读取所述待保护指针的值和元数据并采用预设的加密算法重新计算所述待保护指针的指针验证值,并将重新计算得到的所述待保护指针的指针验证值与隔离内存中存储的所述待保护指针的指针验证值进行比较是否相等,相等时指示所述待保护指针可以正常使用,不相等时指示所述待保护指针不可以正常使用。
9.根据权利要求8所述的方法,其特征在于,所述指针传播函数按照如下方式对所述待保护指针进行传播:
读取所述待保护指针的值、元数据和索引并将其复制后存储至普通内存中新的存储地址,并将隔离内存中读取的所述待保护指针的指针验证值复制后存储至隔离内存中新的存储地址。
10.根据权利要求9所述的方法,其特征在于,所述指针释放保护函数按照如下方式对待保护指针进行释放:
将所述待保护指针的索引所指示的待保护指针的元数据在元数据表中所对应的元数据表项的位置上的数据清除,并将隔离内存中存储的所述待保护指针的元数据表项有效位的值设置为其对应的元数据表中元数据表项所存储的待保护指针的元数据无效。
11.根据权利要求10所述的方法,其特征在于,所述预设的加密算法为QARMA算法。
12.一种计算机系统,其特征在于,所述系统包括:
编译器,用于对待处理源代码进行指针加密以生成被保护可执行文件;
ARM处理器,用于执行所述编译器生成的被保护可执行文件;
其中,所述计算机系统被配置为采用如权利要求1-11中任一所述方法进行指针保护。
13.一种计算机可读存储介质,其特征在于,其上存储有计算机程序,所述计算机程序可被处理器执行以实现权利要求1至11中任一项所述方法的步骤。
14.一种电子设备,其特征在于,包括:
一个或多个处理器;以及
存储器,其中存储器用于存储可执行指令;
所述一个或多个处理器被配置为经由执行所述可执行指令以实现权利要求1至11中任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410173644.4A CN117972799A (zh) | 2024-02-07 | 2024-02-07 | 一种应用于arm处理器的指针保护方法、计算机系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410173644.4A CN117972799A (zh) | 2024-02-07 | 2024-02-07 | 一种应用于arm处理器的指针保护方法、计算机系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117972799A true CN117972799A (zh) | 2024-05-03 |
Family
ID=90852802
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202410173644.4A Pending CN117972799A (zh) | 2024-02-07 | 2024-02-07 | 一种应用于arm处理器的指针保护方法、计算机系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117972799A (zh) |
-
2024
- 2024-02-07 CN CN202410173644.4A patent/CN117972799A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10838758B2 (en) | System and method for self-protecting data | |
US11784786B2 (en) | Mitigating security vulnerabilities with memory allocation markers in cryptographic computing systems | |
Almakhdhub et al. | $\mu $ RAI: Securing Embedded Systems with Return Address Integrity | |
Younan et al. | PAriCheck: an efficient pointer arithmetic checker for C programs | |
EP3207485B1 (en) | Code pointer authentication for hardware flow control | |
CN112149145A (zh) | 基于不变指针的数据加密 | |
Szekeres et al. | Eternal war in memory | |
Jackson et al. | On the effectiveness of multi-variant program execution for vulnerability detection and prevention | |
CN101866406A (zh) | 一种栈溢出攻击防御方法 | |
JP2011170836A (ja) | 情報処理装置及びプログラム、情報処理方法、記録媒体 | |
CN112639789A (zh) | 用于存储器完好性检查的完好性树 | |
Nyman et al. | Hardscope: Thwarting DOP with hardware-assisted run-time scope enforcement | |
Ismail et al. | Tightly Seal Your Sensitive Pointers with {PACTight} | |
Liu et al. | TMDFI: Tagged memory assisted for fine-grained data-flow integrity towards embedded systems against software exploitation | |
Piromsopa et al. | Survey of protections from buffer-overflow attacks | |
CN115964758A (zh) | 一种基于TrustZone的内核数据完整性保护方法 | |
CN112100686B (zh) | 一种基于arm指针验证的内核代码指针完整性保护方法 | |
CN117972799A (zh) | 一种应用于arm处理器的指针保护方法、计算机系统 | |
Geden et al. | RegGuard: Leveraging CPU registers for mitigation of control-and data-oriented attacks | |
Ziad et al. | Using Name Confusion to Enhance Security | |
Kisore | A qualitative framework for evaluating buffer overflow protection mechanisms | |
Kisore et al. | FFRR: a software diversity technique for defending against buffer overflow attacks | |
Ziad et al. | EPI: Efficient pointer integrity for securing embedded systems | |
Song et al. | metaSafer: A Technique to detect heap metadata corruption in WebAssembly | |
Momeu et al. | ISLAB: Immutable Memory Management Metadata for Commodity Operating System Kernels |
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 |