对栈破坏利用的抑制的制作方法

文档序号:11935246阅读:250来源:国知局
对栈破坏利用的抑制的制作方法与工艺

本申请要求于2014年9月26日提交的题为“Mitigation of Stack Corruption Exploits(对栈破坏利用的抑制)”的美国实用新型申请号14/497,789的优先权,所述申请通过引用结合在此。

技术领域

本申请涉及计算机安全领域,并且更具体地涉及一种用于对栈破坏利用进行抑制的栈保护引擎。



背景技术:

栈破坏利用是恶意软件(或可能疏忽的)攻击,其中,在父例程已经向子例程发出调用之后,恶意进程使用恶意进程的地址来覆写存储器栈上的返回地址。当子例程完成执行并且发出RET指令时,则控制可能传递至恶意进程,向攻击者提供对系统资源的访问。

附图说明

当与附图一起阅读时,将从以下详细描述中最充分地理解本公开。要强调的是,根据行业中的标准实践,各种特征并未按比例绘制,并且仅用于说明目的。实际上,为了讨论的清晰起见,可以任意地增大或者减小各种特征的尺寸。

图1是根据本说明书的一个或多个示例的用户网络的网络层次图。

图2是根据本说明书的一个或多个示例的计算设备的框图。

图3是根据本说明书的一个或多个示例的计算操作的框图。

图4是根据本说明书的一个或多个示例的计算操作的框图。

图5是根据本说明书的一个或多个示例的计算操作的框图。

图6是根据本说明书的一个或多个示例的计算操作的框图。

图7是根据本说明书的一个或多个示例的计算操作的框图。

图8是根据本说明书的一个或多个示例的计算操作的框图。

图9是根据本说明书的一个或多个示例的计算操作的框图。

图10是根据本说明书的一个或多个示例的计算操作的框图。

图11是根据本说明书的一个或多个示例的计算操作的框图。

图12是根据本说明书的一个或多个示例的计算操作的框图。

图13是根据本说明书的一个或多个示例的方法的流程图。

具体实施方式

概述

在示例中,公开了一种用于阻止或改善栈破坏攻击的栈保护引擎。栈保护引擎对用户空间进程而言可以透明地进行操作。在从父例程对子例程进行调用之后,所述栈保护引擎对栈上的返回地址进行编码,比如,利用异或密码以及从密钥阵列中选择的密钥。所述子例程将控制返回到主例程之后,所述栈保护引擎对所述地址进行解码,并将控制返回。如果发生栈破坏攻击,则没有适当地对恶意返回地址进行编码,从而使得,当发生解码时,程序可能仅崩溃而不是将控制返回到恶意代码。

本公开的示例实施例

以下公开提供了用于实施本公开的不同特征的许多不同实施例或示例。以下描述了部件和安排的具体示例以便简化本公开。当然,这些仅是示例并且并不旨在是限制性的。另外,本公开在各种示例中可以重复参考标号和/或字母。这种重复是出于简单和清晰的目的,并且本身并不指定所讨论的各种实施例和/或配置之间的关系。

不同实施例可以有不同的优点,并且不一定需要任何实施例的任何特定优点。

本说明书描述了一种用于抑制栈破坏利用的系统和方法。在一些情况下,在此公开的方法可以结合或作为综合安全方案的组成部分使用。例如,安全方案可以包括被设计成用于保护最终用户和企业的安全和隐私的反病毒程序、反恶意软件、反间谍软件和/或其他部件。

但是,即使在部署了这种综合安全措施时,计算机安全也是安全架构师与试图危害安全的“黑帽”之间的永恒且不断发展的军备竞赛。安全方案可以涉及抑制包含了疏忽的安全缺陷的软件,所述安全缺陷可能本身就是有问题的或者可能为黑帽提供攻击向量。最终,在企业内(或在父母关心他们的孩子的计算机使用情况的家庭情境中),安全架构师必须防范本身无害但是违背企业或家庭政策的软件。

本说明书中所公开的方法可以单独地或结合综合安全方案使用。当结合综合安全方案使用时,这些方法提供了可能必要的“故障安全”机制,例如,在直到在攻击中激活了程序的不良影响时才发现它们的“零天”利用的情况下。在其他情况下,在此公开的方法可以内置在微处理器中,从而使得栈破坏利用被内在地抑制,不论是否部署了其他安全措施。

在本说明书的示例方法中,提供了一种用于拦截栈破坏利用或其他恶意软件的栈保护引擎。如在此描述的,当主例程向子例程发出调用时,可能发生栈破坏利用。当主例程调用子例程时,主例程将许多参数放置在存储器的“栈”部分上。在许多情况下,栈是后进先出(LIFO)缓冲器,返回地址被首先放置在栈上。因此,子例程可以将所有其它参数从栈中“弹出”并且在必要时根据它们来进行操作。在子例程完成其工作并且准备返回值之后,可以通过将最后一个值——返回地址从栈中弹出并且将其用作由处理器架构提供的返回(“RET”)指令的操作数而将控制返回到主例程。

栈破坏恶意软件留意这种事件,并且在检测到主例程已经向子例程发出调用时,以及在子例程完成执行其进程之前,恶意软件覆写首先放置在栈上的返回地址。恶意软件所提供的新返回地址可以是由恶意软件作者提供的到恶意子例程的地址。因此,当子例程准备好将控制返回到主程序时,其将其认为是正确的返回地址的值从栈中弹出,并且然后发出RET指令,该地址作为操作数。然而,RET指令现在指向恶意软件子例程。因此,恶意软件子例程获得对恶意系统资源的访问。当父进程以提升的特权来执行时,问题可能更加严重。在那种情况下,恶意软件子例程可能从父子例程继承那些提升的特权。因此,目标栈破坏利用可能特别留意由具有提升的系统特权的进程进行的子例程调用,从而使得所述目标栈破坏利用可以继承那些特权并且具有更大的自由来对系统进行其恶意工作。

