CN105303104A - 用以禁止返回定向编程的动态执行阻止 - Google Patents

用以禁止返回定向编程的动态执行阻止 Download PDF

Info

Publication number
CN105303104A
CN105303104A CN201510679658.4A CN201510679658A CN105303104A CN 105303104 A CN105303104 A CN 105303104A CN 201510679658 A CN201510679658 A CN 201510679658A CN 105303104 A CN105303104 A CN 105303104A
Authority
CN
China
Prior art keywords
code
function
instruction
indirect
executable
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
Application number
CN201510679658.4A
Other languages
English (en)
Other versions
CN105303104B (zh
Inventor
阿伦·巴拉克里沙南
亚历山大·甘特曼
葛仁伟
丹尼尔·科马罗米
毛忆念
阿南德·帕拉尼古德
布莱恩·M·罗森贝格
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Qualcomm Inc
Original Assignee
Qualcomm Inc
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Qualcomm Inc filed Critical Qualcomm Inc
Publication of CN105303104A publication Critical patent/CN105303104A/zh
Application granted granted Critical
Publication of CN105303104B publication Critical patent/CN105303104B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring 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/54Monitoring 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

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)
  • Executing Machine-Instructions (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

本发明提供用以禁止返回定向编程的动态执行阻止。将存储器装置中的可执行代码的多个存储器页的第一子集的状态指示符设定为不可执行状态。将所述多个存储器页的第二子集的状态指示符设定为可执行状态,其中所述多个存储器页的所述第二子集包含到所述多个存储器页的所述第一子集中的函数的间接存根。在应用程序的执行后,即刻将函数调用引导到所述多个存储器页的所述第二子集中的对应间接存根,所述间接存根在引导来自所述多个存储器页的所述第一子集的被调用函数的执行之前修改所述多个存储器页的所述第一子集中的对应函数的所述状态指示符。

Description

用以禁止返回定向编程的动态执行阻止
分案申请的相关信息
本案是分案申请。该分案的母案是申请日为2013年1月5日、申请号为201380005427.4、发明名称为“用以禁止返回定向编程的动态执行阻止”的发明专利申请案。
技术领域
一个特征大体上涉及禁止软件系统中的恶意代码的操作,且更特定来说涉及实施执行阻止且默认地将存储器页标记为不可执行以便减少可用于软件系统中的返回定向编程开发的指令数目的方法和装置。
背景技术
执行软件的计算系统正在经历增长的大量攻击。这些攻击经常将恶意代码插入计算系统中且随后致使计算系统执行恶意代码的方式。恶意代码可执行许多不同操作,例如致使计算系统运行得比正常慢,监视计算系统上的活动,致使计算系统发射或接收用户可能不希望传送的信息,破坏持续和非持续存储器中的数据,以及使计算系统崩溃。
最近已提出有时称为返回定向编程(ROP)开发的攻击机制。一类ROP开发经常称为返回到libc攻击(或返回到libc中攻击)。返回到libc(或返回到libc中)攻击可通过两个属性识别:(a)其使用驻留在许多软件系统中的标准C库,以及(b)其直接跳到libc函数的进入点而不是其内部。ROP开发是有力的技术,其允许攻击者开发软件程序中的有效代码序列而无需将任何新的恶意代码注入到处理器的地址空间中。通过开发一些错误或弱点,攻击可得到对将从其执行指令的下一存储器地址的控制。在一个实例中,这可通过覆写保存在堆栈上的返回地址而发生。举例来说,此攻击可利用缓冲器溢出来指定到堆栈上的合法代码块的返回地址,其在合法函数返回时具有所要的效果。攻击指令指针和/或获得对下一存储器地址的控制的其它方式也是可能的。有效代码序列的小片断(经常称为小工具)可能被攻击者发现,随后串接在一起以形成新的恶意代码序列,进而避开针对代码注入的防御。
在传统ROP开发中,小代码片断是代码的以例如返回或跳转指令结束的部分。其它指令也可用作小工具终止指令。当调用函数时,在向经调用函数的返回的地址完成时,在所述调用之后的指令的地址被推送到堆栈上。因此,所述堆栈可包含许多返回地址,用于处理器跳转到经调用函数完成的时间。如果攻击可对堆栈写入信息,那么所述攻击可用恶意返回地址覆写既定返回地址。此返回地址可对应于由攻击识别的小工具中的一者。
通过操纵多个返回地址,控制调用堆栈的攻击可将多个小工具链接在一起以产生恶意代码序列,而从不需要将任何新代码注入处理器地址空间。通过这些恶意代码序列及其布置的选择,攻击可针对由小工具串组成的恶意程序而引起任意的行为。此类型的攻击是成功的,因为在大多数系统中代码和数据地址是可预测的。也就是说,攻击可在第一计算机中加载特定代码,检视第一计算机的堆栈以确定代码正如何加载,且当此代码加载在第二(目标)计算机中时使用此信息来开发返回堆栈。此攻击可大体上依赖于在不同计算机上以相同方式加载代码。
因此,需要可禁止返回定向编程攻击的稳健相应措施。
发明内容
本发明的实施例包含用于禁止开发堆栈和/或存储器中的脆弱性的设备、方法和计算机可读码。
提供一种在处理电路中操作的方法以通过可执行代码的执行阻止来阻碍返回定向攻击。可将存储器装置中的可执行代码的多个存储器页的第一子集的状态指示符设定为不可执行状态。举例来说,此状态指示符可用以实行驻留于所述多个存储器页的所述第一子集中的可执行代码的执行阻止。类似地,可将用于所述多个存储器页的第二子集的状态指示符设定为可执行状态,其中所述多个存储器页的第二子集包含到所述多个存储器页的第一子集中的函数的间接存根。应注意,可在所述多个存储器页的第一子集或第二子集中的至少一者的状态指示符已设定为不可执行状态之前和/或之后将可执行代码的所述多个存储器页加载到存储器装置中。可执行代码驻留的存储器装置可实施虚拟存储器。随后将函数调用引导到所述多个存储器页的所述第二子集中的对应间接存根,所述间接存根在引导来自所述多个存储器页的所述第一子集的被调用函数的执行之前修改所述多个存储器页的所述第一子集中的对应函数的所述状态指示符。间接存根可将所述多个存储器页的第一子集中的对应函数的状态指示符从不可执行状态修改为可执行状态以实现函数的执行。在完成所述函数调用后,所述方法可即刻返回到所述多个存储器页的所述第二子集中的所述对应间接存根,其中所述对应间接存根随后修改所述多个存储器页的所述第一子集中的所述对应函数的所述状态指示符。间接存根随后可将所述多个存储器页的第一子集中的对应函数的状态指示符从可执行状态修改为不可执行状态以停用函数的执行。
在一个实例中,实行执行阻止可包含当处理电路获取可执行代码用于执行时中止驻留于处于不可执行状态的存储器页中的任何可执行代码的执行。
在一个实例中,所述第一指令可为所述函数调用的部分且所述第二指令是所述对应函数的初始指令。可通过将所述第一指令绑定到所述第二指令以使得只有所述第一指令跟随有所述第二指令才不中止执行,来实施所述间接存根。
可执行代码可对应于单个应用程序和/或进程。在一些实施方案中,所述方法还可包含在完成所述函数调用后即刻冲刷所述处理电路的内部高速缓存存储器。在一些实施方案中,间接存根可在可执行代码的编译阶段或预编译阶段产生。
根据一个实例,用于所述函数的代码可驻留于所述多个存储器页的所述第一子集内的第一存储器页中。可跟踪处于所述可执行状态的所述第一存储器页的使用以确认何时所有进行中函数调用已完成执行所述第一存储器页内的对应代码。随后在完成最后进行中函数调用后即刻将所述第一存储器页的所述状态指示符设定于不可执行状态。
还可提供包括存储器装置和处理电路的处理装置。所述处理电路可经配置以:(a)将存储器装置中的可执行代码的多个存储器页的第一子集的状态指示符设定为不可执行状态;(b)将所述多个存储器页的第二子集的所述状态指示符设定为可执行状态,其中所述多个存储器页的所述第二子集包含到所述多个存储器页的所述第一子集中的函数的间接存根;和/或(c)将函数调用引导到所述多个存储器页的所述第二子集中的对应间接存根,所述间接存根在引导来自所述多个存储器页的所述第一子集的被调用函数的执行之前修改所述多个存储器页的所述第一子集中的对应函数的所述状态指示符。
根据另一方面,对应间接存根可包含限于由处理电路循序执行的至少第一指令和第二指令。如果第一指令之后是除了第二指令之外的任一指令,那么中止函数调用的执行。
提供在处理电路中操作的再一方法。产生包含多个函数的应用程序源代码。还获得和/或产生用于源代码中的每一函数的间接代码。可添加指令以致使源代码在加载到存储器中时经识别为不可执行。也可添加指令以致使间接代码在加载到存储器中时经识别为可执行。可在所述处理电路处变换所述源代码和间接代码以产生可执行代码。可执行代码可对应于单个应用程序和/或进程。间接存根可在可执行代码的编译阶段或预编译阶段产生。可编译源代码和间接代码以使得其在加载到存储器中时驻留于单独的存储器页中。在一个实例中,第一间接代码可致使在调用对应第一函数以执行时将第一函数的存储器状态指示符从不可执行状态切换到可执行状态。在另一实例中,第一间接代码可致使在对应第一函数终止执行时将第一函数的存储器状态指示符从可执行状态切换到不可执行状态。在又一实例中,与第一函数相关联的第一间接代码可适于指向第一函数,其中当产生可执行代码时,编译第一间接代码和第一函数以加载于不同存储器页中。
根据一个方面,间接代码可包含限于由处理电路循序执行的至少第一指令和第二指令。所述方法可进一步包括添加指令以致使在所述第一指令跟随有除了所述第二指令之外的任一指令的情况下中止所述间接代码的执行。
附图说明
图1是说明其中可实施用于禁止ROP攻击的一或多个特征的示范性操作环境、装置和/或系统的框图。
图2说明可在存储器中实施的示范性一般调用堆栈。
图3说明示范性处理电路,其可适于通过初始将可执行代码驻留的全部或大多数存储器空间标记为不可执行来实行执行阻止。
图4说明示范性处理电路的替代配置,其中数据执行阻止模块位于高速缓存存储器系统与存储器装置之间。
图5是说明适于实行增强数据执行阻止特征的处理电路的实例的框图。
图6说明用于产生恶意代码序列的受破坏调用堆栈的实例,包含串接在一起以形成返回定向编程(ROP)开发的小工具。
图7是说明在图5的处理单元的上下文中对小工具获取发生了什么的框图。
图8是说明用于禁止处理单元中的代码执行的一般示范性方法的流程图。
图9是说明在处理电路中操作的用于保护存储器免于ROP开发的另一示范性方法的流程图。
图10是说明用于保护存储器免于ROP开发的示范性方法的流程图。
图11是说明准许在需要或调用存储器区域时修改存储器区域的状态的间接层的示范性实施方案的框图。
图12是说明用于实施准许在需要或调用存储器区域时修改存储器区域的状态的间接层的方法。
图13说明用于在应用程序内实施允许修改应用程序可执行代码驻留的存储器区域的状态以保护对此些存储器区域的存取的间接层的方法。
具体实施方式
在以下描述中,参考附图,其中借助于图解说明而展示其中可实践本发明的特定实施例。实施例既定以充分的细节描述本发明的方面以使所属领域的技术人员能够实践本发明。在不脱离本发明的范围的情况下可利用其它实施例且可对所揭示实施例做出改变。不应在限制性意义进行以下详细描述,且本发明的范围仅由所附权利要求书界定。
术语“数据”在本文可以可互换方式使用以指代可由处理器使用的计算指令和可由处理器操作的数据。术语“数据”的使用的上下文应当使得当“数据”涉及指令时是明显的。在需要的情况下,指令可明确地称为指令或指令数据。
概述
本发明涉及用于通过在不使用时默认地将可执行和不可执行存储器页两者标记为“不可执行”来禁止开发存储器堆栈中的脆弱性的设备、方法和机器可读码。因此,处理电路可对存储器页中经标记为“不可执行”的函数/指令实施执行阻止,因此禁止对来自ROP攻击的指令的调用被执行。
根据一个特征,实施间接层,其中对可执行代码的所有函数调用均首先重定向到存根代码,其改变此些可执行代码所驻留的存储器状态。存根代码可将此可执行代码驻留的存储器区的存储器状态从默认“不可执行”状态改变为“可执行”状态。存根代码随后指向实际可执行代码。在一个实例中,此特征可在应用程序的源代码中和/或当将此应用程序编译为可执行码时实施。也就是说,间接层(例如,存根代码)可在源代码内原生地产生和/或其可在编译时间产生。
根据一个方面,处理电路可实施在“不可执行”存储器页中发现的代码/指令的执行阻止。含有可执行指令的存储器页初始加载到存储器中,且将所有页(除了用于间接层的存根代码所驻留的那些页)默认地标记为“不可执行”。从在处理电路上操作的合法应用程序起始的函数调用通过间接层(即,存根代码),其在从此些存储器页检索和/或执行指令/代码之前或同时地将存储器页的状态从“不可执行”改变为“可执行”。在指令/代码的执行之前,处理电路可检查和/或确认其源自经标记为“可执行”的存储器页中。来自ROP攻击的调用绕过间接层(存根代码)。因此,尝试使用来自经标记为“不可执行”的存储器页的指令(例如,小工具)的ROP攻击将失败,因为处理电路将阻止或中止其执行。
根据又一方面,间接代码可包含限于由处理电路循序执行的至少第一指令和第二指令。如果第一指令之后是除了第二指令之外的任一指令,那么中止函数调用的执行。在一个示范性实施方案中,可避免额外指令实施单独间接层的需要。而是,当使用成对的对应指令(例如,第一指令和第二指令)时,其可致使处理器在可执行与不可执行状态之间切换存储器页和/或执行随后的代码。在一些实施方案中,因为发现第一和第二指令循序执行,所以可不存在在可执行与不可执行状态之间切换的需要,因为处理器在除了第二指令之外的任何指令跟随第一指令的情况下中止所有后续执行。
示范性操作环境
图1是说明其中可实施用于禁止ROP攻击的一或多个特征的示范性操作环境、装置和/或系统100的框图。操作环境100可包含耦合到一或多个存储器和/或存储装置的处理电路102(例如,一或多个处理器)。在一个实例中,操作环境100可实施称为虚拟存储器的存储器管理技术。虚拟存储器是针对多任务内核开发的技术。虚拟存储器虚拟化各种形式的数据和/或可执行代码存储,例如随机存取存储器和磁盘存储,允许将程序设计为似乎仅存在一种存储器“虚拟”存储器,其表现为直接可寻址的读取/写入存储器(RAM)。支持虚拟存储器的许多操作系统也可在其自己的专用地址空间(例如,其自己的虚拟存储器)中运行每一进程,从而允许将程序或应用程序设计为似乎其具有对虚拟存储器的单独存取。举例来说,此处展示多个专用地址空间120a、102b、120c,其中这些地址空间中的每一者可与不同进程、程序和/或应用程序相关联。
在此实例中,虚拟存储器104代表一或多个物理存储器装置108和/或持久存储装置106内的可寻址存储器空间。处理电路102可适于存取虚拟存储器104(或由虚拟存储器映射的存储器地址)以读入呈加载于物理存储器装置108和/或持久存储装置106中的代码和/或数据的形式的可执行指令。
根据一个实例,虚拟存储器104可布置成堆110、堆栈112、恒定数据114、初始化数据116以及可执行指令118。堆110可用于在各种软件程序可在处理环境100内为活动的时所述程序的动态分配。例如恒定数据114和初始化数据116等各种数据可存储在主存储器装置104中供在处理环境100上运行的一或多个程序存取。与各种程序相关联的可执行指令118可存储在指令区域118、堆110或其组合中。
除非另外指定,否则术语“存储器”在下文用以指代虚拟存储器和/或处理电路102从其存取(例如从其读取和/或对其写入)可执行指令和/或数据的任何其它可寻址存储器空间。本文描述的概念在各种类型的存储器架构中操作。举例来说,虚拟存储器可在处理电路102外部的存储器装置(例如,主存储器)中实施,和/或其可在处理电路102内的存储器装置(例如,内部高速缓存存储器)中实施。
根据一个特征,数据执行阻止由处理电路102实施以帮助阻止返回定向编程攻击。根据一个方面,在执行之前,可将可执行指令连同处理电路102在执行代码时可使用的对应间接代码(存根)一起加载到虚拟存储器104中。处理电路102可随后从虚拟存储器104读取指令数据和/或向所述虚拟存储器写入指令/数据。
在此特征中,可执行代码驻留的所有(或大多数)存储器页在其加载(或映射)到虚拟存储器104中时可默认地标记为不可执行。代表“不执行”的NX位可由一些处理电路使用以隔离用于供指令(或代码)存储使用或用于数据存储的存储器区域。具有对NX位的支持的操作系统(在处理电路102上运行)可将可执行代码驻留的虚拟存储器104的所有区域标记为不可执行。在一个实例中,间接代码(存根)驻留的虚拟存储器104的区域可标记为可执行。此间接代码(存根)可插入在源代码中或在应用程序的编译时间产生。来自应用程序的函数调用可调用(或可重定向到)间接代码,其在“不可执行”与“可执行”之间改变存储器状态,且随后将执行引导到可执行代码的对应部分。
每次处理电路102从虚拟存储器104加载/获取存储器页时,在处理电路102内操作的间接层(例如,存根)在加载/获取之前(或同时)将NX位从“不可执行”改变为“可执行”。也就是说,当正由处理电路102执行的应用程序/程序调用存储器页中的函数时,(由间接层)将存储器页从“不可执行”改变为由间接层“可执行”。如果存储器页已经标记为“可执行”(即,存储器页已先前从不可执行切换到可执行),那么间接层无需将NX位改变为不可执行。
处理电路102可包含执行阻止模块,其阻挡在虚拟存储器104中标记为“不可执行”的存储器页中驻留的任何代码的执行。在完成所要函数的执行后,虚拟存储器104中对应可执行代码所驻留的存储器页可从“可执行”切换回到“不可执行”。
尝试从虚拟存储器中标记为“不可执行”的存储器页存取指令的ROP攻击将会失败。通过将那些存储器页(例如,存储器中的区域)中的所有可执行代码(例如,指令)初始化为“不可执行”且仅在处理电路102经由间接层调用/获取那些存储器页(例如,区域或片段)时才将其状态改变为“可执行”,将ROP攻击限于从当前标记为“可执行”的那些存储器页(虚拟存储器104中)调用指令。来自ROP攻击的调用将绕过间接层(存根)。因此,尝试使用来自其它存储器页(虚拟存储器104中)的指令(例如,小工具)的ROP攻击将会失败,因为那些存储器页被标记为“不可执行”。因此,在检索到此些“不可执行”页后,处理电路102的执行阻止特征/模块将阻止或拒绝此些存储器页中的指令的执行。将所有存储器页标记为“不可执行”大大减少了ROP攻击可从中使用指令的存储器页的数目。为了进一步减少可用于ROP攻击的“可执行”指令,一旦函数终止,便在虚拟存储器104中将对应存储器页设定回到“不可执行”。
应注意,通过使用NX位的执行阻止通常是在应用程序堆栈和含有数据的其它存储器区/区域上完成。然而,根据当前特征,含有应用程序的合法可执行指令(例如,代码、函数等等)的存储器区或页被标记为不可执行。
图2说明可在存储器中实施的示范性一般调用堆栈200。调用堆栈200可用以存储在调用函数时可使用的各种信息。被推送于堆栈上的每一函数占据一帧202,如分别由用于被调用函数A、B和C的帧202A、202B和202C所指示。
作为非限制性实例,调用堆栈200的每一帧202可包含例如从调用者函数传递到被调用函数的参数等信息。调用堆栈200还可包含用于存储可由被调用程序使用的各种局部变量的存储器区域。指示在被调用函数已完成执行之后调用函数执行应在何处继续的返回地址也可包含在调用堆栈200中。调用堆栈200可作为后入先出(LIFO)缓冲器操作,意味着被推送于堆栈上的最后数据是从堆栈首先弹出的数据。调用堆栈200可为相当深的,指示许多函数调用嵌套在其它函数内。
帧指针204大体上指向当前执行函数的帧202。堆栈指针206指向堆栈200上的可用以被弹出且返回到处理器的下一数据位置。
ROP开发通过将恶意地址写入到各种帧202A、202B和202C的返回地址部分来利用堆栈数据结构。攻击者可检查将驻留在存储器中的代码,例如标准C库,或操作系统的部分。攻击者可随后识别这些小工具(即,小代码片断)中的许多以产生ROP指令库。这些ROP指令可随后经串接在一起以产生有用的、非既定的且恶意的代码序列而无需将任何代码插入存储器。实际上,攻击者仅必须将调用堆栈200上的返回地址改变为指向所要小工具的开始。与调用堆栈相关的操作可能因此由ROP开发破坏。然而,由于由此些ROP开发使用的小工具是通过绕过由处理电路使用的间接层来检索,因此这些小工具可能在标记为“不可执行”的存储器页中发现。因此,处理电路将拒绝或中止其执行。
具有数据执行阻止的示范性处理电路
图3说明示范性处理电路302,其可适于通过初始将可执行代码驻留的全部或大多数存储器空间标记为不可执行来实行执行阻止。处理电路302可包含一或多个处理器310,且任选地包含高速缓存存储器系统312。处理电路302可耦合到外部装置,例如存储器装置304、各种通信接口306和/或一或多个输入/输出(I/O)接口308。作为非限制性实例,通信接口306可包含用于总线上的通信的接口、蜂窝式网络、串行端口、并行端口、以太网连接、通用串行总线(USB)连接、IEEE1394(“火线”)连接、蓝牙无线连接、802.1a/b/g/n型无线连接,以及其它合适的通信协议和接口。作为非限制性实例,I/O接口308可包含到例如键盘、鼠标、跟踪球、触觉装置、音频输入和输出以及显示器等装置的接口。
一些高速缓存存储器系统312包含多级高速缓存存储器,包括高速缓存存储器的两个或两个以上级314。在此实例中,高速缓冲存储器的第一级可包含单独指令高速缓冲存储器316和数据高速缓冲存储器318。使指令与数据分离可通过产生用于获取信息的并行路径且利用对于指令和数据可不同的时间和空间接近度而产生性能增强。高速缓冲存储器的第二级可经配置为统一高速缓冲存储器320,包含用于指令高速缓冲存储器316的指令和用于数据高速缓冲存储器318的数据。另外,高速缓存存储器系统312可包含用于高速缓冲存储器的不同配置,例如集合关联高速缓冲存储器和用于满的高速缓冲存储器的各种替换协议,如高速缓冲存储器设计领域的技术人员所知。
高速缓冲存储器允许较快地检索与必须到达从主存储器304获取数据和/或指令相关的此指令和数据。与传统存储器相比的折中是在大小上。大体上,较小的存储器具有较高的带宽、较低的等待时间或两者的组合。存储器装置304通常实施为动态随机存取存储器(DRAM),其可具有相对好的带宽,但可能具有相对长的等待时间。通过在高速缓存存储器系统312中高速缓存频繁使用的数据和指令,可快得多地且以较高带宽接收处理器312的获取。作为一般规则,1级高速缓冲存储器(即,最靠近处理器316和318的高速缓冲存储器)较小、较快,且具有较低等待时间。2级高速缓冲存储器320通常较大,可较慢,且可具有较长等待时间。然而,它们仍比存储器装置304快,使得通过包含第二级高速缓冲存储器,性能改善是可能的。
根据高速缓存存储器系统的各种实例,可使用一或多个级且每一级可实施为统一高速缓冲存储器或单独的指令高速缓冲存储器和数据高速缓冲存储器。本文论述的实施例与指令最相关。因此,讨论可具体涉及指令高速缓冲存储器316和/或统一高速缓冲存储器320。然而,所属领域的技术人员将了解,实施例可在任一级的高速缓冲存储器上以及在指令高速缓冲存储器316和统一高速缓冲存储器320两者中实践。
根据一个特征,由一或多个处理器310使用的虚拟存储器可驻留在高速缓存存储器系统312内(例如高速缓存存储器系统内的任一级)和/或存储器装置304内。处理电路302还可包含或实施执行阻止模块322。在此实例中,执行阻止模块322可耦合于处理器310与存储器装置304和高速缓存存储器系统312之间。在此实例中,虚拟存储器可在存储器装置304和/或高速缓存存储器系统312上实施。图4说明示范性处理电路402的替代配置,其中执行阻止模块322位于高速缓存存储器系统312与存储器装置304之间。在此实例中,虚拟存储器可在存储器装置304中实施。
根据一个特征,所有或大多数存储器页在其获取或映射到虚拟存储器中时初始标记为不可执行。处理电路302随后拒绝执行驻留在主存储器304中标记为“不可执行”的这些区域中的任何代码。而是,每次从主存储器304加载/获取页到高速缓存存储器312中时,执行阻止模块322在将NX位加载到高速缓存存储器312中之前将其从不可执行改变(或致使改变)为可执行。一旦加载到高速缓存存储器312中,便可执行所述页中的函数。
尝试从虚拟存储器中的经标记为“不可执行”的页存取指令的ROP攻击将失败。通过将所有指令页初始化为“不可执行”且仅在经由执行阻止模块322获取时将存储器页状态改变为“可执行”,ROP攻击限于从当前标记为“可执行”的那些存储器页调用指令。应注意,虽然在本文描述的许多实例中使用“存储器页”,但可将具有相等或不同大小的任何存储器单元、片段、区标记为“不可执行”和/或“可执行”。因为来自ROP攻击的调用绕过数据执行阻止模块322,所以其寻求执行的指令(例如,小工具)将失败,因为那些存储器页经标记为“不可执行”。将虚拟存储器中的所有存储器页默认地标记为“不可执行”大大减少了ROP攻击可从其中使用指令的存储器页的数目。为了进一步减少可用于ROP攻击的“可执行”指令,一旦函数终止,便从高速缓存存储器冲刷掉其对应存储器页和/或在虚拟存储器中将其设定回到不可执行。
图5是说明适于实行增强执行阻止特征的处理电路的实例的框图。处理电路502可实施包括传入存根508和/或传出存根510的间接层以及不可执行位模块536。在一个实例中,传入存根508和/或传出存根510可为加载到存储器中的应用程序的部分。然而,此传入存根508和/或传出存根510可加载到标记为“可执行”(由“X旗标”表示)的不同存储器区中,而应用程序的对应可执行代码可加载到默认标记为“不可执行”(由“NX旗标”表示)的存储器区中。在此实例中,将间接存根540加载到已默认地将NX旗标设定为可执行的第一存储器页542中。将对应可执行代码加载到存储器页k512和q548中。此处可了解,每一可执行函数具有对应的传入/传出存根。举例来说,存储器页k512中的函数F具有对应传入/传出存根F544。类似地,页k512中的函数I具有对应传入/传出存根I552,且页q548中的函数J具有对应传入/传出存根J554。在此实例中,传入存根508和传出存根510是传入/传出存根F544的逻辑表示。
根据一个实例,存根508/510可用作间接层且可为正由处理电路502执行的应用程序的部分。存根508/510可用以截断来自/去往应用程序514的函数调用,和/或可特定与应用程序的一或多个对应函数(可执行代码)相关联。
为了说明,传入存根508和传出存根510在处理电路502内展示且用以表示从虚拟存储器504(例如,从存储器页1542)加载的传入/传出存根。应注意,取决于在任何一个时间在作用中/打开的函数调用的数目,处理电路502可加载多个传入/传出存根(例如,从存储器页1542)。传入存根508可用以将用于存储器页的不可执行(NX)旗标(通常为一位)改变为可执行(X)旗标,随后将控制传送到存储器页内的被调用函数,且一旦被调用函数已完成则颠倒过程(例如,将存储器页从可执行(X)设定为不可执行(NX))。
在图5中说明的实例中,在处理电路执行应用程序514后,可进行对函数F520的调用(其中函数F550驻留于虚拟存储器504内的存储器页k512中)。并非直接从虚拟存储器504获取被调用函数(函数F),而是将函数调用520发送到传入存根508。举例来说,在调用对函数F的调用后,即刻获取且执行传入存根F544(例如,说明为传入存根508)。传入存根508(例如,传入存根F544)致使在处理电路502获取和/或加载524函数F550之前从函数F550驻留的存储器页k512清除/移除522(即,设定为可执行(X)旗标位设定)不可执行(NX)旗标/位。不可执行(NX)旗标检查模块536可在处理电路502加载和/或执行函数F550之前确认存储器页是否标记为可执行(X)或不可执行(NX)。仅在虚拟存储器504中标记为“可执行”(X)的存储器页(或存储器区域/片段)中发现的指令被允许由处理电路502执行。
一旦其中的存储器页和/或指令已经检验为在虚拟存储器504中标记为“可执行”且获取到处理电路502中,则这些指令可正常地由处理电路502执行。此处,函数F550是从经加载存储器页k512执行526。在完成函数F550的执行后,将从函数F的返回528发送到传出存根510(即,传出存根F544)。传出存根510可将执行控制返回到调用应用程序514。另外,传出存根510也可设定虚拟存储器504中的页k512的不可执行(NX)页旗标530(即,从可执行状态切换到不可执行状态),以及从处理电路502可使用的任何任选高速缓存存储器冲刷534页k。一旦函数调用结束便从高速缓存存储器506冲刷页最小化可用于ROP攻击的可执行指令的数目。
在替代实施方案中,传入存根可将函数/指令移动到已经标记为可执行的存储器页中,且随后将控制传送到被调用函数(例如,调用既定函数F)。在被调用函数(例如,函数F)已完成执行之后,将返回转向到传出存根530,其颠倒先前操作(即,从已经标记为可执行的存储器页移除函数/指令和/或从高速缓冲存储器冲刷存储器页k512的任何副本)。
通过在相同或附近存储器页上放置“调用者”和“被调用者”函数,每次设定和清除存储器页的集合或块上的不可执行旗标,和/或比每个函数进入和退出较不频繁地在可执行与不可执行状态之间切换,可改善此系统的性能。举例来说,如果函数F调用函数M,函数M调用函数P,那么将有利的是这些函数位于相同存储器页或可从虚拟存储器504一起加载或获取的页块中。因此,当调用函数F时改变不可执行(NX)页旗标也可用以使后续被调用函数M和P可执行,而无需额外的页加载和NX状态改变。
ROP开发大体上具有不良的空间接近度和不良的时间接近度,原因是可位于存储器的不一定经常被存取的许多不同区域中的指令的短片断(例如,小工具)的特征。
图6说明用于产生恶意代码序列的受破坏调用堆栈600的实例,包含串接在一起以形成返回定向编程(ROP)开发的小工具。受破坏的调用堆栈600呈受破坏形式,原因是攻击者修改了受破坏调用堆栈600上的返回地址中的一者或一者以上。图6中还说明存储器602的含有指令的一部分。
受破坏调用堆栈600可包含用于函数U、V、W、X、Y和Z的帧(函数调用)。从受破坏调用堆栈600到存储器602的实心箭头指示从堆栈弹出的返回地址,致使处理电路在特定小工具的开始处开始执行。从存储器602到受破坏调用堆栈600的虚线箭头指示在特定小工具的末尾处执行以从堆栈获取返回地址的返回指令。
在受破坏调用堆栈600中,用于函数Z608的返回地址已经修改为指向小工具A612的开始地址610(即,GA返回地址)。类似地,用于函数Y614的返回地址已经修改为指向小工具B618的开始地址616(即,GB返回地址),用于函数W620的返回地址已经修改为指向小工具E624的开始地址622(即,GE返回地址),用于函数V626的返回地址已经修改为指向小工具D630的开始地址628(即,GD返回地址),且用于函数U632的返回地址已经修改为指向小工具C636的开始地址634(即,GC返回地址)。在此实例中,用于函数X640的返回地址638未经修改。
由于这些修改,当函数Z608完成其操作且执行返回指令而不是返回到正确地点时,控制在小工具A612的开始处继续,对于所述开始处,地址已经放置于函数Z608的返回地址610中。每个小工具以返回指令结束。因此,当小工具A612完成时,其返回指令指向函数Y614的返回地址616。然而,函数Y614的返回地址616已经修改以指向小工具B618的开始。因此,并非返回到正确的地点,控制在小工具B618的开始处继续。继续小工具执行,在小工具B618完成之后,并非返回到函数U632的正确的地点,控制在小工具C636的开始处继续。在小工具C636完成之后,并非返回到函数V626的正确的地点,控制在小工具D630的开始处继续。在小工具D630完成之后,并非返回到函数W620的正确的地点,控制在小工具E624的开始处继续。这种将小工具A到E串接在一起可执行形成ROP开发的至少一部分的重要功能。
然而,因为本文论述的处理电路利用数据执行阻止且存储器中的所有存储器页默认地标记为“不可执行”,所以仅已经由间接层(例如,传入存根508和传出存根510)调用的函数/指令保证驻留于标记为“可执行”的存储器页上。因此,位于经标记为“不可执行”的存储器区域中的任何小工具将不能由处理电路执行,因为此些小工具调用绕过间接层。
图7是说明在图5的处理单元的上下文中对小工具获取发生了什么的框图。在此实例中,已将各种函数加载到虚拟存储器504中。堆栈可能已受攻击,使得从页q548加载小工具702的调用发生。然而,此小工具调用702不通过传入存根508发生。也就是说,不同于在虚拟存储器504中具有对应传入/传出存根的函数调用,小工具调用在存储器中的任意点(例如,经选择以实现某些指令的执行)处开始而无需传入/传出存根。因此,由于不调用传入存根,因此页q548的状态仍标记为“不可执行”。当从页q548获取704小工具时,不可执行(NX)旗标检查模块536拒绝或阻挡页q548的加载,因为其标记为“不可执行”。这也可致使小工具调用和/或进程706的终止。
用于禁止处理电路内的执行的示范性方法
图8是说明用于禁止处理单元中的代码执行的一般示范性方法的流程图。此方法可例如由从存储器(例如,虚拟存储器、内部/外部存储器等等)获取指令的处理电路实施。将存储器中的可执行代码的区域加标记(例如,标记)为不可执行802。处理电路可监视是否有从存储器执行一或多个指令的请求804。如果检测到执行一或多个指令的请求806,那么将一或多个指令驻留的存储器区域标记为可执行808。处理电路可随后从存储器区域执行一或多个指令810。在完成后,将一或多个指令驻留的存储器区域标记回到不可执行812。
图9是说明在处理电路中操作的用于保护存储器免于ROP开发的另一示范性方法的流程图。在处理电路执行应用程序或进程后可即刻实施此方法。应用程序或进程可包含致使将其可执行代码加载到存储器中和/或以如下方式受保护的指令。可将可执行代码的多个存储器页加载到存储器装置中902。可执行代码可对应于单个应用程序和/或进程。可执行代码加载于其中的存储器装置可实施虚拟存储器。可将用于所述多个存储器页的第一子集的状态指示符设定为不可执行状态904。同样,将用于所述多个存储器页的第二子集的状态指示符设定为可执行状态,其中所述多个存储器页的第二子集包含到所述多个存储器页的第一子集中的函数的间接存根906。应注意,将可执行代码的所述多个存储器页加载到存储器装置中可在用于所述多个存储器页的第一子集和/或第二子集中的至少一者的状态指示符已设定为不可执行状态之前和/或之后发生。
间接存根可在可执行代码的编译阶段或预编译阶段产生。随后,可将函数调用引导到所述多个存储器页的第二子集中的对应间接存根,所述间接存根在引导来自所述多个存储器页的第一子集的被调用函数的执行之前修改所述多个存储器页的第一子集中的对应函数的状态指示符908。处理电路还可实行驻留于所述多个存储器页的第一子集中的可执行代码的执行阻止910。举例来说,实行执行阻止可包含当处理电路获取可执行代码用于执行时中止驻留于处于不可执行状态的存储器页中的任何可执行代码的执行。处理电路还可在完成函数调用后即刻返回到所述多个存储器页的第二子集中的对应间接存根,其中对应间接存根随后修改所述多个存储器页的第一子集中的对应函数的状态指示符912。
在一个实例中,间接存根可将所述多个存储器页的第一子集中的对应函数的状态指示符从不可执行状态修改为可执行状态以启用函数的执行。间接存根也可将所述多个存储器页的第一子集中的对应函数的状态指示符从可执行状态修改为不可执行状态以停用函数的执行。
根据一个方面,在函数调用的完成后可对处理电路的内部高速缓存存储器冲刷(清除)函数调用。在另一实例中,在用于函数调用的代码驻留于所述多个存储器页的第一子集内的第一存储器页中的情况下,所述方法可进一步包括:(a)跟踪处于可执行状态的第一存储器页的使用;(b)确认何时所有进行中函数调用已完成第一存储器页内的对应代码的执行;和/或(c)在完成最后进行中函数调用后即刻将第一存储器页的状态指示符设定为不可执行状态。
图10是说明用于保护存储器免于ROP开发的示范性方法的流程图。此方法可在从存储器(例如,虚拟存储器)存取可执行代码或指令的处理电路中操作。
根据任选特征,可在执行之前在同一存储器页中布置嵌套或相关函数的可执行代码1000。举例来说,此布置可在可执行代码的编译期间或当将可执行代码加载到存储器中时发生。以此方式预布置代码可准许相关代码在存储器中靠近在一起,进而避免过多的存储器页获取,且通过扩展,最小化页状态的改变(例如,可执行与不可执行之间)。
处理电路可将可执行代码的多个存储器页加载到存储器中1002,且将每一存储器页的状态指示符设定为不可执行状态1004。在一个实例中,此存储器可称为虚拟存储器,其可为主存储器和/或高速缓存存储器装置的物理存储器地址的映射。在执行应用程序后,处理电路和/或操作系统可在从存储器获取对应可执行代码之前即刻检测、监视和/或截断来自应用程序的函数调用1006。将第一可执行代码在存储器中驻留的第一存储器页的状态指示符设定和/或改变为可执行状态1008。随后可从存储器获取第一存储器页1010。在执行来自第一存储器页的指令之前,做出关于第一存储器页状态指示符是否设定为可执行状态的确定1012。如果存储器页状态不是可执行状态,那么中止(处理电路)对第一存储器页的加载/执行1014。否则,如果第一存储器页状态事实上是可执行状态,那么(由处理电路)执行第一可执行代码1016。在完成第一可执行代码的执行后,处理电路可从任何内部高速缓存存储器(如果存在)冲刷第一存储器页1018。
另外,处理电路还可将存储器中的状态指示符设定回到不可执行1020。以此方式,从应用程序外部发生的调用不被截断,且其对应指令将可能在具有“不可执行”状态的存储器页中被发现。
在一些实施方案中,可存在对一或多个存储器页中的函数的多个嵌套调用。根据一个方面,执行应用程序的处理电路可维持一或多个计数器,其中每一计数器用以跟踪特定存储器页中的函数和/或指令的执行是否已终止。举例来说,借助嵌套函数调用,在第一存储器页中的函数可调用第二页中的函数的情况下,多个存储器页可同时保持打开。所述一或多个计数器可用以跟踪例如进入特定存储器页的次数以及退出次数,进而确认存储器页的使用何时已完成且可被冲刷或改变回到“不可执行”。在一些实施方案中,编译器可将相关可执行代码布置在一起,使得其驻留于相同存储器页中。这准许从存储器页执行指令而不必频繁地清除和设定所述存储器页的“不可执行”状态。
根据另一方面,引导代码和/或某些启动操作系统可执行代码可从本文描述的执行阻止特征排除。也就是说,含有此代码的存储器页可默认地标记为“可执行”(而不是“不可执行”)。这将准许较快地引导,直到在处理电路或其上执行的操作系统处已实现最小操作功能性为止。
示范性间接层
图11是说明准许在需要或调用存储器区域时修改存储器区域的状态的间接层的示范性实施方案的框图。在此实例中,处理电路1102可耦合到存储器模块1110(例如,虚拟存储器、存储器装置等等),其包含可执行指令/代码1108和/或对应间接代码1104/1106(即,间接层)。在一个实例中,间接代码1104/1106可为已特定添加或插入(例如,在预编译处、在编译处和/或在编译后)到可执行代码中的单独指令。在另一实例中,间接代码1104/1106可为由处理器配置/解译以实现保证对驻留于存储器中的某些指令的存取的安全的所要功能的现存指令。
在一个实例中,间接代码1104/1106可用以设定/清除可执行指令的存储器状态1108。举例来说,当从由处理电路执行的应用程序内调用函数A时,实际上调用对应间接代码A1104。间接代码A1104将可执行代码A(函数A)的对应存储器区1112的状态从“不可执行”设定为“可执行”,因此指令可由处理电路1102执行。在指令完成后,间接代码1104即刻将可执行代码A(函数A)的对应存储器区1112的状态从“可执行”设定为“不可执行”,因此指令不可用于执行(例如,通过ROP附接)。针对其它函数可重复相同过程。举例来说,第二函数B可具有对应间接代码B1106,其用以存取可执行代码B(函数B)1114。
与可执行指令1108驻留的存储器空间(默认地标记为“不可执行”)相反,间接代码1104和/或1106可驻留于标记为“可执行”的存储器空间中,使得处理电路1102可执行此代码。间接代码1104和/或1106可在特定应用程序的编译时间产生,其中此间接代码与可执行指令分开来组织。或者,间接代码1104和/或1106可在将可执行指令1108加载到存储器中后即刻动态地产生。
在一个实例中,每一可执行代码1112/1114(或函数)可具有对应间接代码1104/1106。因此,每一间接代码(存根)1104/1106可知道其对应可执行代码1112/1114在存储器中驻留于何处且可能够指向此存储器地址。此存储器地址以及与每一函数相关联的可执行代码的大小可在(应用程序的)编译时间为可知的。因此,间接代码1104/1106能够确定对应可执行代码1112/1114驻留于哪些存储器页中以及驻留于多少存储器页中。取决于用于任一个函数的可执行代码的大小和存储器页的大小,一或多个存储器页可针对给定函数调用在任一个时间从“不可执行”切换到“可执行”(或保持在“可执行”状态)。另外,在一些实施方案中,仅对应于最当前、突出和/或待决的函数调用的可执行代码驻留的存储器区/页保持在“可执行”状态。在再其它实施方案中,为了改善性能,在最后n个函数调用中使用的存储器页保持在“可执行”存储器状态中。
图12是说明用于实施准许在需要或调用存储器区域时修改存储器区域的状态的间接层的方法。此方法可在操作系统层级或在应用程序层级实施。可在应用程序的执行期间拦截函数调用(例如,对存储器中的可执行代码的调用)1202。在加载/执行被调用函数之前,间接层可将与用于被调用函数的可执行代码相关联的存储器状态从不可执行改变为可执行1204。处理电路随后可获取和/或执行用于被调用函数的可执行代码1206。根据一个特征,处理电路可跟踪嵌套条目和/或从可执行代码退出以确认何时函数调用完成1208。在被调用函数的完成后,间接层可即刻将与用于被调用函数的可执行代码相关联的存储器状态从可执行改变为不可执行1210。
图13说明用于在应用程序内实施允许修改应用程序可执行代码驻留的存储器区域的状态以保护对此些存储器区域的存取的间接层的方法。可产生包含多个函数的应用程序源代码1302。也可针对源代码中的每一函数产生间接代码1304。可添加指令以致使源代码在加载到存储器中时经识别为不可执行1306。也可添加指令以致使间接代码在加载到存储器中时经识别为可执行1308。可在处理电路处变换(例如,编译)源代码和间接代码以产生可执行代码1310。可执行代码可对应于单个应用程序和/或进程。间接存根可在可执行代码的编译阶段或预编译阶段产生。可编译源代码和间接代码以使得其在加载到存储器中用于执行时驻留于单独的存储器页中。举例来说,与第一函数相关联的第一间接代码适于指向第一函数,其中当产生可执行代码时,编译第一间接代码和第一函数以加载于不同存储器页中。
在一个实例中,第一间接代码可致使在调用对应第一函数以执行时将第一函数的存储器状态指示符从不可执行状态切换到可执行状态。
在另一实例中,第一间接代码致使在对应第一函数终止执行时将第一函数的存储器状态指示符从可执行状态切换到不可执行状态。
在示范性实施方案中,图8、9、10、12和/或13中揭示的一或多个特征可在一或多个处理器中并行(例如,同时)和/或串行(例如,循序地)实施。在多个处理器执行一或多个步骤的情况下,多个处理器中的每一者可实施不同步骤、相同步骤和/或步骤的子集。
在本文说明的示范性实施方案的一些实施方案中,间接层的函数可实施为在应用程序的编译之前、期间和/或之后添加到应用程序的相异指令/代码。然而,其它实施方案可再使用指令集中的现存指令和/或避免在可执行与不可执行状态之间切换。
在另一示范性实施方案中,“间接层”可实施为指令集中的一组两个(或两个以上)互补指令。举例来说,处理器可经配置以使得当执行第一指令时,除了接下来的第二指令之外处理器拒绝获取任何指令。此配置可在内部完成(例如,硬连线到处理器中)或通过例如加载到处理器中的指令完成(例如,加载器配置)。如果第二指令是在第一指令的执行之后将到来的,那么处理器继续执行。否则,处理器可中止或复位执行。在此方法中,设定含有可执行代码的存储器片段的“不可执行”状态可为任选的和/或不必要的。举例来说,并非具有图5中的单独传入/传出存根540,应用程序内的函数调用指令(即,第一指令)限于仅跟随有被调用函数的初始指令(即,第二指令)。如果处理器注意到除了初始指令之外的任何其它指令跟随函数调用指令,那么其中止执行。此函数调用指令(第一指令)和初始指令(第二指令)可为添加到指令集的新/特殊指令。或者,已经是指令集的部分的普通指令可用于此目的,但其中可使用位或标记来表示第一指令必须跟随有第二指令。以此方式,处理器可检查此指令序列且在除了第二指令之外的任何指令跟随第一指令(例如,在返回定向攻击的情况中那样)的情况下中止执行。
在此互补指令对的一个实例中,第一指令可充当“调用”(例如,以调用特定函数),而第二指令可充当可置于函数入口处的“岸”。在一个实例中,此指令对可在指令集内具体界定为互补指令,其中第二指令必须跟随第一指令,否则处理器便中止执行。在一个实例中,可存在两组此类指令,用于起始函数调用的第一对指令(例如,传入存根)和用于退出/终止函数调用(例如,传出存根)的第二对指令。
在替代实例中,替代于使用两个专用指令(例如,互补的第一和第二指令),可以用以指示普通指令是否为存根指令的专用位来编码或标记所述普通指令。举例来说,普通第一指令(例如,“调用”指令)在其用以加载函数的情况下可具有位/标记设定。类似地,普通第二指令(例如,“岸”指令)在其用作函数加载的部分的情况下可具有类似的位/标记设定。因此,处理器可在执行第一和/或第二指令时检查此位/标记以确保其循序执行,否则中止执行。应注意,第一指令(例如,“调用”指令)可为各种类型的指令,包含跳转(JMP)指令、加载指令等等。类似地,在相反操作中(例如,当完成函数时),第一指令可为各种类型的指令,包含返回指令、结束指令等等。
应注意,在一个实例中,“调用”函数的执行可致使处理器将被调用函数驻留的存储器片段/页的状态从不可执行状态自动切换到可执行状态。在完成被调用函数的执行后,颠倒操作且将存储器片段/页设定回到不可执行状态。在替代实施例中,完全不将存储器片段/页标记为不可执行。而是,函数调用指令(第一指令)必须跟随有被调用函数的初始指令(第二指令)的限制可阻碍返回定向编程攻击。这禁止返回定向编程攻击选择性跳转到存储器中的特定指令中,因为调用指令限于跟随有登陆指令。
所展示和描述的特定实施方案仅是实例且不应阐释为实施本发明的仅有方式,除非本文另外指定。所属领域的技术人员容易了解,本发明中的各种实例可通过许多其它分割解决方案来实践。
本文描述且在图中图解说明的组件、动作、特征和/或功能中的一者或一者以上可经重新布置和/或组合为单个组件、动作、特征或功能或者在若干组件、动作、特征或功能中体现。在不脱离本发明的情况下也可添加额外元件、部件、动作和/或功能。本文描述的算法可以软件有效地实施和/或嵌入硬件中。
在描述中,可以框图形式展示元件、电路和功能,以免用不必要的细节混淆本发明。相反,所展示和描述的特定实施方案仅是示范性的且不应阐释为实施本发明的仅有方式,除非本文另外指定。另外,块界定以及各种块之间的逻辑的分割是特定实施方案的示范。所属领域的技术人员容易了解,本发明可通过许多其它分割解决方案来实践。对于大部分,已经省略关于时序考虑和类似的细节,其中此些细节对于获得本发明的完整理解不是必要的,且在所属领域的技术人员的能力以内。
还注意到,可将实施例描述为过程,所述过程描绘为流程图、流图、结构图或框图。虽然流程图可将操作描述为顺序过程,但操作中的许多可并行地或同时地执行。另外,可重新布置操作的次序。当过程的操作完成时,过程终止。过程可对应于方法、函数、程序、子例程、子程序等等。当过程对应于函数时,其终止对应于所述函数到调用函数或主函数的返回。
所属领域的技术人员将了解,可使用多种不同技艺和技术中的任一种来表示信息和信号。举例来说,可通过电压、电流、电磁波、磁场或磁性粒子、光场或光学粒子或者其任何组合来表示整个本描述中可能参考的数据、指令、命令、信息、信号、位、符号和码片。一些图式可能为了呈现和描述的清楚而将信号图解说明为单个信号。所属领域的技术人员将了解,信号可表示信号总线,其中总线可具有多种位宽度,且本发明可在任一数目的数据信号上实施,包含单个数据信号。
应理解,本文使用例如“第一”、“第二”等标示对元件的任何参考均不限制这些元件的数量或次序,除非明确陈述此限制。实际上,这些标示在本文可用作在两个或两个以上元件或一元件的若干实例之间进行区分的方便方法。因此,对第一和第二元件的参考不意味着该处仅可采用两个元件或第一元件必须以某种方式在第二元件之前。另外,除非另外陈述,否则一组元件可包括一个或一个以上元件。
而且,存储媒体可表示用于存储数据的一个或一个以上装置,包含用于存储信息的只读存储器(ROM)、随机存取存储器(RAM)、磁盘存储媒体、光学存储媒体、快闪存储器装置和/或其它机器可读媒体,以及处理器可读媒体和/或计算机可读媒体。术语“机器可读媒体”、“计算机可读媒体”和/或“处理器可读媒体”可包含(但不限于)能够存储、含有或载运指令和/或数据的非暂时性媒体,例如便携式或固定存储装置、光学存储装置和各种其它媒体。因此,本文描述的各种方法可完全地或部分地由可存储在“机器可读媒体”、“计算机可读媒体”和/或“处理器可读媒体”中且由一个或一个以上处理器、机器和/或装置执行的指令和/或数据实施。
此外,实施例可通过硬件、软件、固件、中间件、微码或其任一组合来实施。当以软件、固件、中间件或微码实施时,用以执行必要任务的程序代码或代码段可存储在例如存储媒体等机器可读媒体或其它存储装置中。处理器可执行所述必要任务。代码段可表示过程、函数、子程序、程序、例程、子例程、模块、软件包、类或指令、数据结构或程序语句的任一组合。代码段可通过传递和/或接收信息、数据、自变量、参数或存储器内容而耦合到另一代码段或硬件电路。信息、自变量、参数、数据等等可经由任一合适手段传递、转发或发射,所述手段包含存储器共享、消息传递、令牌传递、网络发射等等。
结合本文所揭示的实例描述的各种说明性逻辑块、模块、电路、元件和/或组件可用经设计以执行本文描述的功能的通用处理器、数字信号处理器(DSP)、专用集成电路(ASIC)、现场可编程门阵列(FPGA)或其它可编程逻辑组件、离散门或晶体管逻辑、离散硬件组件或其任何组合来实施或执行。通用处理器可以是微处理器,但在替代方案中,所述处理器可以是任何常规处理器、控制器、微控制器或状态机。处理器还可实施为计算组件的组合,例如DSP与微处理器的组合、若干微处理器、结合DSP核心的一个或一个以上微处理器或任何其它此类配置。经配置以用于执行本文描述的实施例的通用处理器视为用于实行此些实施例的专用处理器。类似地,通用计算机在经配置以用于实行本文描述的实施例时视为专用计算机。
结合本文所揭示的实例描述的方法或算法可直接以硬件、以由处理器执行的软件模块或以所述两者的组合以处理单元、编程指令或其它指示的形式来实施,且可包含在单个装置中或分布于多个装置上。软件模块可驻留在RAM存储器、快闪存储器、ROM存储器、EPROM存储器、EEPROM存储器、寄存器、硬盘、可装卸式盘、CD-ROM或此项技术中已知的任何其它形式的存储媒体中。存储媒体可耦合到处理器,使得处理器可从存储媒体读取信息和向存储媒体写入信息。在替代方案中,存储媒体可与处理器成一体式。
所属领域的技术人员将进一步了解,结合本文所揭示的实施例描述的各种说明性逻辑块、模块、电路和算法步骤可实施为电子硬件、计算机软件或所述两者的组合。为了清楚地说明硬件与软件的这种可交换性,上文已大体上在其功能性方面描述了各种说明性组件、块、模块、电路和步骤。将此类功能性实施为硬件、软件还是其组合取决于特定应用和对整个系统施加的设计选择。
本文描述的本发明的各种特征可在不同系统中实施而不脱离本发明。应注意,前述实施例仅是实例且不应解释为限制本发明。实施例的描述既定为说明性的,且将不限制权利要求书的范围。由此,本发明教示可容易应用于其它类型的设备,且所属领域的技术人员将了解许多替代例、修改和变化。

Claims (14)

1.一种在处理电路中操作的方法,其包括:
产生包含多个函数的应用程序源代码;
产生用于所述源代码中的每一函数的间接代码;
添加指令以致使所述源代码在加载到存储器中时经识别为不可执行;
添加指令以致使所述间接代码在加载到存储器中时经识别为可执行;以及
在所述处理电路处变换所述源代码和间接代码以产生可执行代码。
2.根据权利要求1所述的方法,其中所述可执行代码对应于单个应用程序和/或进程。
3.根据权利要求1所述的方法,其中所述间接代码在所述可执行代码的编译阶段或预编译阶段产生。
4.根据权利要求1所述的方法,其中编译所述源代码和间接代码以使得所述源代码和间接代码在加载到存储器中时驻留于单独的存储器页中。
5.根据权利要求1所述的方法,其中第一间接代码致使在调用对应第一函数以执行时将所述第一函数的存储器状态指示符从不可执行状态切换到可执行状态。
6.根据权利要求1所述的方法,其中第一间接代码致使在对应第一函数终止执行时将所述第一函数的存储器状态指示符从可执行状态切换到不可执行状态。
7.根据权利要求1所述的方法,其中与第一函数相关联的第一间接代码指向所述第一函数,其中当产生所述可执行代码时,编译所述第一间接代码和第一函数以加载于不同存储器页中。
8.根据权利要求1所述的方法,其中所述间接代码包含限于由处理电路循序执行的至少第一指令和第二指令。
9.根据权利要求8所述的方法,其进一步包括:
添加指令以致使在所述第一指令后跟随有除了所述第二指令之外的任一指令的情况下中止所述间接代码的执行。
10.一种其上存储有指令的非暂时性处理器可读媒体,所述指令在由至少一个处理器执行时致使所述至少一个处理器:
产生包含多个函数的应用程序源代码;
产生用于所述源代码中的每一函数的间接代码;
添加指令以致使所述源代码在加载到存储器中时经识别为不可执行;
添加指令以致使所述间接代码在加载到存储器中时经识别为可执行;以及
在所述处理电路处变换所述源代码和间接代码以产生可执行代码。
11.根据权利要求10所述的非暂时性处理器可读媒体,其中所述可执行代码对应于单个应用程序和/或进程。
12.根据权利要求10所述的非暂时性处理器可读媒体,其中所述间接代码在所述可执行代码的编译阶段或预编译阶段产生。
13.根据权利要求10所述的非暂时性处理器可读媒体,其中第一间接代码致使在调用对应第一函数以供执行时将所述第一函数的存储器状态指示符从不可执行状态切换到可执行状态。
14.根据权利要求10所述的非暂时性处理器可读媒体,其中第一间接代码致使在对应第一函数终止执行时将所述第一函数的存储器状态指示符从可执行状态切换到不可执行状态。
CN201510679658.4A 2012-01-16 2013-01-15 用以禁止返回定向编程的动态执行阻止 Active CN105303104B (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US13/351,006 US8776223B2 (en) 2012-01-16 2012-01-16 Dynamic execution prevention to inhibit return-oriented programming
US13/351,006 2012-01-16
CN201380005427.4A CN104054061B (zh) 2012-01-16 2013-01-15 用以禁止返回定向编程的动态执行阻止

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
CN201380005427.4A Division CN104054061B (zh) 2012-01-16 2013-01-15 用以禁止返回定向编程的动态执行阻止

Publications (2)

Publication Number Publication Date
CN105303104A true CN105303104A (zh) 2016-02-03
CN105303104B CN105303104B (zh) 2019-03-22

Family

ID=47604256

Family Applications (2)

Application Number Title Priority Date Filing Date
CN201380005427.4A Active CN104054061B (zh) 2012-01-16 2013-01-15 用以禁止返回定向编程的动态执行阻止
CN201510679658.4A Active CN105303104B (zh) 2012-01-16 2013-01-15 用以禁止返回定向编程的动态执行阻止

Family Applications Before (1)

Application Number Title Priority Date Filing Date
CN201380005427.4A Active CN104054061B (zh) 2012-01-16 2013-01-15 用以禁止返回定向编程的动态执行阻止

Country Status (8)

Country Link
US (1) US8776223B2 (zh)
EP (1) EP2805246B1 (zh)
JP (1) JP5769891B2 (zh)
KR (1) KR101480821B1 (zh)
CN (2) CN104054061B (zh)
BR (1) BR112014017156A8 (zh)
TW (1) TWI468980B (zh)
WO (1) WO2013109546A1 (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109074453A (zh) * 2016-04-26 2018-12-21 三菱电机株式会社 入侵检测装置、入侵检测方法以及入侵检测程序
WO2019237865A1 (zh) * 2018-06-12 2019-12-19 杨力祥 一种数据保护方法及计算装置

Families Citing this family (32)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9256730B2 (en) * 2012-09-07 2016-02-09 Crowdstrike, Inc. Threat detection for return oriented programming
US9177147B2 (en) * 2012-09-28 2015-11-03 Intel Corporation Protection against return oriented programming attacks
US9223979B2 (en) * 2012-10-31 2015-12-29 Intel Corporation Detection of return oriented programming attacks
WO2014189510A1 (en) * 2013-05-23 2014-11-27 Intel Corporation Techniques for detecting return-oriented programming
US9189214B2 (en) * 2013-10-30 2015-11-17 International Business Machines Corporation Code stack management
US9703948B2 (en) * 2014-03-28 2017-07-11 Intel Corporation Return-target restrictive return from procedure instructions, processors, methods, and systems
US9390264B2 (en) 2014-04-18 2016-07-12 Qualcomm Incorporated Hardware-based stack control information protection
US9904780B2 (en) * 2014-07-31 2018-02-27 Nec Corporation Transparent detection and extraction of return-oriented-programming attacks
EP2996034B1 (en) * 2014-09-11 2018-08-15 Nxp B.V. Execution flow protection in microcontrollers
EP3195177A1 (en) * 2014-09-17 2017-07-26 Irdeto B.V. Generating and executing protected items of software
US9646154B2 (en) * 2014-12-12 2017-05-09 Microsoft Technology Licensing, Llc Return oriented programming (ROP) attack protection
US9569613B2 (en) * 2014-12-23 2017-02-14 Intel Corporation Techniques for enforcing control flow integrity using binary translation
SG10201504066QA (en) * 2015-05-25 2016-12-29 Huawei Internat Pte Ltd Method and system for defense against return oriented programming (rop) based attacks
US9576138B1 (en) 2015-09-30 2017-02-21 International Business Machines Corporation Mitigating ROP attacks
US9767292B2 (en) 2015-10-11 2017-09-19 Unexploitable Holdings Llc Systems and methods to identify security exploits by generating a type based self-assembling indirect control flow graph
US9904782B2 (en) * 2015-10-27 2018-02-27 Mcafee, Llc Synchronous execution of designated computing events using hardware-assisted virtualization
US10762199B2 (en) 2015-12-11 2020-09-01 International Business Machines Corporation Compiler assisted protection against arbitrary code execution
US10152592B2 (en) 2015-12-11 2018-12-11 International Business Machines Corporation Compiler assisted protection against arbitrary code execution
US10007787B2 (en) 2015-12-28 2018-06-26 International Business Machines Corporation Runtime return-oriented programming detection
US10423792B2 (en) 2016-09-23 2019-09-24 Red Hat, Inc. Identifying exploitable code sequences
US10437990B2 (en) 2016-09-30 2019-10-08 Mcafee, Llc Detection of return oriented programming attacks in a processor
KR101908573B1 (ko) 2016-11-01 2018-10-16 성균관대학교 산학협력단 효율적인 리턴-지향형 프로그래밍 공격을 방어할 수 있도록 컴퓨터 프로그램을 생성하는 방법
US10599835B2 (en) * 2018-02-06 2020-03-24 Vmware, Inc. 32-bit address space containment to secure processes from speculative rogue cache loads
EP3877881A1 (en) 2018-11-07 2021-09-15 C2A-SEC, Ltd. Return-oriented programming protection
US10915426B2 (en) 2019-06-06 2021-02-09 International Business Machines Corporation Intercepting and recording calls to a module in real-time
US11074069B2 (en) 2019-06-06 2021-07-27 International Business Machines Corporation Replaying interactions with transactional and database environments with re-arrangement
US10929126B2 (en) 2019-06-06 2021-02-23 International Business Machines Corporation Intercepting and replaying interactions with transactional and database environments
US11036619B2 (en) 2019-06-06 2021-06-15 International Business Machines Corporation Bypassing execution of a module in real-time
US11016762B2 (en) 2019-06-06 2021-05-25 International Business Machines Corporation Determining caller of a module in real-time
US11989285B2 (en) 2021-05-07 2024-05-21 Ventana Micro Systems Inc. Thwarting store-to-load forwarding side channel attacks by pre-forwarding matching of physical address proxies and/or permission checking
US11989286B2 (en) * 2021-05-07 2024-05-21 Ventana Micro Systems Inc. Conditioning store-to-load forwarding (STLF) on past observations of STLF propriety
US20220358040A1 (en) * 2021-05-07 2022-11-10 Ventana Micro Systems Inc. Unforwardable load instruction re-execution eligibility based on cache update by identified store instruction

Citations (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6317870B1 (en) * 1999-02-26 2001-11-13 Hewlett-Packard Company System and method for optimization of inter-module procedure calls
CN1711524A (zh) * 2002-11-18 2005-12-21 Arm有限公司 在安全模式和非安全模式间切换的处理器
CN101021886A (zh) * 2006-02-14 2007-08-22 联想(新加坡)私人有限公司 防止恶意软件在计算机系统内执行的方法
US20070226704A1 (en) * 2006-03-22 2007-09-27 Tony Nichols Method and system for rendering harmless a locked pestware executable object
US20070240220A1 (en) * 2006-04-06 2007-10-11 George Tuvell System and method for managing malware protection on mobile devices
CN101154187A (zh) * 2006-09-29 2008-04-02 英特尔公司 用于为程序打补丁的方法、产品、服务处理器和系统
CN101341491A (zh) * 2005-12-20 2009-01-07 西姆毕恩软件有限公司 计算设备中的恶意软件检测
CN101446905A (zh) * 2008-12-29 2009-06-03 北京飞天诚信科技有限公司 编译方法及编译器
US20110138476A1 (en) * 2009-12-08 2011-06-09 Microsoft Corporation Software Fault Isolation Using Byte-Granularity Memory Protection
CN102298535A (zh) * 2010-06-22 2011-12-28 微软公司 绑定数据并行设备源代码
US20110321165A1 (en) * 2010-06-24 2011-12-29 Alen Capalik System and Method for Sampling Forensic Data of Unauthorized Activities Using Executability States

Family Cites Families (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5742840A (en) * 1995-08-16 1998-04-21 Microunity Systems Engineering, Inc. General purpose, multiple precision parallel operation, programmable media processor
US6654888B1 (en) * 1999-12-31 2003-11-25 International Business Machines Corporation Installing and controlling trial software
US7475220B1 (en) 2003-08-18 2009-01-06 Cray Incorporated Buffer overflow detection
US7287283B1 (en) 2003-09-25 2007-10-23 Symantec Corporation Return-to-LIBC attack blocking system and method
WO2006052703A2 (en) 2004-11-04 2006-05-18 Board Of Trustees Of Michigan State University Secure bit
US7540026B1 (en) 2005-01-24 2009-05-26 Symantec Corporation No-execute processor feature global disabling prevention system and method
US20070083770A1 (en) * 2005-09-17 2007-04-12 Technology Group Northwest Inc. System and method for foiling code-injection attacks in a computing device
US7464226B2 (en) * 2006-02-23 2008-12-09 Lars Andreas Reinertsen Fractional caching
JP2007304954A (ja) * 2006-05-12 2007-11-22 Sharp Corp メモリ保護機能を有するコンピュータシステム
CN101093531B (zh) * 2007-04-30 2011-05-11 李宏强 一种提高计算机软件安全的方法
CN100541509C (zh) * 2007-12-10 2009-09-16 上海北大方正科技电脑系统有限公司 一种查杀电脑病毒的方法
US8074281B2 (en) * 2008-01-14 2011-12-06 Microsoft Corporation Malware detection with taint tracking
US8578483B2 (en) 2008-07-31 2013-11-05 Carnegie Mellon University Systems and methods for preventing unauthorized modification of an operating system
EP2256659A1 (en) * 2009-05-27 2010-12-01 NTT DoCoMo, Inc. Method and apparatus for preventing modification of a program execution flow
US8464233B2 (en) * 2010-06-21 2013-06-11 Microsoft Corporation Compile time interpretation of markup codes
US8332594B2 (en) * 2010-06-28 2012-12-11 International Business Machines Corporation Memory management computer
US9116717B2 (en) * 2011-05-27 2015-08-25 Cylance Inc. Run-time interception of software methods
US20120331303A1 (en) * 2011-06-23 2012-12-27 Andersson Jonathan E Method and system for preventing execution of malware

Patent Citations (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6317870B1 (en) * 1999-02-26 2001-11-13 Hewlett-Packard Company System and method for optimization of inter-module procedure calls
CN1711524A (zh) * 2002-11-18 2005-12-21 Arm有限公司 在安全模式和非安全模式间切换的处理器
CN101341491A (zh) * 2005-12-20 2009-01-07 西姆毕恩软件有限公司 计算设备中的恶意软件检测
CN101021886A (zh) * 2006-02-14 2007-08-22 联想(新加坡)私人有限公司 防止恶意软件在计算机系统内执行的方法
US20070226704A1 (en) * 2006-03-22 2007-09-27 Tony Nichols Method and system for rendering harmless a locked pestware executable object
US20070240220A1 (en) * 2006-04-06 2007-10-11 George Tuvell System and method for managing malware protection on mobile devices
CN101154187A (zh) * 2006-09-29 2008-04-02 英特尔公司 用于为程序打补丁的方法、产品、服务处理器和系统
CN101446905A (zh) * 2008-12-29 2009-06-03 北京飞天诚信科技有限公司 编译方法及编译器
US20110138476A1 (en) * 2009-12-08 2011-06-09 Microsoft Corporation Software Fault Isolation Using Byte-Granularity Memory Protection
CN102298535A (zh) * 2010-06-22 2011-12-28 微软公司 绑定数据并行设备源代码
US20110321165A1 (en) * 2010-06-24 2011-12-29 Alen Capalik System and Method for Sampling Forensic Data of Unauthorized Activities Using Executability States

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109074453A (zh) * 2016-04-26 2018-12-21 三菱电机株式会社 入侵检测装置、入侵检测方法以及入侵检测程序
WO2019237865A1 (zh) * 2018-06-12 2019-12-19 杨力祥 一种数据保护方法及计算装置
CN110598406A (zh) * 2018-06-12 2019-12-20 杨力祥 一种数据保护方法及计算装置
CN110598406B (zh) * 2018-06-12 2022-08-23 杨力祥 一种数据保护方法及计算装置

Also Published As

Publication number Publication date
JP2015503815A (ja) 2015-02-02
CN104054061A (zh) 2014-09-17
KR101480821B1 (ko) 2015-01-09
CN105303104B (zh) 2019-03-22
JP5769891B2 (ja) 2015-08-26
EP2805246B1 (en) 2017-03-01
EP2805246A1 (en) 2014-11-26
US20130185792A1 (en) 2013-07-18
US8776223B2 (en) 2014-07-08
CN104054061B (zh) 2015-11-25
KR20140114433A (ko) 2014-09-26
BR112014017156A8 (pt) 2017-07-04
WO2013109546A1 (en) 2013-07-25
BR112014017156A2 (pt) 2017-06-13
TWI468980B (zh) 2015-01-11
TW201342109A (zh) 2013-10-16

Similar Documents

Publication Publication Date Title
CN104054061B (zh) 用以禁止返回定向编程的动态执行阻止
Davi et al. Isomeron: Code Randomization Resilient to (Just-In-Time) Return-Oriented Programming.
US9250937B1 (en) Code randomization for just-in-time compilers
CN104423929B (zh) 一种分支预测方法及相关装置
CN110598405B (zh) 一种运行时访问控制方法及计算装置
US20180089422A1 (en) Technologies for deterministic code flow integrity protection
CN110119302B (zh) 虚拟机监视器以及虚拟可信执行环境构建方法
TW201941049A (zh) 用於轉換詮釋資料處理的指令的系統和方法
CN107548492B (zh) 具有增强指令集的中央处理单元
CN111381879A (zh) 一种数据处理方法及装置
EP2942727B1 (en) Return-oriented programming as an obfuscation technique
CN104517044A (zh) 一种防止二进制文件被反编译的方法和装置
CN105930694A (zh) 用于模糊虚拟机的灵活指令集
US10579791B2 (en) Technologies to defeat secure enclave side-channel attacks using fault-oriented programming
CN115510430A (zh) 一种函数指针及其数据依赖的识别与保护方法、装置
US20180307838A1 (en) Return-oriented programming mitigation
CN107577925A (zh) 基于双重ARM指令虚拟的Android应用程序保护方法
CN108733990B (zh) 一种基于区块链的文件保护方法及终端设备
US8806460B2 (en) Method and apparatus for avoiding register interference
US11893113B2 (en) Return-oriented programming protection
CN111898119A (zh) 控制流完整性保护方法、装置、设备及存储介质
CN112069467B (zh) 抵御反汇编的花指令混淆信息安全控制方法、系统及装置
CN110069261A (zh) 一种嵌入式软件的可配置分区方法及系统
CN110598412B (zh) 将权力信息隔离并依托它进行权力检查的方法及计算装置
CN107533515A (zh) 阻止存储器溢出攻击的精细粒度存储器保护

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant