一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

以模块粒度的影子堆栈违规强制的制作方法

2022-11-13 11:45:39 来源:中国专利 TAG:

以模块粒度的影子堆栈违规强制


背景技术:

1.在大多数现代计算架构中,操作系统针对每个线程向调用堆栈(有时称为机器堆栈或执行堆栈)分配部分系统存储器。此调用堆栈用于促进应用代码中的过程调用(例如,函数、例程等)。通常,每次在线程执行期间调用过程时,都会将新的堆栈帧添加或“推送”到该线程的调用堆栈。此堆栈帧通常由过程的“序言”创建,该过程可以保存返回调用上下文所需的状态信息(例如,过程退出后要执行的下一条指令的返回地址、保存的寄存器值等),为传递给过程的任何参数分配存储器,为过程的局部变量分配存储器等。堆栈帧中包含的特定数据以及该数据的布局取决于处理器架构、操作系统等而变化。当过程退出时,它的堆栈帧被从线程的调用堆栈中去除或“弹出”。此堆栈帧通常由过程的“结尾”去除,这可以恢复调用上下文所需的保存信息(例如,通过将保存的返回地址放置在程序计数器或指令计数器中,来恢复保存的寄存器值等),并且释放堆栈帧占用的所有调用堆栈存储器。
2.近来,一些操作系统和/或处理器已经包含了对影子堆栈的支持。影子堆栈是一种保护过程的存储的返回地址免受恶意或无意修改的机制,诸如当调用堆栈“缓冲器溢出”导致过程在完成时返回到其正确返回地址以外的地址时(例如,在恶意代码内,而不是调用上下文)。例如,恶意行为者可能能够通过利用过程的边界检查中的缺陷,超出分配给过程的堆栈帧中的参数和/或局部变量的存储器量进行写入、以及写入过程堆栈帧中的用于存储过程的返回地址的堆栈存储器,来完成堆栈缓冲器溢出攻击。因此,恶意行为者可以使用堆栈缓冲器溢出将过程存储的存储器地址替换为新的存储器地址(例如,在恶意行为者自己的代码中,或在从过程返回时不期望被执行的代码中)。线程的影子堆栈是次级的独立堆栈,它对于线程的正常调用堆栈“充当影子(shadow)”。当为应用的线程启用影子堆栈强制(enforcement)时,执行该应用的每个过程序言都会导致返回地址被存储在线程的调用堆栈和线程的影子堆栈两者中。另一方面,执行该应用的每个过程结尾会导致从线程的调用堆栈和线程的影子堆栈两者中加载返回地址,然后进行比较。如果调用堆栈与影子堆栈之间的返回地址的两条记录不同,则检测到影子堆栈违规并终止线程(或线程所属的进程)。


技术实现要素:

3.目前,对整个线程(或进程)实施影子堆栈违规,而不管实际触发违规的特定代码。但是,从应用二进制执行的线程经常执行不属于应用二进制本身的代码。例如,应用经常调用不属于应用部分的模块内的过程。例如,模块可以采用共享库的形式,诸如windows下的动态链接库(dll)或linux下的共享对象。这些库可以是操作系统的部分,也可以由第三方提供。因此,使用现有的影子堆栈违规处理技术,如果为应用启用了影子堆栈强制,并且如果为该应用执行的线程在执行由该应用代码调用的模块期间遇到影子堆栈违规,则整个线程(可能包括线程所属的整个进程)被终止。
4.此处描述的至少一些实施例以模块粒度而不是以整个线程(或进程)的粒度来实施影子堆栈违规。例如,当在线程的堆栈上检测到影子堆栈违规时,不是简单地终止线程(或其所属的进程),实施例包括新的附加检查以确定在执行被调用模块期间是否发生了影
子堆栈违规,如果是这样,为该模块是否启用了影子堆栈强制。如果在执行模块期间发生影子堆栈违规,并且如果为该模块启用影子堆栈强制,则实施例继续终止线程(或线程所属的进程)。然而,如果为该模块未启用影子堆栈强制,则一些实施例选择允许线程继续执行,而不是像典型的那样终止线程。因此,这里的实施例决定是否以模块粒度而不是线程(或进程)粒度终止线程(或它所属的进程)。
5.可以理解,以模块粒度而不是典型的线程/进程粒度执行影子堆栈违规,这可以增加计算机系统的整体安全性,并且提高应用利用影子堆栈技术的技术能力。例如,在许多情况下,应用作者希望将应用配置为通过应用自己的代码实施执行影子堆栈违规,但允许在应用调用的模块内执行的代码执行影子堆栈违规。在一个示例中,应用可以调用有效篡改返回地址的模块(例如,经由面向返回的编程(rop))。例如,应用可以在防病毒应用将代码注入应用的环境中执行,这会导致应用调用这样的模块。在另一示例中,应用可以调用非恶意触发(例如,由于错误)影子堆栈违规的模块。不是由于与这些模块的交互而需要完全禁用该应用上的影子堆栈强制,本文的实施例在允许被调用模块代码的影子堆栈违规的同时(即,不终止应用)对应用的代码实施影子堆栈违规。通过这种方式,即使应用调用有意篡改返回地址或尚不兼容影子堆栈的外部模块,也可以为应用启用影子堆栈强制。因此,这里的实施例使得能够对应用使用影子堆栈强制——即使在由于应用所依赖的模块或由于应用执行的环境而以前不可能或不切实际的情况下。
6.一些实施例涉及以模块粒度实施影子堆栈违规的方法、系统和计算机程序产品。线程的执行在处理器处启动。这包括启动应用二进制的第一可执行代码的执行,该应用二进制调用外部模块的第二可执行代码。应用二进制启用了影子堆栈强制。至少基于处理器处的线程的执行,处理异常。该异常是由从与线程对应的调用堆栈中弹出的第一返回地址和从与线程对应的影子堆栈中弹出的第二返回地址之间的不匹配而触发的。处理异常包括确定异常是由执行外部模块的第二可执行代码中的指令引起的,以及确定外部模块是否启用了影子堆栈强制。基于已确定外部模块是否启用了影子堆栈强制,处理异常包括执行以下之一:(i)至少基于启用影子堆栈强制的外部模块,终止线程的执行,或(ii)至少基于未启用影子堆栈强制的外部模块,允许线程继续执行。
7.其他实施例针对在使用规则的同时以模块粒度实施执行影子堆栈违规的方法、系统和计算机程序产品。线程的执行在处理器处启动。这包括启动应用二进制的第一可执行代码的执行,该应用二进制调用外部模块的第二可执行代码。应用二进制文件启用了影子堆栈强制。至少基于处理器处的线程的执行,处理异常。异常是由从与线程对应的调用堆栈中弹出的第一返回地址和从与线程对应的影子堆栈中弹出的第二返回地址之间的不匹配触发的。处理异常包括确定异常是由执行外部模块的第二可执行代码中的指令引起的,确定外部模块是否启用影子堆栈强制,以及至少基于外部模块的身份(identity)标识规则。基于已确定外部模块是否启用了影子堆栈强制,处理异常包括执行以下之一:(i)至少基于启用影子堆栈强制的外部模块来终止线程的执行;(ii)至少基于未启用影子堆栈强制的外部模块以及指定不应允许影子堆栈违规的规则,来终止线程的执行;或(iii)至少基于未启用影子堆栈强制的外部模块以及指定应允许影子堆栈违规的规则,来允许线程继续执行。
8.提供该发明内容以简化形式介绍概念的选择,这些概念将在下面的详细描述中进一步描述。本发明内容并非旨在标识所要求保护的主题的关键特征或基本特征,也不旨在
用作确定所要求保护的主题的范围的帮助。
附图说明
9.为了描述能够获得本发明的上述和其他优点和特征的方式,将参照附图中示出的具体实施例对上文简要描述的本发明进行更具体的描述。理解这些附图仅描述了本发明的典型实施例并且因此不应被认为是对其范围的限制,将通过使用附图以附加的具体性和细节来描述和解释本发明,其中:
10.图1a示出了有助于以模块粒度实施影子堆栈违规的示例计算机系统;
11.图1b示出了有助于以模块粒度实施影子堆栈违规的示例操作系统组件;
12.图2a-图2c示出了以模块粒度实施影子堆栈违规的示例操作;以及
13.图3示出了用于以模块粒度实施影子堆栈违规的示例方法的流程图。
具体实施方式
14.图1a示出了有助于以模块粒度实施影子堆栈违规的示例计算机系统101。计算机系统101包括或利用专用或通用计算机硬件,诸如例如一个或多个处理器102、系统存储器103和持久存储设备104,它们使用一个或多个通信总线105被通信耦合。
15.本发明范围内的实施例包括用于承载或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这样的计算机可读介质可以是通用或专用计算机系统可访问的任何可用介质。存储计算机可执行指令和/或数据结构的计算机可读介质是计算机存储介质。承载计算机可执行指令和/或数据结构的计算机可读介质是传输介质。因此,作为示例而非限制,本发明的实施例可以包括至少两种截然不同的计算机可读介质:计算机存储介质和传输介质。
16.计算机存储介质是存储计算机可执行指令和/或数据结构的物理存储介质(例如,系统存储器103和/或持久存储设备104)。物理存储介质包括计算机硬件,诸如ram、rom、eeprom、固态驱动器(“ssd”)、闪存、相变存储器(“pcm”)、光盘存储、磁盘存储或其他磁性存储设备,或任何其他硬件存储设备,可用于以计算机可执行指令或数据结构的形式存储程序代码,可由通用或专用计算机系统访问和执行以实现所公开的本发明的功能。
17.传输介质可以包括网络和/或数据链路,其可用于承载计算机可执行指令或数据结构形式的程序代码,并且可由通用或专用计算机系统访问。“网络”被定义为能够在计算机系统和/或模块和/或其他电子设备之间传输电子数据的一个或多个数据链路。当信息通过网络或其他通信连接(硬连线、无线或者硬连线或无线的组合)传输或提供到计算机系统时,计算机系统可以将该连接视为传输介质。上述的组合也应包括在计算机可读介质的范围内。
18.此外,在到达各种计算机系统组件时,计算机可执行指令或数据结构形式的程序代码可以从传输介质自动传输到计算机存储介质(反之亦然)。例如,通过网络或数据链路接收的计算机可执行指令或数据结构可以缓存在网络接口模块内的ram中,然后最终传输到计算机系统ram(例如,系统存储器103)和/或计算机系统处的更少易失性计算机存储介质(例如,持久存储设备104)。因此,应当理解,计算机存储介质可以包括在也(或甚至主要)利用传输介质的计算机系统组件中。
19.计算机可执行指令包括指令和数据,例如,当该指令和数据在一个或多个处理器上执行时,使通用计算机系统、专用计算机系统或专用处理设备执行特定功能或一组特定功能。计算机可执行指令可以是例如机器代码指令(例如,二进制)、中间格式指令(诸如汇编语言)或甚至源代码。
20.本领域技术人员将理解,本发明可以在具有多种类型的计算机系统配置的网络计算环境中被实施,该计算机系统配置包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持设备、多处理器系统、基于微处理器或可编程的消费电子产品、网络pc、小型计算机、大型计算机、移动电话、pda、平板电脑、寻呼机、路由器、交换机等。本发明还可以在分布式系统环境中被实施,其中本地和远程计算机系统两者通过网络链接(通过硬连线数据链路、无线数据链路或通过硬连线和无线数据链路的组合)都执行任务。这样,在分布式系统环境中,计算机系统可以包括多个组成计算机系统。在分布式系统环境中,程序模块可以位于本地和远程存储器存储设备中。
21.本领域技术人员还将理解,本发明可以在云计算环境中被实施。云计算环境可以是分布式的,但这不是必需的。当分布式时,云计算环境可以在组织内国际分布和/或具有跨多个组织拥有的组件。在本描述和以下权利要求中,“云计算”被定义为用于实现对可配置计算资源(例如,网络、服务器、存储设备、应用和服务)的共享池的按需网络访问的模型。“云计算”的定义不限于正确部署时可以从此类模型中获得的其他众多优势中的任何一个。
22.云计算模型可以由多种特性组成,诸如按需自助服务、广泛的网络访问、资源池化、快速弹性、可测量的服务等。云计算模型也可以以各种服务模型的形式出现,诸如例如软件即服务(“saas”)、平台即服务(“paas”)和基础设施即服务(“iaas”)。云计算模型也可以使用不同的部署模型(诸如私有云、社区云、公共云、混合云等)被部署。
23.一些实施例,诸如云计算环境可以包括系统,该系统包括一个或多个主机,每个主机能够运行一个或多个虚拟机。在操作期间,虚拟机模拟可操作的计算系统,支持操作系统,也许还支持一个或多个其他应用。在一些实施例中,每个主机包括管理程序(hypervisor),该管理程序使用从虚拟机的视图中抽象出来的物理资源来模拟虚拟机的虚拟资源。管理程序还提供虚拟机之间的适当隔离。因此,从任何给定虚拟机的角度来看,管理程序提供了虚拟机与物理资源接口的错觉,即使虚拟机仅与物理资源的外观(例如,虚拟资源)接口。物理资源的示例包括处理能力、存储器、磁盘空间、网络带宽、媒体驱动器等。
24.如图1a所示,每个处理器102包括(除其他外)一个或多个处理单元106(例如,处理器核),每个处理单元106从系统存储器103(通常经由一个或多个处理器高速缓存,未显示)加载和执行机器代码指令。在一些实施例中,处理器102包括由处理器102提供影子堆栈支持107的硬件和/或微代码。基于处理器的影子堆栈支持107的特定功能可以根据设计选择而变化,但是示例功能包括:分配和保护(例如,经由页表映射)存储器区域以供影子堆栈使用的能力、在执行过程序言期间将返回地址“推送”到影子堆栈的能力(例如,作为“调用”指令执行的部分)、在执行过程结尾期间从影子堆栈“弹出”返回地址的能力(例如,作为“返回”指令执行的部分)、比较从调用堆栈弹出的一个返回地址与从影子堆栈弹出的另一返回地址的能力(例如,作为“返回”指令执行的部分)、和/或当从调用堆栈弹出的返回地址与从影子堆栈弹出的返回地址之间存在不匹配时触发异常的能力。然而,应当理解,这里的实施例可以在没有基于处理器的影子堆栈支持107的情况下被实现。例如,影子堆栈支持107的
功能可以替代地由操作系统提供和/或可以被编译成应用二进制的过程序言和结尾。
25.如图所示,持久存储设备104存储表示可执行软件组件的计算机可执行指令和/或数据结构;相应地,在(多个)处理器102处执行该软件期间,这些计算机可执行指令和/或数据结构的一个或多个部分被加载到系统存储器103中。例如,持久存储器104被示为存储与操作系统108、一个或多个模块109和一个或多个应用110对应的计算机可执行指令和/或数据结构。持久存储器104还存储数据,诸如规则111和日志112。
26.系统存储器103能够存储多种数据,但是为了说明本文中的实施例,系统存储器103被示为存储正在运行的至少一个应用(即,应用代码110a)的至少部分代码、以及由该正在运行的应用调用的模块的至少一部分代码(即模块代码109a)、以及分配给调用堆栈113和影子堆栈114的(包括,例如,用于正在运行的应用的调用堆栈和影子堆栈)存储器。
27.图1b图示了根据一些实施例的操作系统108的细节,包括有助于以模块粒度实施影子堆栈违规的示例组件。应当理解,所描绘的组件——包括它们的标识、子组件和布置——仅作为描述本文所述操作系统108的各种实施例的帮助而呈现,并且这些组件并不限制软件和/或硬件如何可以实现这里描述的各种实施例或其特定功能。
28.操作系统108被示为包括内核115,内核115包括任务管理器116,该任务管理器116负责基于操作系统108和(多个)应用110的代码在(多个)处理器102处启动和管理进程(包括一个或多个线程)的执行。内核115还被示为包括影子堆栈违规异常处理器117(以下称为异常处理器117),当在线程执行期间检测到影子堆栈违规时处理异常。在一些实施例中,当检测到调用堆栈返回地址和影子堆栈返回地址之间的不匹配时,异常处理器117的执行被(多个)处理器102的影子堆栈支持107(例如,经由硬件中断)触发。然而,异常处理器117可以以其他方式(例如,经由软件中断或异常)被触发,诸如通过如下代码来触发,该代码作为过程结尾部分执行并确定调用堆栈返回地址和影子堆栈返回地址是否匹配的代码。因此,异常处理器117能够在各种各样的环境中被使用,包括那些包括用于影子堆栈的硬件支持的环境(例如,影子堆栈支持107),以及那些缺乏硬件影子堆栈支持的环境(例如,影子堆栈功能完全在软件中被实现,诸如经由特殊配置的过程序言和结尾)。
29.注意,这里对异常处理器117的描述集中在当主应用二进制调用的模块导致影子堆栈违规时对异常的处理。应当理解,异常处理器117也可以在其他情况下(诸如当主应用二进制文件本身导致影子堆栈违规时)被调用。因此,除了这里描述的当主应用二进制调用的模块导致影子堆栈违规时异常的处理,异常处理器117还可以被配置为处理其他情况,诸如当主应用二进制时本身会导致影子堆栈违规。因此,应当理解,这里对异常处理器117的描述不限于这里具体描述的那些场景和功能。
30.操作系统108还被示为包括日志器(logger)122,并且潜在地包括规则生成器123。通常,日志器122结合异常处理器117的操作生成日志条目(例如,日志条目被存储在日志112中)。一般来说,规则生成器123(如果存在)处理日志112,和/或将日志112发送到远程系统进行处理。作为规则生成器123的结果,计算机系统101生成和/或接收可由异常处理器117使用的规则111。注意,虽然为了便于说明,规则生成器123被描绘为操作系统108的一部分,在一些实施例中,规则生成器123是单独的应用110(例如,系统安全应用,诸如防病毒应用)的一部分。
31.现在结合图2a-图2c(其示出以模块粒度执行影子堆栈违规的示例操作)、并且结
合图3(其示出用于在模块粒度上实施影子堆栈违规的示例方法300的流程图),来描述图1a和图1b的组件的进一步操作。以下讨论涉及许多方法和方法动作。虽然方法动作可以按特定顺序进行讨论,或者可以在流程图中示出为按特定顺序发生,但不需要特定顺序,除非特别说明,或者因为一个动作被具体描述为依赖于另一动作而需要在执行该动作之前完成。
32.首先参照图3,如图所示方法300包括基于应用二进制启用了影子堆栈强制,在处理器处启动线程执行的动作301。在一些实施例中,动作301包括在处理器处启动线程的执行,包括启动调用外部模块的第二可执行代码的应用二进制的第一可执行代码的执行,该应用二进制已被启用用于影子堆栈强制。例如,在实施例中,任务管理器116在(多个)处理器102处启动应用110之一的执行。启动执行包括任务管理器116使得用于应用110的应用代码110a被加载到系统存储器103中,创建支持在(多个)处理单元106处执行一个或多个线程的内核数据结构,以及针对这些一个或多个线程中的每个线程创建(或启动创建)调用堆栈(即,在调用堆栈113内)。此外,由于对应用的二进制启用了影子堆栈强制,所以启动执行还包括任务管理器116针对这些一个或多个线程中的每个线程创建(或启动创建)影子堆栈114(即,在影子堆栈114内)。
33.在更具体的示例中,图2a示出了示例200a,其描绘了应用二进制201的表示。虽然二进制格式因操作系统而异,但通常二进制包括描述二进制的属性和布局的头部,以及包含应用代码和数据(例如,以文本段、数据段等形式)的主体。因此,在图2a中,应用二进制201被示为包括头部201a部分和主体201b部分。在实施例中,作为启动应用二进制(例如,应用二进制201)的执行的一部分,任务管理器116读取二进制的头部(例如,头部201a)以获得二进制属性和布局,并将至少一部分二进制的主体(例如主体201b)加载至系统存储器103之中(例如,二进制主体中的至少一部分可以对应于应用代码110a)。在图2a中,头部201a被示为包括包含复选标记的复选框。在图2a中,此复选框表示应用二进制201是否按照支持影子堆栈被编译并且请求执行影子堆栈的标志或其他指示符。请注意,可以编译二进制以支持影子堆栈(即,二进制是影子堆栈感知/兼容的),但实际上并没有请求它们的强制(即,二进制没有选择加入影子堆栈强制)。因此,虽然头部201a被显示为包括二进制指示符(即,被复选或者未被复选),但头部201a可能具有更全面的标志/指示符集。在示例200a中,由于头部201a包括复选标记,因此为应用二进制201启用了影子堆栈强制和/或二进制已选择进入(opt-in)影子堆栈强制。因此,当任务管理器116启动应用二进制201的执行时,任务管理器116针对为该二进制创建的任何线程创建影子堆栈。图2a示出任务管理器116已经为应用二进制201启动了至少一个线程的执行,因为它创建了与那个启动的线程对应的调用堆栈203和影子堆栈204。注意,在图2b中,调用堆栈203和影子堆栈204向下“生长”;即,新信息被压入这些堆栈的底部,使得堆栈上的“顶部”项可视地显示在调用堆栈203和影子堆栈204的底部。
34.在实施例中,当加载应用二进制时,任务管理器116标识在其执行期间将由该二进制访问的任何(多个)模块(例如,基于头部201a中的信息)。图2a描绘了由应用二进制201调用的模块202。类似于应用二进制201,模块202被示为包括头部202a部分和主体202b部分。主体202b的代码的至少一部分可以与启动应用二进制201的执行相关联、或在稍后的某个时间被加载到系统存储器(例如,模块代码109a)。在图2a中,头部202a显示为具有空复选框。因此,由于头部201a在复选框中缺少复选标记,因此模块202不支持影子堆栈强制和/或
模块没有选择加入影子堆栈强制。然而,由于对应用二进制201启用了影子堆栈强制,并且由于模块202的代码在调用堆栈203的上下文中执行,因此计算机系统101在模块202的代码执行期间也维护影子堆栈204。
35.值得注意的是,结合启动应用二进制201的线程执行,任务管理器116可以存储是否针对每个应用二进制201和模块202启用和/或请求影子堆栈强制的记录(例如,作为内核线程数据结构的部分)。因此,在一些实施例中,动作301包括存储外部模块是否启用与启动线程的执行相关的影子堆栈强制的记录。
36.图2a示出了在启动的线程已经执行了至少某个时间段之后调用堆栈203和影子堆栈204的状态。例如,调用堆栈203被示为包括:四个堆栈帧203a-203d,它们是结合应用二进制201的代码的执行(例如,由于该二进制内的内部过程调用)而创建的,以及两个堆栈帧203e-203f,它们是随后结合执行模块202的代码而创建的(例如,由于应用二进制201调用模块202内的过程,以及由于模块202调用内部过程)。这些堆栈帧203a-203f中的每个被图示为存储对应的返回地址(即,堆栈帧203a的返回地址205a、堆栈帧203b的返回地址205b、堆栈帧203c的返回地址205c、堆栈帧203d的返回地址205d、堆栈帧203e的返回地址205e、堆栈帧203f的返回地址205f)。相应地,影子堆栈204被示为也以相同的顺序存储这些相同的返回地址205。由于调用堆栈203上的“堆栈”或返回地址与影子堆栈204上的返回地址的“堆栈”相匹配,因此在图2a中,如果堆栈帧203a-203f从调用堆栈203中弹出,则不会出现影子堆栈违规。
37.转到图2b,调用堆栈203上的当前“顶部”堆栈帧203f现在包含新的返回地址(即,返回地址205g),它不同于影子堆栈204上的“顶部”返回地址(即,返回地址205f)。这个新的返回地址205g可能由于模块202中的错误(bug)、由于模块202的故意rop行为或甚至由于针对模块202的恶意攻击而被写入堆栈帧203f。转向图2c,堆栈帧203f是现在正在从调用堆栈203中“弹出”(例如,由于在模块202中执行过程结尾)。结果,返回地址205f也从影子堆栈204弹出。通过影子堆栈逻辑的操作(例如,作为过程结尾的一部分和/或通过处理器102内的影子堆栈支持107)在返回地址205g和返回地址205f之间检测到不匹配。结果,检测到影子堆栈违规(例如,通过过程结尾代码和/或通过影子堆栈支持107),触发硬件或软件异常。
38.返回到图3,方法300还包括基于线程的执行处理影子堆栈违规的动作302。在一些实施例中,动作301包括,至少基于线程在处理器处的执行,处理由从与线程对应的调用堆栈弹出的第一返回地址和从与线程对应的影子堆栈弹出的第二返回地址之间的不匹配触发的异常。在示例中,作为由结合图2b和图2c描述的返回地址不匹配触发的异常的结果,调取异常处理器117来处理异常。异常处理器117被示为包括可用于处理异常的各种组件。这些组件结合动作303-306被描述,动作303-306在图3中被示为动作302的子动作。
39.动作302包括确定异常是由执行被应用二进制调用的模块触发的动作303。在一些实施例中,动作303包括确定异常是由外部模块的第二可执行代码中的指令的执行引起的。例如,异常处理器117被示为包括模块标识符118。在实施例中,模块标识符118操作以确定触发异常(如果存在)的模块的身份。
40.在一些实施例中,模块标识符118通过标识与触发异常的指令的“调用地点(calling site)”对应的存储器地址来操作。例如,如果触发该指令的指令是过程结尾中的“返回”指令,则与该指令的“调用地点”对应的存储器地址是“返回”指令在系统存储器中存
储的存储器地址。如果此“返回”指令是执行的应用二进制(例如,应用二进制201)的过程结尾的部分,则该指令的存储器地址将位于系统存储器103中由应用代码110a占用的存储器地址的范围内;在这种情况下,模块标识符118将确定调用地点地址是应用二进制的部分。另一方面,如果这个“返回”指令是由应用二进制调用的模块(例如,模块202)的过程结尾的部分,那么指令的存储器地址将位于系统存储器103中由模块代码109a占用的存储器地址范围内;在这种情况下,模块标识符118将确定调用地点地址是模块的部分。
41.在附加的或可选的实施例中,模块标识符118通过标识与作为触发异常的指令的“目标地址”的存储器地址相对应的存储器地址来操作。例如,如果触发该指令的指令是过程结尾中的“返回”指令,则与该指令的“目标地址”对应的存储器地址是该过程的调用堆栈帧中保存的返回地址。如果该保存的返回指令是执行的应用二进制(例如,应用二进制201)的部分,则指令的存储器地址将位于系统存储器103中的应用代码110a占用的存储器地址范围内;在这种情况下,模块标识符118将确定目标地点地址是应用二进制的部分。另一方面,如果这个保存的返回指令是应用二进制调用的模块(例如,模块202)的部分,那么指令的存储器地址将位于系统存储器103中模块代码109a占用的存储器地址范围内;在这种情况下,模块标识符118将确定目标地点地址是模块的部分。
42.如将理解的,根据被去除的堆栈帧的性质,模块标识符118可以为调用地点和目标地址两者标识相同的实体,或者模块标识符118可以为调用地点和目标地址中的每一个标识不同的实体。例如,模块202内的“返回”指令可以将模块202内的返回地址作为其目标地址,在这种情况下,调用地点和目标地址两者将对应于同一实体。在另一示例中,模块202内的“返回”指令可以将应用二进制201内的返回地址或某个其他实体作为其目标,在这种情况下,调用地点和目标地址将与不同的实体对应。
43.鉴于前面对模块标识符118的讨论应当理解,在动作302的一些实施例中,确定异常是由外部模块的第二可执行代码中的指令的执行引起的,包括确定以下一项或多项,(i)指令的调用地点地址与外部模块的第二可执行代码对应,或(ii)指令的目标地址与外部模块的第二可执行代码对应。
44.再次参照图2c的示例,在处理由堆栈帧203f的去除所触发的异常期间,在动作303的实施例中,模块标识符118将模块202标识为与调用地点地址对应(即,因为这将是模块202的过程结尾,该模块202去除过程结尾)。取决于返回地址205g对应于哪个代码(如果有的话),在一些实施例中,模块标识符118将目标地点地址识别为与模块202对应、与应用二进制201对应、与某个其他实体对应或根本不对应于任何实体。
45.如上所述,异常处理器117可以在异常不是由模块触发的情况下被调用,诸如当主应用二进制本身导致影子堆栈违规时。在这些情况下,异常处理器117可以通过终止线程或在启用审核模式时允许线程继续执行,来继续实施执行影子堆栈违规。稍后将结合动作306描述审核模式。
46.假设在动作303中标识出模块,动作302还包括确定模块是否启用影子堆栈强制的动作304。在一些实施例中,动作304包括确定外部模块是否被启用用于影子堆栈强制。例如,异常处理器117被示为包括影子堆栈强制标识符119(以下称为强制标识符119)。在实施例中,强制标识符119确定在动作303中识别的模块是否启用了影子堆栈强制。例如,参考模块202,强制标识符119将确定模块202未启用影子堆栈强制(即,因为在模块202的头部202a
中没有复选标记)。
47.如结合图2a所讨论的,有可能二进制是按照支持影子堆栈被编译的(即,二进制是影子堆栈感知/兼容的),但没有请求影子堆栈强制(即,二进制未选择进入影子堆栈强制)。因此,在动作304的一些实施例中,强制标识符119确定以下一项或多项:(i)模块是否按照支持影子堆栈被编译,或(ii)模块是否选择进入影子堆栈强制。在一些实施例中,当(i)外部模块被编译用于影子堆栈遵从时(即,如果没有选择进入或选择退出的选项)、或(ii)当外部模块被编译为选择进入影子堆栈强制(即,如果存在选择进入或选择退出的选项)。类似地,在一些实施例中,外部模块不启用影子堆栈强制:当外部模块未针对影子堆栈遵从被编译时(即,如果没有选择进入或选择退出的选项),或(ii)当外部模块被编译为选择退出影子堆栈强制(即,如果存在选择加入或退出的选项)。
48.在一些实施例中,强制标识符119查阅在动作303中标识的模块的头部,以确定该模块是否被启用用于影子堆栈强制。然而,如所讨论的,在一些实施例中,动作301包括存储外部模块是否启用与启动线程的执行相关的影子堆栈实施的记录。在这些实施例中,确定外部模块是否启用影子堆栈强制可以包括查询该记录的强制标识符119,而不是需要实际查看模块头部本身。
49.在一些实施例中,动作302还包括标识模块的执行规则的动作305。在一些实施例中,动作305包括至少基于外部模块的身份来标识规则。例如,异常处理器117被示为包括规则标识符120。在实施例中,规则标识符120查阅规则111以确定是否存在指定是否应当允许外部模块的异常的规则(即,在该情况下应当允许线程继续执行),或者是否应当禁止外部模块的异常(即,在该情况下应当终止线程)。在实施例中,规则111是基于对涉及计算机系统101和/或另一计算机系统处的外部模块的影子堆栈违规的先前记载(即,由日志器122)的分析而创建的。在实施例中,规则标识符120还基于应用二进制的身份(即,除了外部模块的身份之外)标识规则。因此,在一些实施例中,规则111特定于应用二进制和外部模块的特定组合。
50.动作302还包括实施模块的影子堆栈违规策略的动作306。在一些实施例中,动作306包括基于已确定用于影子堆栈强制的外部模块是否被启用,执行终止线程(即,动作306a)或允许线程继续执行(即,动作306b)之一。例如,异常处理器117被示为包括影子堆栈策略实施器121(以下称为策略实施器121)。在实施例中,策略实施器121根据是否针对外部模块启用影子堆栈强制来终止线程或允许线程继续执行,在动作305中标识的规则是否指定应允许影子堆栈违规,和/或是否启用强制模式或审核模式。
51.如图所示,动作306可以至少基于以下项调用动作306a来终止线程:(i)针对模块启用影子堆栈强制,或(ii)针对模块未启用影子堆栈强制但规则(即,在动作305)指定不应允许影子堆栈违规。例如,如果针对模块启用了影子堆栈强制,则该模块已请求实施该模块的影子堆栈违规,因此策略实施器121终止线程。另一方面,如果针对模块未启用影子堆栈强制,则策略实施器121可以默认允许线程继续执行,但如果规则如此指定则覆盖该默认值;因此,模块可能不会被编译为影子堆栈遵从(或可以选择退出影子堆栈强制),但策略实施器121仍然可以实施模块的影子堆栈违规。
52.另一方面,如图所示,动作306可以至少基于以下项调用动作306b以允许线程继续执行:(i)针对模块未启用影子堆栈强制(并且没有针对模块的规则),或(ii)针对模块未启
用影子堆栈强制,并且规则指定应当允许影子堆栈违规。例如,如果针对模块未启用影子堆栈强制,则策略实施器121可以默认允许线程继续执行。此外,规则(即,规则111)还可以指定应当允许模块的影子堆栈违规。因此,在动作306a的一些实施例中,当外部模块没有被启用用于影子堆栈强制并且当规则指定应当允许影子堆栈违规时,计算机系统允许线程继续执行。
53.动作306a还显示可以至少基于启用强制模式来终止线程,而动作306b还显示可以至少基于启用审核模式来允许线程继续执行。在实施例中,策略实施器121在强制模式或审核模式下操作——或者全局地、或者在每个线程、每个应用二进制和/或每个模块的基础上。当在强制模式下操作时,策略实施器121基于已经结合动作306a和306b描述的策略终止线程,或允许它执行。另一方面,当在审核模式下操作时,策略实施器121允许线程继续执行,即使在它在结合动作306a描述的策略下通常会被终止的情况下也是如此。当通过日志器122与日志结合时,审核模式可用于通过执行代码(无论是主应用二进制中的代码和/或由该应用二进制调用的外部模块中的代码)来记载影子堆栈违规,而不会在发生违规时实际终止线程。
54.方法300还包括记载异常的动作307。例如,日志器122可以将关于异常的一个或多个数据项记载到日志112中。在实施例中,动作307在当策略实施器121在强制模式下操作时和当它在审核模式下操作时都被执行,尽管它可以被配置为在某些情况下避免记载。作为示例,在各种实施例中,日志器122记载调用地点地址、目标地址、外部模块的标识符、线程所属进程的标识符、线程的标识符、应用二进制的标识符、是否启用强制模式或审核模式、是否实施或允许影子堆栈违规等中的一项或多项。在实施例中,当记载外部模块或应用二进制的标识符时,日志器122将文件系统路径记载到外部模块或应用二进制。在一些实施例中,日志器122在这些情况下通过去除或模糊个人可标识信息来保护用户隐私,诸如与用户主目录或配置文件目录对应的路径部分。
55.如所提到的,规则生成器123(如果存在)处理日志112,和/或将日志112发送到远程系统进行处理,以便生成和/或接收由异常处理器117可使用的规则111。还提到,规则标识符120(如果存在)查阅这些规则111以确定是否应当基于外部模块的身份允许外部模块的异常,潜在地与应用二进制的身份相结合。规则生成器123(连同所涉及的任何(多个)远程系统)可以使用多种技术来处理日志112以便生成规则111,包括使用任何适当的机器学习技术。在实施例中,规则生成器123可以基于以下项来生成规则:标识频繁(或不频繁)导致影子堆栈违规的模块、标识频繁(或不频繁)影子堆栈违规的应用/模块组合、标识允许的影子堆栈违规后来导致线程崩溃的情况、标识在允许的影子堆栈违规后观察到的可疑行为的情况等。
56.因此,这里的实施例以模块粒度而不是以整个线程(或进程)粒度实施影子堆栈违规。因此,不是当在线程的堆栈上检测到影子堆栈违规时简单地终止线程/进程,这里的实施例执行检查以确定影子堆栈违规是否在外部模块的执行期间发生,如果是,针对该模块是否启用影子堆栈强制。如果在模块的执行期间发生影子堆栈违规,并且如果对该模块启用影子堆栈强制,实施例继续终止线程(或它所属的进程)。然而,如果针对该模块未启用影子堆栈强制,则一些实施例选择允许线程继续执行,而不是像典型的那样终止它。以模块粒度而不是以线程/进程粒度实施影子堆栈违规可以提高计算机系统的整体安全性,并增加
影子堆栈技术的采用。例如,不是由于应用与触发影子堆栈违规的模块的交互而需要禁用该应用上的影子堆栈强制,而是本文的实施例在允许被调用模块代码的影子堆栈违规的同时、针对应用的代码实施影子堆栈违规。通过这种方式,即使应用调用有意篡改返回地址或尚不兼容影子堆栈的外部模块,也可以为应用启用影子堆栈强制。因此,这里的实施例使得能够对应用使用影子堆栈强制——即使在以前由于应用所依赖的(多个)模块或由于应用执行的环境而导致其不切实际的情况下。
57.尽管已经以特定于结构特征和/或方法行为的语言描述了主题,但是应当理解,在所附权利要求中定义的主题不一定限于上述描述的特征或行为,或动作的顺序。相反,所描述的特征和动作被公开为实施权利要求的示例形式。
58.本发明可以在不背离其精神和基本特性的情况下,以其他具体形式体现。所描述的实施例在所有方面只能被视为说明性的而不是限制性的。因此,本发明的范围是通过所附的权利要求而不是前面的描述来说明的。在权利要求的等价意义和范围内的所有更改都应包含在其范围内。当在附加权利要求中引入元素时,冠词“一种”、“一个”、和“所述”旨在表示存在一个或多个元素。术语“包括”、“包含”和“具有”旨在包含所有内容,并且表示除所列内容外,可能还有其他内容。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献