根据本说明书的方法,可以阻止或改善栈破坏利用。这是通过以下方式完成的:提供后台进程,所述后台进程可以在软件或固件中提供,或者可以编码到微处理器的硬件中,在所述软件被放置到栈上之前,所述软件使用可逆编码来对返回地址进行编码。一旦子例程完成执行并且发出RET指令,就在控制返回到该地址之前对操作数中提供的返回地址进行解码。

如果恶意软件在其间已经篡改了返回地址,那么对返回地址的解码将会失败。具体地,在一个实施例中,处理器不需要做出任何特别的努力来判定地址是否已经被篡改,而是仅对地址进行解码。如果地址已经被篡改,那么返回地址将是垃圾。即使垃圾地址是有效存储器地址,在具有兆字节或千兆字节可用存储器的当代系统中,垃圾地址也将极不可能地指向有效子例程或以其他方式执行一些有用的工作。

因此,在没有在此所描述的栈保护引擎的情况下,栈破坏利用的最坏结果是由具有提升的特权的主例程所调用的子例程将控制返回到当时可自由访问用户的系统的恶意子例程。相比之下,具有如在此所描述的栈保护引擎的系统的最坏场景是返回地址将是垃圾,并且进程将会崩溃。另外,随着栈保护引擎变得更加流行,恶意软件作者将认识到栈破坏利用的值是最小的。因此,将存在很小的动机去写新的栈破坏利用。在存在更少的栈破坏利用的情况下,甚至在栈破坏尝试之后的崩溃危险将会大大降低。

现将更具体地参照所附附图来讨论具有相关联的系统和方法的栈保护引擎,所述附图通过非限制性示例的方式公开了一个或多个实施例。

图1是根据本说明书的一个或多个示例的分布式安全使能网络100的网络层次图。在图1的示例中,多个用户120操作多个计算设备110。具体地,用户120-1操作台式计算机110-1。用户120-2操作膝上型计算机110-2。最终用户120-3操作移动设备110-3。每台计算设备可以包括适当的操作系统,比如微软Windows、Linux、安卓、Mac OSX、苹果iOS、Unix等。相比一种类型的设备,可能在另一种类型的设备上更经常地使用前述项中的一些项。例如,台式计算机(也可以是工程工作站)可能更有可能使用微软Windows、Linux、Unix或者Mac OSX之一。膝上型计算机110-2(通常是具有最小定制化的更便携的现成设备)更有可能运行微软Windows或者Mac OSX。移动设备110-3更有可能运行安卓或者iOS。然而,这些示例并不旨在是限制性的。

计算设备110可以经由网络170而彼此通信地耦合以及耦合到其他网络资源。网络170可以是任何适当的网络或网络的组合,通过非限制性示例的方式,包括例如局域网、广域网、无线网络、蜂窝网络或互联网。连接至网络170的还有一个或多个服务器140、应用储存库160以及通过各种设备连接的人类参与者(包括例如攻击者190和开发者180)。服务器140可以被配置成用于提供适当的网络服务,包括在本说明书的一个或多个示例中公开的某些服务。

用户120的目标可以是在没有来自攻击者190和开发者180的干扰的情况下成功地操作他们各自的计算设备110。在一个示例中,攻击者190是恶意软件作者,其目标或者目的是引起恶意伤害或损害。恶意伤害或损害可以采取以下形式:在计算设备110上安装Root kit或其他恶意软件以便篡改系统、安装间谍软件或广告软件以便收集个人和商用数据、丑化网站、操作僵尸网络、操作垃圾邮件服务器或仅打搅和骚扰用户120。因此,攻击者190的一个目的可能是在一个或多个计算设备110上安装其恶意软件。如贯穿本说明书所使用的,恶意软件(“恶意软件”)包括被设计成用于采取可能不需要的行动的任何病毒、木马、僵尸、根程序病毒包、后门、蠕虫、间谍软件、广告软件、勒索软件、拨号器、有效载荷、恶意浏览器辅助对象、cookie、记录器等,通过非限制性示例的方式,包括数据毁坏、隐藏数据收集、浏览器劫持、网络代理或重定向、隐藏跟踪、数据记录、键盘记录、过多的或蓄意的移除阻碍、联系人采集以及未授权的自传播。

开发者180也可以操作网络170。开发者180可能没有恶意的意图,但是可能开发造成安全风险的软件。例如,众所周知的且经常被利用的安全缺陷是所谓的缓冲器溢出,其中,恶意用户(比如攻击者190)能够将过长的字符串输入输入表中并且由此获得执行任意指令或者使用提升的特权来操作计算设备110的能力。缓冲器溢出可以是例如不良输入验证或未完成的垃圾收集的结果,并且在许多情况下,在非显而易见的情境中出现。因此,尽管开发者180本身不是恶意的,但是其可能为攻击者190提供攻击向量。开发者180所开发的应用也可以引起固有问题,比如崩溃、数据丢失或其他非期望的行为。开发者180可以自己托管软件,或者可以将他的软件上传到应用储存库160。因为来自开发者180的软件本身可能是期望的,所以开发者180在漏洞变得已知时偶尔提供修复漏洞的更新或补丁是有益的。

应用储存库160可以表示向用户120提供交互地或自动地下载应用并将其安装在计算设备110上的能力的“应用商店”或者其他网络服务。开发者180和攻击者190都可以经由应用储存库160提供软件。如果应用储存库160具有适当的使攻击者190难以分散明显恶意的软件的安全措施,那么攻击者190反而可以暗中将漏洞插入到显然有益的应用中。

在一些情况下,一个或多少用户120可以属于企业。企业可以提供对可以安装的应用(例如来自应用储存库160)的类型进行限制的政策指示。因此,应用储存库160可以包括并非无意开发的且不是恶意软件的但却违背政策的软件。例如,一些企业限制对娱乐软件(如媒体播放器和游戏)的安装。因此,甚至安全的媒体播放器或游戏也可能不适合企业计算机。

在另一示例中,用户120可以是小孩子的父母,并且希望保护小孩子不受非期望内容(通过非限制性示例的方式,比如,色情作品、广告软件、间谍软件、不符合年龄的内容、对某些政治、宗教或社会运动的倡导、用于讨论非法或者危险活动的论坛)的影响。

因此,用户120的目标是在限制或消除可能不想要的内容(PUC)(包括以上所描述的PUC的种类)的同时配置并操作计算设备110。计算设备110可以包括用于标识并消除PUC的服务,并且服务器140可以提供被配置成用于实施策略的附加的基于网络的服务,并且以其他方式辅助计算设备110排除PUC。

图2是根据本说明书一个或多个示例的客户端设备110的框图。客户端设备110可以是任何适当的计算设备。在各种实施例中,通过非限制性示例的方式,“计算设备”可以是或可以包括:计算机、嵌入式计算机、嵌入式控制器、嵌入式传感器、个人数字助理(PDA)、膝上型计算机、蜂窝电话、IP电话、智能电话、平板计算机、可转换平板计算机、手持计算器或者用于处理和传达数据的任何其他电子、微电子或者微机电设备。

客户端设备110包括连接至存储器220的处理器210,已经在所述存储器中存储了用于提供操作系统222和栈保护引擎224的可执行指令。客户端设备110的其他部件包括存储设备250、网络接口260以及外围接口240。

在示例中,处理器210经由存储器总线270-3被通信地耦合至存储器220,所述存储器总线可以是例如直接存储器访问(DMA)总线。处理器210可以经由系统总线270-1被通信地耦合至其他设备。如贯穿本说明书所使用的,“总线”包括任何有线或者无线互连线、网络、连接、线束、单条总线、多条总线、交叉式网络、单级网络、多级网络或可操作用于在计算设备的部分之间或在计算设备之间承载数据、信号或电力的其他传导介质。应当注意的是,仅通过非限制性示例的方式来公开这些用途,并且一些实施例这些用法前述总线中的一条或多条总线,而其他实施例可以采用附加或不同总线。

在各种示例中,“处理器”可以包括提供可编程逻辑的硬件、软件或者固件的任何组合,包括(通过非限制性示例的方式)微处理器、数字信号处理器、现场可编程门阵列、可编程逻辑阵列、专用集成电路或者虚拟机处理器。

处理器210可以在DMA配置中经由DMA总线270-3而连接至存储器220。为了简化本公开,存储器220被公开为单个逻辑块,但是在物理实施例中可以包括具有任何一种或多种适当的易失性或非易失性存储器技术的一块或多块,包括例如DDR RAM、SRAM、DRAM、缓存、L1或L2存储器、片上存储器、寄存器、闪存、ROM、光学介质、虚拟存储器区域、磁性或磁带存储器等。在某些实施例中,存储器220可以包括相对低等待时间的易失性主存储器,而存储设备250可以包括相对更高等待时间的非易失性存储器。然而,存储器220和存储设备250无需是物理分离的设备,并且在一些示例中,可以仅表示功能的逻辑分离。还应当注意的是,尽管通过非限制性示例的方式公开了DMA,但是DMA并不是与本说明书一致的唯一协议,并且其他存储器架构是可用的。

存储设备250可以是任何种类的存储器220,或者可以是分离的设备,比如硬盘驱动器、固态驱动器、外部存储设备、独立磁盘冗余阵列(RAID)、网络附接存储设备、光学存储设备、磁带驱动器、备份系统、云存储设备或前述各项的任何组合。存储设备250可以是或者其中可以包括一个或多个数据库或存储在其他配置中的数据,并且可以包括所存储的操作软件副本(比如,操作系统222以及栈保护引擎224的软件部分)。许多其他配置也是可能的,并且旨在包括在本说明书的宽泛范围内。

可以提供网络接口260,以便将客户端设备110通信地耦合至有线或无线网络。如贯穿本说明书所使用的“网络”可以包括可操作用于在计算设备内或在计算设备之间交换数据或信息的任何通信平台,通过非限制性示例的方式包括自组织本地网、提供具有电交互能力的通信设备的互联网架构、简易老式电话系统(POTS)(计算设备可以使用所述简易老式电话系统来执行交易,在所述交易中它们可以由人类操作员来帮助或在所述交易中它们可以自动地将数据键入到电话或其他适当的电子设备中)、提供通信接口或在系统中的任何两个节点之间进行交换的任何分组数据网络(PDN)、或任何局域网(LAN)、城域网(MAN)、广域网(WAN)、无线局域网(WLAN)、虚拟专用网(VPN)、内联网、或促进网络或电话环境中的通信的任何其他适当的架构或系统。

在一个示例中,栈保护引擎224是执行如根据本说明书执行方法图13的方法1300或者根据本说明书的其他方法等方法的实用新型或者程序。在各种实施例中,栈保护引擎224可以在硬件、软件、固件或其某个组合中被具体化。例如,在一些情况下,栈保护引擎224可以包括被设计成用于执行方法或其部分的专用集成电路,并且还可以包括可操作用于指示处理器执行所述方法的软件指令。在一些情况下,栈保护引擎224的软件部分可以作为“守护进程”而运行。“守护进程”可以包括作为后台进程、终止并驻留程序、服务、系统扩展、控制面板、启动程序、BIOS子例程或者在没有直接的用户交互的情况下进行操作的任何类似程序而运行的任何程序或者可执行指令系列(无论在硬件、软件、固件或其任何组合中实施)。在其他情况下,栈保护引擎224完全可以驻留在处理器210的硬件中,并且可以对软件例程而言完全不可见地(并且在一些情况下,有目的地)进行操作。还应当注意的是,仅通过非限制性示例的方式提供栈保护引擎224,并且也可以结合除了或者代替栈保护引擎224而提供其他硬件和软件(包括交互式或用户模式软件),以便执行根据本说明书的方法。

在一个示例中,栈保护引擎224包括存储在可操作用于执行图13的方法1300或者根据本说明书的类似方法的非瞬态介质上的可执行指令。在适当时间,比如,在启动客户端设备110之后或者在来自操作系统222或用户120的命令之后,处理器210可以从存储设备250中检索栈保护引擎224(或其软件部分)的副本并且将其加载到存储器220中。然后,处理器210可以迭代地执行栈保护引擎224的指令。

外围接口240可以被配置成用于与连接至客户端设备110的但不一定是客户端设备110的核架构的一部分的任何辅助设备接口连接。外围设备可以可操作用于向客户端设备110提供扩展的功能,并且可能或者可能不完全依赖客户端设备110。在一些情况下,外围设备本身可以是计算设备本身。通过非限制性示例的方式,外围设备可以包括输入和输出设备,比如,显示器、终端、打印机、键盘、鼠标、调制解调器、网络控制器、传感器、换能器、致动器、控制器、数据采集总线、照相机、麦克风、扬声器或者外部存储设备。

在图3中,存储器220被示出为具有主例程320、子例程330以及栈破坏恶意软件340。栈310可以是LIFO缓冲器,并且在各种实施例中,可以在存储器或者内部寄存器中提供。

程序计数器380目前指向主例程320。在此示例中,主例程320是使用提升的系统特权来运行的合法软件,并且子例程330是主例程320的合法子例程。栈破坏恶意软件340已经被攻击者180隐蔽地插入到存储器220中。主例程320驻留在地址0x1234567f处。子例程330驻留在地址0x12346000处。栈破坏恶意软件340驻留在地址0x80000000处。因此,在正确操作的子例程调用中,主例程320将调用子例程330,并且当子例程330完成时,具有操作数0x1234567f的RET指令将会执行,将程序指针380返回到该地址。相反,在成功的恶意软件破坏攻击中,主例程320将把地址0x1234567f放置在栈上作为返回地址,并且然后栈破坏恶意软件340将会使用0x80000000来覆写此值。当子例程330在那种情况下完成执行时,RET指令的操作数将会是0x8000000,并且控制将会传递至栈破坏恶意软件340。

更详细地,栈破坏工作如下。程序指针380指向位于存储器位置0x1234567f处的主例程320。在此示例中,通过非限制性示例的方式使用64位寻址方案,但是为了简化附图,仅示出了每个64位地址的32个最低有效位。尤其是,本说明书的教导并不限于64位寻址。也可以使用其他寻址方案,比如,通过非限制性示例的方式,8位、16位、24位、32位、40位、48位、64位或128位。

在图4中,主例程320调用子例程330。这样做时,主例程320首先将返回地址0x1234567f“推送”到栈310上的返回地址位置410处。返回地址410可以是具体地指定用于保持返回地址的特殊寄存器,并且可以一直用作RET指令的隐含操作数。通过将值0x1234567f推送到返回地址410上,主例程320确保RET指令将会接收正确的操作数。然后,主例程320将四个附加参数(参数0、参数1、参数2以及参数3)推送到栈310上。程序指针380现在具有值0x12346000。

在图5中,在子例程330执行的同时时(即,程序指针380仍在通过子例程330的指令而进行迭代),栈破坏恶意软件通过使用其偏好值0x80000000来覆写返回地址410从而执行其栈破坏攻击。因此,当子例程330发出RET指令时,其将使用值0x80000000作为操作数。注意,尽管为了简单起见而在附图中将恶意例程的地址和实际上攻击返回地址410的代码的地址一起示出,但是它们可以并不相同。在此示例中,地址0x80000000是恶意软件指令的将执行恶意工作的地址。用于攻击返回地址410的指令可以位于存储器220中的任何适当位置中。

在图6中,子例程330使用返回地址0x80000000来发出RET指令。栈破坏恶意软件340现在具有对系统的控制并且可以执行任意命令。如果主例程320正使用提升的特权来进行操作,那么这可能特别危险。在那种情况下,操作系统222可以向恶意软件340提供那些相同的提升的特权。因此,如果主例程320是低级驱动程序或者是可以几乎自由地访问系统资源的其他特权进程,那么栈破坏恶意软件340具有该相同的自由访问。

为了增强计算设备110的安全性,应当阻止前述附图的栈破坏攻击。理想地,将发起栈破坏攻击的值降低到不再值得攻击者180继续创建栈破坏软件的程度。然而,如果栈破坏恶意软件340成功攻击返回地址410,那么控制至少不应传递至栈破坏恶意软件340。

图7至图12公开了对返回地址410的未遂攻击被阻止取得对计算设备110的控制的示例。

在图7中,将栈保护引擎224插置在栈310与存储器220之间。在此示例中,栈保护引擎224包括编码阵列710。编码阵列710包括16个编码值,所述编码值可能或可能不具有与系统地址相同的位宽。如果使用相同的位宽,则对整个返回地址进行编码,如果使用不同的值,则可以只对返回地址的一部分进行编码,这在某些情境中可能是足够的。

在一个示例中,栈保护224执行所提供的地址以及编码值的异或(XOR),并且将结果值放置到返回地址410中。对用户应用而言透明地执行这一点。结果是,返回地址410自身不是可用值。首先必须对它进行编码,例如,通过执行具有相同值的一开始用于对地址进行编码的XOR。

可以例如基于所提供的地址内的位值来选择来自编码阵列710的编码值。如果使用四个最低有效位,那么,将选择编码阵列710中的十六个值之一。这四个位或者未被编码,或者以分别与编码值可逆的方式来进行编码,从而使得它们也可以用于选择解码值。为了增强安全性,返回地址410可以是“只写”存储器值。任何读取返回地址410的尝试都将导致地址在被返回之前被解码。这通过将返回地址写出到存储器中以及将其读回以便尝试推断编码阵列710的值从而阻止栈破坏恶意软件340试图破坏栈保护引擎224。

可以使用其他编码方法。通常,编码方法无需是可逆的;它只需是确定的。因此,在另一个示例中,可以使用单独的编码和解码密钥。在那种情况下,索引值无需是保持未编码。可以使用进行解码后导致返回正确地址的任何方案。

为了附加安全性,可以伪随机地选择并且可以在适当时间(比如在系统启动时间或者按照定期计划表)放置每个编码值。编码值的伪随机性质以及值的定期替换可以帮助保护栈保护引擎224的安全性和完整性。在一个示例中,在每个RET指令之后,栈保护引擎224写入新的伪随机值,从而使得即便栈破坏恶意软件340以某种方式从编码阵列710收集编码值,其也将无用。在另一个示例中,编码阵列710可以是多维阵列,在所述阵列中,值以轮询的方式循环,或者在所述阵列中,地址内的多个位值可以用作多个索引以便进一步将对栈保护引擎224的攻击复杂化。

仅通过示例的方式提供了在此所描述的对伪随机号的使用、对数值的定期替换、对多维编码阵列710的使用、对只写存储器的使用以及其他安全措施。这些并不旨在是限制性的,并且预料的是,系统设计师将根据特定应用的需要来提供安全方法。

在图8中,程序指针380指向位于存储器地址0x1234567f处的主例程320。

在图9中,主例程320调用位于地址0x12346000处的子例程330。再次,主例程320将返回地址410放置在LIFO栈310上,并且然后将四个附加参数放置在栈310上,以供子例程330用作操作数。程序计数器380现在指向地址0x12346000。

当主例程320将值放置在返回地址410中时,栈保护引擎224对地址进行编码。在这种情况下,编码阵列710包括十六个值,返回地址410的四个最低有效位被用作索引。编码阵列710在位置F处具有值0x8080808X,其中,“X”表示最后四位未被编码,以便确保保留索引。这个值用于对地址0x1234567f进行编码。0x1234567f异或0x8080808X的结果是0x92bfd6ff。栈保护引擎224将值0x92bfd6ff写到返回地址410中。如以上所描述的,任何直接读取返回地址410的尝试都将被拦截,并且在返回所述值之前,地址将会被解码。这种行为可以被编码到处理器210的硬件中,使其难以或不可能规避,确保栈破坏恶意软件340无法推断用于编码阵列710的解码值。例如,在返回地址410是特殊寄存器的情况下,可以通过被配置成用于提供栈保护引擎224的特殊硬件或者微代码来处理对返回地址寄存器410的任何读或写操作。在另一种情况下,返回地址410由只写寄存器提供,认识到在某些情况下,存在直接向返回地址410写入的合法理由,但是不允许从返回地址410中读取任何用户代码。

因为编码阵列710中的每个值都不同于编码阵列710中的其他值,所以也提供了一种用于确定哪个值用于进行编码和解码的方法。在此示例中,已经对位置F伪随机地选择了值0x8080808X。应当注意的是,编码阵列710中的值可能或可能不与系统地址宽度相同。

在某些示例中,仅对地址的一部分进行编码是足够的。在一个示例中,只有最高有效位被栈保护引擎224编码。在那种情况下,地址的最后四位将永远不会被栈保护引擎710变更,并且可以用作索引。应当注意的是,在对少于整个返回地址进行解码的任何情况下,任何非编码位置可以被栈保护引擎224用作索引。因此,例如,在栈保护引擎224中对返回地址的32个最低有效位进行编码的情况下,64位地址的四个最高有效位可以用作索引。在对64位地址的32个最高有效位进行编码的示例中,可以使用四个最低有效位。

在对少于整个地址进行编码的某些实施例中,可以将对最高有效位进行编码选择为特别合适的,因为在栈破坏攻击的情况下将更有可能产生“垃圾”返回地址。这是因为使用最高有效位将在存储器中产生更大的跳跃,并且因此不可能导致主例程320或栈破坏恶意软件340使用的地址。这是有利的,因为即使返回到伪随机地址将最有可能导致进程崩溃并且导致未完成任何有用工作,也存在无意伤害的微小机会。在主例程320可以访问低级或者重要系统资源的情况下,有可能的是,返回到伪随机地址导致主例程320偶然对系统造成伤害。例如,如果主例程320包括向重要数据库写入的数据库驱动器,并且栈保护引擎224引起返回到主例程320内的随机地址,数据库驱动器可以将垃圾值无意地写入有价值的数据库中,或者以其他方式破坏数据库。

在另一个示例中,在主例程320时是控制器(比如用于硬盘驱动器)时,跳跃至随机地址可能通过将杂散信号发送至硬盘驱动器而引起无意的损害。因此,对最高有效位进行编码更有可能导致跳跃至远离主例程320的地址,并且因此更不可能造成对系统的无意伤害。

在图9中,当主例程320将地址0x1234567f写入栈310时,栈保护引擎224将所述地址编码为0x92bfd6ff。

在图10中,程序指针380指向子例程330中的地址0x12346000。子例程330使用参数零、一、二和三,并且然后发出RET指令,所述RET指令隐含地接收返回地址410作为其操作数。栈保护引擎224对值0x92bfd6ff进行解码,并且将控制返回到地址0x1234567f。

在图8至图10的示例中,没有发生栈破坏攻击。图11表示了可能在图8和图9中的公开之间发生的栈破坏攻击。根据图8,在此示例中,主例程320已经调用子例程330并且已经将返回值放置在返回地址410中。栈保护引擎224已经根据在此公开的方法来对返回地址410进行了编码,从而使得返回地址410具有值0x92bfd6ff。

在栈破坏攻击中,栈破坏恶意软件340将恶意子例程的返回地址放置在栈310上。在这种情况下,意图是当子例程330完成执行时,子例程将返回控制至栈破坏恶意软件340。因此,地址0x80000000现在处于返回地址410中。

然而,不像图5的示例,栈破坏攻击没有成功。

在图12中,栈保护引擎224在完成RET指令之前对返回地址410进行解码。然而,返回地址410目前具有值0x80000000。如前所述,最后四位被用作编码阵列710的索引,在此示例中,所述编码阵列具有值0x80808080作为其编码值。将地址0x80000000“解码”为地址0x8f8f8f8f80(如前所述,最后四位未被分配)。这是存储器220中的有效地址,但并不是由栈破坏恶意软件340控制的地址。确实,此地址可能完全不包含指令。它可以包含数据,所述数据可能或可能不偶然地具有与某个指令操作码相同的值。如果其不具有所述值,则程序将仅崩溃。如果数据确实偶然地对应于某个操作码,那么它将最有可能是对主例程320的不合逻辑的推论,并且因此仍最有可能导致主例程320崩溃。无论在地址0x8f8f8f8f80处包含什么数据,所述地址极不可能是由栈破坏恶意软件340控制并且代表栈破坏恶意软件340而可预见地执行某个有用任务的地址。

图13是根据本说明书的一个或多个示例由栈保护引擎224执行的方法1300的流程图。应当注意的是,仅通过示例的方式公开了并且仅通过示例的方式以特定的顺序公开了方法1300的操作。在某些实施例中,可以在适当情况下以不同的顺序提供方法1300的操作,可能省略适当的操作,并且未出现在方法1300中的其他操作可以被插置在在此公开的操作之间。因此,方法1300应当被理解为由栈保护引擎224执行的方法的说明性示例,并且不应当被以任何方式解释为限制性的。

在框1310中,主例程320调用子例程330。

在框1320中,栈保护引擎224拦截子例程调用。

在框1330中,栈保护引擎224对子例程调用所提供的返回地址进行编码。这种编码可以采取在此讨论的形式中的任何形式,或者任何其他适当的编码形式。

在框1340中,栈保护引擎224将已编码返回地址放置在栈310上的返回地址410处。

决策框1350等待子例程330发出RET指令。

一旦子例程330发出RET指令,在框1360中,栈保护引擎224就根据在此描述的方法或者根据任何其他适当的方法来对返回地址进行解码。

在框1370中,栈保护引擎224对返回地址进行编码。

在框1380中,栈保护引擎224使用已解码地址来代替已编码地址。

在框1382中,控制被返回到主例程320。

根据在此示例中公开的方法,如果任何其他进程已经篡改了返回地址,那么垃圾值将被解码并且将被用作返回地址,这最有可能导致程序崩溃。

前述内容概述了若干实施例的特征,从而使得本领域技术人员可以更好地理解本公开的各个方面。本领域技术人员应该认识到,他们可以容易地将本公开用作设计或修改其他过程以及结构的基础,以便于实施相同的目的和/或实现在此介绍的实施例的相同优点。本领域技术人员还应意识到,这些等同构造没有背离本公开的精神和范围,并且在不背离本公开的精神和范围的情况下,他们可以在此做出各种改变、替换以及替代。

本公开的特定实施例可以容易地包括片上系统(SOC)中央处理单元(CPU)封装件。SOC表示将计算机或者其他电子系统的部件整合到单个芯片中的集成电路(IC)。其可以包含数字、模拟、混合信号、以及射频功能,所有这些功能都可以在单个芯片基底上提供。其他实施例可以包括多芯片模块(MCM),多个芯片位于单个电子封装件内并且被配置成用于通过电子封装件彼此密切交互。在各种实施例中,数字信号处理功能可以在专用集成电路(ASIC)、现场可编程门阵列(FPGA)和其他半导体芯片中的一个或多个硅核中实施。

在示例实施方式中,在此概述的处理活动的至少一些部分也可以在软件中实施。在一些实施例中,这些特征中的一个或多个特征可以在所公开的附图的元件外部提供的或者采用任何适当方式合并的硬件中实施,以便实现预期功能。各种部件可以包括可以协调以便实现如在此所概述的操作的软件(或者往复式软件)。在仍其他实施例中,这些元件可以包括促进其操作的任何适当的算法、硬件、软件、部件、模块、接口或者对象。

此外,可以移除或以其他方式合并与所描述的微处理器相关联的部件中的一些部件。在一般意义上,在附图中所描绘的安排可以在其表示上可以更合逻辑,而物理架构可以包括这些元件的各种排列、组合和/或混合。必须注意,可以使用无数可能的设计配置来实现在此所概述的操作目标。相应地,相关联的基础设施具有大量替代安排、设计选择、设备可能性、硬件配置、软件实施方式、设备选项等。

任何适当配置的处理器部件可以执行与数据相关联的任何类型的指令,以便实现在此详细说明的操作。在此公开的任何处理器可以将元件或者物品(例如数据)从一种状态或者会中东西转换为另一种状态或者另一种东西。在另一个示例中,在此概述的一些活动可以使用固定逻辑或者可编程逻辑(例如,由处理器执行的软件和/或计算机指令)实施,并且在此标识的元件可以是某种类型的可编程处理器、可编程数字逻辑(例如,现场可编程门阵列(FPGA)、可擦除可编程只读存储器(EPROM)、电可擦除可编程只读存储器(EEPROM))、包括数字逻辑、软件、代码、电子指令、闪存、光盘、CD-ROM、DVD ROM、磁性或者光学卡、适合于存储电子指令的其他类型的机器可读介质的ASIC、或者其任何适当的组合。在操作中,处理器可以将信息存储在任何适当类型的非瞬态存储介质(例如,随机存取存储器(RAM)、只读存储器(ROM)、现场可编程门阵列(FPGA)、可擦除可编程只读存储器(EPROM)、电可擦除可编程ROM(EEPROM)等)、软件、硬件中或者在适当况下并基于特定需要存储在任何其他适当部件、设备、元件或者物体中。进一步地,可以在任何数据库、寄存器、表格、缓存、队列、控制列表或者存储结构(所有这些可以在任何适当的时间帧被引用)中基于特定需要和实施方式提供在处理器中被跟踪、发送、接收或者存储的信息。在此所讨论的存储器项中的任何存储器项应当被理解为包括在宽泛术语‘存储器’内。类似地,在此所描述的可能的处理元件、模块以及机器中的任何一者应当被理解为包括在宽泛术语‘微处理器’或者‘处理器’内。另外,在各种实施例中,在此所描述的处理器、存储器、网卡、总线、存储设备、相关外围设备以及其他硬件元件可以由软件或固件配置来模仿或者虚拟化这些硬件元件的功能的处理器、存储器以及其他相关设备实施。

采用各种形式来具体化实施在此所描述的所有或者部分功能的计算机程序逻辑,包括但决不限于源代码形式、计算机可执行的形式以及各种中间形式(例如,由汇编器、编译器、链接器或者定位器生成的形式)。在示例中,源代码包括以各种编程语言实施的一系列计算机程序指令,比如,目标代码、汇编语言、或高级语言(比如,与各种操作系统或操作环境一起使用的OpenCL、Fortran、C、C++、JAVA或HTML)。源代码可以限定并使用各种数据结构和通信消息。源代码可以采用计算机可执行的形式(例如,经由解释器),或者源代码可以被转换(例如,经由转换器、汇编器或者编译器)成计算机可执行的形式。

在对以上实施例的讨论中,可以容易地替换、替代或者以其他方式修改电容器、缓冲器、图形元件、互连板、时钟、DDRs、相机传感器、除法器、电感器、电阻器、放大器、开关、数字核、晶体管和/或其他部件,以便满足特定电路需要。此外,应当注意的是,对互补电子设备、硬件、非瞬态软件等的使用提供了同样可行的选项,以便实施本公开的教导。

在一个示例实施例中,可以在相关联的电子设备的板上实施附图的任何数量的电路。所述板可以是可以容纳电子设备的内部电子系统的各种部件并且进一步为其他外围设备提供连接器的一般电路板。更具体地,所述板可以提供电连接,系统的其他部件可以通过所述电子连接来进行电通信。可以基于特定配置需要、处理需求、计算机设计等来将任何适当的处理器(包括数字信号处理器、微处理器、支持芯片组等)、存储器元件等耦合至所述板。如外部存储设备、附加传感器、用于音频/视频显示的控制器、以及外围设备等其他部件可以作为插入卡而经由线缆附接至所述板,或者整合到所述板本身中。在另一个示例实施例中,附图的电路可以被实施为独立的模块(例如,具有相关联的部件的设备和被配置成用于执行特定应用或功能的电路)或者被实施为到电子设备的专用硬件的插件模块。

注意,使用在此所提供的许多示例,可以关于两个、三个、四个或更多个电气部件来对交互进行描述。然而,这样做只是出于清晰和示例的目的。应理解的是,可以采用任何适当方式来合并所述系统。根据类似的设计替代方案,可以在各个可能的配置中组合附图中所展示的部件、模块和元件中的任一者,所有这些配置在本说明书的广泛范围内。在某些情况下,通过仅参照有限数量的电气元件,可能更容易描述一组给定流程的功能中的一项或多项功能。。应当理解的是,附图的电路及其教导是可容易扩展的,并且可以容纳大量部件以及更复杂/成熟的安排和配置。。相应地,所提供的示例不应限制如潜在地应用到无数其他架构上的电路的范围或抑制其宽泛教导。

许多其他的改变、替代、变更、改变以及修改对本领域技术人员来说是确定的,并且旨在本公开包含了落在所附权利要求书的范围内的所有这种改变、替代、变更、改变以及修改。为了帮助美国专利及商标局(USPTO)以及另外本申请发布的任何专利的任何读者理解本申请所附权利要求书,申请人希望注意本申请人:(a)并不旨在所附权利要求中的任一项因为在本申请的申请日存在而援引35U.S.C.第112章第(6)段,除非在特定权利要求中确切地使用了字词“用于……的装置”或“用于……的步骤”;并且(b)并不旨在通过本说明书中未在所附权利要求书中反映出的任何陈述以任何方式限制本公开。

示例实施方式

示例1中公开了一种计算设备,所述计算设备包括:存储器,所述存储器包括栈,所述栈包括返回地址位置;以及栈保护引擎,所述栈保护引擎可操作用于:接收返回地址;使用密码对所述返回地址的至少一部分进行编码;以及将所述返回地址放置在所述栈的所述返回地址位置中。

示例2中公开了如权利要求1所述的计算设备,其中,所述栈保护引擎可操作用于对所述返回地址进行解码。

示例3中公开了如权利要求2所述的计算设备,其中,所述栈保护引擎可操作用于:在由父例程对子例程的调用之后,使用密码对所述返回地址的至少一部分进行编码,并且可操作用于:在从所述子例程返回到所述父例程之后,对所述返回地址进行解码。

示例4中公开了如权利要求1所述的计算设备,其中,所述栈保护引擎包括密钥阵列。

示例5中公开了如权利要求4所述的计算设备,其中,所述栈保护引擎可操作用于:将所述返回地址的一部分用作所述密钥阵列的索引。

示例6中公开了如权利要求4所述的计算设备,其中,所述栈保护引擎可操作用于:向所述密钥阵列分配伪随机密钥值。

示例7中公开了如权利要求6所述的计算设备,其中,所述栈保护引擎可操作用于:刷新所述密钥阵列。

示例8中公开了如权利要求7所述的计算设备,其中,所述栈保护引擎可操作用于根据周期性计划表(schedule)来刷新所述密钥阵列。

示例9中公开了如权利要求4所述的计算设备,其中,所述密钥阵列相对于用户空间进程是只写的。

示例10中公开了如权利要求1所述的计算设备,其中,所述密码是异或,并且其中,编码包括从密钥阵列中选择编码密钥。

示例11中公开了如权利要求10所述的计算设备,其中,所述栈保护引擎进一步可操作用于:使用异或密码对所述返回地址进行解码。

示例12中公开了如权利要求1所述的计算设备,其中,所述栈保护引擎对用户空间进程而言不可见地进行操作。

示例13中公开了如权利要求1所述的计算设备,其中,所述栈保护引擎包括被编码在微处理器上的逻辑。

示例14中公开了一种逻辑,所述逻辑被编码在一个或多个计算机可读介质上,所述逻辑可操作用于提供栈保护引擎,其中,所述栈保护引擎可操作用于:接收返回地址;使用密码对所述返回地址的至少一部分进行编码;以及将所述返回地址放置在存储器栈的返回地址位置中。

示例15中公开了如权利要求14所述的逻辑,其中,所述栈保护引擎可操作用于对所述返回地址进行解码。

示例16中公开了如权利要求15所述的逻辑,其中,所述栈保护引擎可操作用于:在由父例程对子例程的调用之后,使用密码对所述返回地址的至少一部分进行编码,并且可操作用于:在从所述子例程返回到所述父例程之后,对所述返回地址进行解码。

示例17中公开了如权利要求14所述的逻辑,其中,所述栈保护引擎包括用于提供密钥阵列的逻辑。

示例18中公开了如权利要求17所述的逻辑,其中,所述栈保护引擎可操作用于:将所述返回地址的一部分用作所述密钥阵列的索引。

示例19中公开了如权利要求17所述的逻辑,其中,所述栈保护引擎可操作用于向所述密钥阵列分配伪随机密钥值并且用于刷新所述密钥阵列。

示例20中公开了如权利要求19所述的逻辑,其中,所述栈保护引擎可操作用于:根据周期性计划表来刷新所述密钥阵列。

示例21中公开了如权利要求17所述的逻辑,其中,所述密钥阵列相对于用户空间进程是只写的。

示例22中公开了如权利要求1所述的逻辑,其中,所述密码是异或,并且其中,编码包括从密钥阵列中选择编码密钥。

示例23中公开了如权利要求10所述的逻辑,其中,所述栈保护引擎进一步可操作用于:使用异或密码对所述返回地址进行解码。

示例24中公开了一种用于提供栈保护引擎的方法,所述方法包括:接收返回地址;在从父例程对子例程进行的调用之后,使用密码对所述返回地址的至少一部分进行编码;以及将所述返回地址放置在存储器栈的返回地址位置中。

示例25中公开了如权利要求24所述的方法,进一步包括:在从所述子例程返回至所述父例程之后,对所述返回地址进行解码。

示例26中公开了一种方法,所述方法包括执行在示例14至23中任一项中所公开的指令。

示例27中公开了一种装置,所述装置包括用于执行如示例26所述的方法的装置。

示例28中公开了如权利要求27所述的装置,其中,所述装置包括处理器和存储器。

示例29公开了如权利要求28所述的装置,其中,所述装置进一步包括计算机可读介质,所述计算机可读介质具有存储在其上的软件指令,所述软件指令用于执行如示例26所述的方法。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1