CN117501244A - 审计模式下的循环影子堆栈 - Google Patents

审计模式下的循环影子堆栈 Download PDF

Info

Publication number
CN117501244A
CN117501244A CN202280042717.5A CN202280042717A CN117501244A CN 117501244 A CN117501244 A CN 117501244A CN 202280042717 A CN202280042717 A CN 202280042717A CN 117501244 A CN117501244 A CN 117501244A
Authority
CN
China
Prior art keywords
shadow stack
stack
thread
shadow
computer system
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
Application number
CN202280042717.5A
Other languages
English (en)
Inventor
J·蔺
M·伊甘
J·林
M·J·伍尔曼
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.)
Microsoft Technology Licensing LLC
Original Assignee
Microsoft Technology Licensing LLC
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
Priority claimed from US17/352,283 external-priority patent/US11861364B2/en
Application filed by Microsoft Technology Licensing LLC filed Critical Microsoft Technology Licensing LLC
Publication of CN117501244A publication Critical patent/CN117501244A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • G06F9/485Task life-cycle, e.g. stopping, restarting, resuming execution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0706Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment
    • G06F11/073Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment in a memory management context, e.g. virtual memory or cache management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0766Error or fault reporting or storing
    • G06F11/0775Content or structure details of the error report, e.g. specific table structure, specific error fields
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0766Error or fault reporting or storing
    • G06F11/0778Dumping, i.e. gathering error/state information after a fault for later diagnosis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0793Remedial or corrective actions
    • 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
    • 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/55Detecting local intrusion or implementing counter-measures
    • G06F21/554Detecting local intrusion or implementing counter-measures involving event detection and direct action
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/3003Monitoring arrangements specially adapted to the computing system or computing system component being monitored
    • G06F11/3037Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system component is a memory, e.g. virtual memory, cache
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
    • G06F11/3409Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for performance assessment
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3612Software analysis for verifying properties of programs by runtime analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2201/00Indexing scheme relating to error detection, to error correction, and to monitoring
    • G06F2201/81Threshold
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2221/00Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/21Indexing scheme relating to G06F21/00 and subgroups addressing additional information or applications relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/2101Auditing as a secondary aspect

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Computer Security & Cryptography (AREA)
  • Quality & Reliability (AREA)
  • Computer Hardware Design (AREA)
  • Health & Medical Sciences (AREA)
  • Biomedical Technology (AREA)
  • Executing Machine-Instructions (AREA)

Abstract

执行针对线程在审计模式下的影子堆栈功能包括:在处理器处发起线程的执行。线程的执行包括:发起应用二进制文件的可执行代码的执行作为线程的一部分,以及在审计模式下,启用针对线程的影子堆栈功能。至少基于在审计模式下执行线程,影子堆栈的至少一部分被启用为循环堆栈。响应于确定影子堆栈的使用量已经达到所限定的阈值,影子堆栈的一个或多个当前被使用的条目被覆写,从而防止影子堆栈溢出。

Description

审计模式下的循环影子堆栈
背景技术
在大多数现代计算架构中,操作系统将系统存储器的针对每个线程的部分分配给调用堆栈(有时被称为机器堆栈或执行堆栈)。该调用堆栈被用于促进应用代码内的程序调用(例如,函数、例程等)。通常,每当程序在线程的执行期间被调用时,新的堆栈帧被添加或“推送”到针对该线程的调用堆栈。该堆栈帧通常由程序的“序言”创建,“序言”可以保存返回到调用上下文所需的状态信息(例如,要在程序退出之后被执行的下一指令的返回地址、所保存的寄存器值等),为传递给程序的任何参数分配存储器,为程序的局部变量分配存储器等。堆栈帧中包括的特定数据以及该数据的布局根据处理器架构、操作系统等而异。当程序退出时,其堆栈帧被从针对线程的调用堆栈中去除或“弹出”。该堆栈帧通常通过程序的“尾声”被去除,尾声可以恢复调用上下文所需的已保存的信息(例如,通过将所保存的返回地址放置在程序计数器或指令计数器中,恢复所保存的寄存器值等),并且解除分配由堆栈帧占用的任何调用堆栈存储器。
最近,一些操作系统和/或处理器已包括对影子堆栈(shadow stack)的支持。影子堆栈是这样的机制,该机制用于诸如在调用堆栈“缓冲区溢出”引起程序在完成时返回到除了其正确的返回地址以外的地址(例如,在恶意代码内,而不是在调用上下文中)时,保护程序的所存储的返回地址免受恶意或无意的修改。例如,恶意的参与者可能能够通过利用程序边界检查中的缺陷写入超出被分配给程序的堆栈帧中的参数和/或局部变量的存储器的量并且写入到程序的堆栈帧中的被用于存储程序的返回地址的堆栈存储器,完成堆栈缓冲区溢出攻击。因此,恶意的参与者可以使用堆栈缓冲区溢出来将程序的所存储的存储器地址替换为新的存储器地址(例如,在恶意的参与者自己的代码内、或者在从程序返回时不打算被执行的代码内)。针对线程的影子堆栈是第二、单独的堆栈,该堆栈将线程的正常调用堆栈消隐。当影子堆栈针对应用的线程被启用时,执行该应用的程序序言中的每个程序序言会引起要在线程的调用堆栈和线程的影子堆栈两者中存储返回地址。另一方面,执行该应用的程序尾声中的每个程序尾声会引起要从线程的调用堆栈和线程的影子堆栈两者加载返回地址,然后将它们进行比较。如果在调用堆栈与影子堆栈之间返回地址的两个记录不同,则影子堆栈违规(violation)被检测并且线程(或线程所属的进程)被终止。
发明内容
当影子堆栈强制执行(enforcement)特征在生态系统内被启用时,需要以预期方式利用其调用堆栈来执行代码;否则,该代码可能会引起致命的系统错误,诸如“蓝屏”、内核崩溃等。但是,并非所有代码当前都符合影子堆栈功能。为了确保生态系统和/或驱动程序符合影子堆栈功能,审计模式可以被启用以获取与影子堆栈强制执行被启用时哪些代码中断有关的遥测数据(telemetry)。在实施例中,当影子堆栈不匹配发生时,CPU发布异常(例如,控制保护异常)。在审计模式下,当异常被发布时,不会强制执行任何策略,而是影子堆栈中的不匹配条目被替换为调用堆栈中的条目,并且报告遥测数据可以被生成(例如,包括应用二进制文件名称、回溯跟踪信息等)。开发人员然后可以利用该遥测数据来改进影子堆栈兼容性,以将应用二进制文件添加到影子堆栈阻止列表等。因此,与影子堆栈的不兼容可以在审计模式下被捕获。
但是,特定不兼容影子堆栈的软件程序,诸如(但不限于)特定游戏,其行为不同,使得返回地址的不匹配无法简单地通过将影子堆栈中的返回地址替换为调用堆栈中的返回地址来缓解。例如,当一些不兼容的软件程序正在审计模式下运行时,它们不知道影子堆栈。当这样的软件程序连续地执行调用时,许多地址被不断推送到调用堆栈和影子堆栈两者上。由于这样的现象不会触发CPU发布传统的控制保护异常,因此影子堆栈可能会溢出其被分配的存储器缓冲区并且引起致命的系统错误。
本文中描述的至少一些实施例通过在审计模式下将影子堆栈的至少一部分启用为循环堆栈(circular stack)来解决上述问题,使得当影子堆栈的使用量(usage)达到所限定的使用量阈值时,影子堆栈的至少一部分中的内容被覆写。因此,在审计模式下,计算机系统能够在同时防止影子堆栈溢出以及引起致命的系统错误的同时获取当前与影子堆栈不兼容的特定应用二进制文件的数据。
一些实施例涉及在审计模式下将影子堆栈的至少一部分启用为循环堆栈的方法、系统和计算机程序产品。线程的执行在处理器处被发起。这包括发起应用二进制文件的可执行代码的执行作为线程的一部分。应用二进制文件在审计模式下针对影子堆栈功能被启用。至少基于在审计模式下在处理器处执行线程,影子堆栈的至少一部分被变为循环堆栈。将影子堆栈的至少一部分变为循环堆栈包括:确定影子堆栈的使用量是否已经达到所限定的使用量阈值。响应于确定影子堆栈的使用量已经达到所限定的使用量阈值,影子堆栈中的返回地址的一个或多个条目被覆写,从而防止影子堆栈溢出被分配给影子堆栈的存储器区域。
例如,软件程序(其不知道影子堆栈)可能会手动自行管理其调用堆栈(包括返回地址)以允许更深入的递归,从而引起影子堆栈耗尽被分配给影子堆栈的存储器区域。在一些情况下,软件程序可以在不干预类似“ret”的指令的情况下重复使用类似“调用(call)”的指令(例如,函数调用),类似“调用”的指令也使用影子堆栈。由于类似“ret”的指令被配置为弹出和验证影子堆栈中的条目,因此没有类似“ret”的指令的这样的类似“调用”的指令将引起影子堆栈继续增长。当这样的类似“调用”的指令或函数调用过多时,它们将值推送到影子堆栈上可能会引起影子堆栈耗尽(也被称为“影子堆栈溢出”)。当影子堆栈溢出发生时,可能会发生致命的CPU异常。本文中描述的实施例可以防止致命的CPU异常,即使这可能意味着损坏影子堆栈的至少一部分(通过使其循环)。再例如,软件程序不是使用“ret”指令,而是使用分支指令来返回。在这样的情况下,影子堆栈上的对应返回地址不会被弹出,并且影子堆栈溢出也可能最终发生。
在一些实施例中,响应于对影子堆栈的一个或多个当前被使用的条目进行覆写,与线程相关联的一个或多个遥测数据被记录。在一些实施例中,一个或多个遥测数据包括(但不限于)以下至少一项:(1)线程所属的进程的标识符,(2)线程的标识符,和/或(3)与线程相关联的应用二进制文件的标识符。在一些实施例中,应用二进制文件是设备驱动程序。应用二进制文件标识符的示例包括(但不限于)文件名、二进制文件的特定部分的哈希值、应用二进制文件的嵌入式版本元数据、和/或它们的组合。
在一些实施例中,影子堆栈功能也可以在强制执行模式下被启用。当强制执行模式被启用时,计算机系统不会将影子堆栈的任何部分启用为循环堆栈。在一些实施例中,将影子堆栈启用为循环堆栈还包括:确定审计模式在使影子堆栈成为循环堆栈之前被启用。
在一些实施例中,影子堆栈基于被分配给影子堆栈的存储器区域的大小包括针对返回地址的条目的最大数目的空间,并且返回地址的一个或多个条目被输入最大数目的空间当中的一个或多个顺序(sequential)空间中,直到影子堆栈的使用量已经达到所限定的使用量阈值。
本发明内容旨在以简化的形式介绍一系列概念,这些概念将在以下的具体实施方式中被进一步描述。本发明内容不旨在标识所要求保护的主题的关键特征或基本特征,也不旨帮助确定所要求保护的主题的范围。
附图说明
为了描述可以获得本发明的上述优点和特征以及其他优点和特征的方式,将通过参考其具体实施例来对上述简要描述的本发明进行更具体的描述,这些实施例在所附的附图中进行图示。理解这些附图仅描绘了本发明的典型实施例并且因此不应被视为对其范围的限制,因此将通过使用所附的附图,利用附加特异性和细节对本发明进行描述和解释,其中:
图1A图示了促进在模块粒度上强制执行影子堆栈违规的示例计算机系统;
图1B图示了促进在模块粒度上强制执行影子堆栈违规的示例操作系统组件;
图2A至图2C图示了在模块粒度上强制执行影子堆栈违规的示例操作;
图2D图示了示例影子堆栈,影子堆栈的一部分在审计模式下被启用为循环堆栈;
图3图示了在模块粒度上强制执行影子堆栈违规的示例方法的流程图;
图4图示了用于在审计模式下将影子堆栈的至少一部分启用为循环堆栈的示例方法的流程图;以及
图5图示了用于在审计模式下处理影子堆栈违规的示例方法的流程图。
具体实施方式
图1A图示了促进在模块粒度上强制执行影子堆栈违规的示例计算机系统101。计算机系统101包括或利用使用一个或多个通信总线105进行通信耦合的专用或通用计算机硬件,诸如例如一个或多个处理器102、系统存储器103和持久存储装置104。
本发明的范围内的实施例包括用于携带或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这样的计算机可读介质可以是通用或专用计算机系统可访问的任何可用介质。存储计算机可执行指令和/或数据结构的计算机可读介质是计算机存储介质。携带计算机可执行指令和/或数据结构的计算机可读介质是传输介质。因此,作为示例而非限制,本发明的实施例可以包括至少两种截然不同的计算机可读介质:计算机存储介质和传输介质。
计算机存储介质是存储计算机可执行指令和/或数据结构的物理存储介质(例如,系统存储器103和/或持久存储装置104)。物理存储介质包括计算机硬件,诸如RAM、ROM、EEPROM、固态硬盘(“SSD”)、闪存、相变存储器(“PCM”)、光盘存储、磁盘存储或其他磁性存储设备、或者任何其他硬件存储设备,这些计算机硬件可以被用于以计算机可执行指令或数据结构的形式存储程序代码,程序代码可以由通用或专用计算机系统访问和执行来实现所公开的本发明的功能。
传输介质可以包括网络和/或数据链路,网络和/或数据链路可以被用于以计算机可执行指令或数据结构的形式携带程序代码,并且可以由通用或专用计算机系统访问。“网络”被定义为使得能够在计算机系统和/或模块和/或其他电子设备之间传输电子数据的一个或多个数据链路。当信息通过网络或另一通信连接(硬连线、无线、或者硬连线或无线的组合)而被传输或提供给计算机系统时,计算机系统可以将该连接视为传输介质。上述组合也应被包括在计算机可读介质的范围内。
此外,在到达各种计算机系统组件时,以计算机可执行指令或数据结构的形式的程序代码可以从传输介质自动传输到计算机存储介质(反之亦然)。例如,通过网络或者数据链路接收到的计算机可执行指令或数据结构可以被缓冲在网络接口模块内的RAM中,并且然后最终被传送到计算机系统处的计算机系统RAM(例如,系统存储器103)和/或易失性较低的计算机存储介质(例如,持久存储装置104)。因此,应理解,计算机存储介质可以被包括在也(甚至主要)利用传输介质的计算机系统组件中。
计算机可执行指令包括例如当在一个或多个处理器处被执行时,引起通用计算机系统、专用计算机系统或专用处理设备执行特定功能或功能组的指令和数据。计算机可执行指令可以是例如机器代码指令(例如,二进制文件)、中间格式指令(诸如,汇编语言)、或者甚至源代码。
本领域技术人员将理解,本发明可以在具有多种类型的计算机系统配置的网络计算环境中实践,包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持设备、多处理器系统、基于微处理器或可编程的消费电子产品、网络PC、小型计算机、大型计算机、移动电话、PDA、平板计算机、寻呼机、路由器、交换机等。本发明还可以在分布式系统环境中被实践,在分布式系统环境中,通过网络(通过硬连线数据链路、无线数据链路、或者硬连线数据链路和无线数据链路的组合)链接的本地计算机系统和远程计算机系统均执行任务。因此,在分布式系统环境中,计算机系统可以包括多个组成计算机系统。在分布式系统环境中,程序模块可以位于本地存储器存储设备和远程存储器存储设备两者中。
本领域技术人员还将理解,本发明可以在云计算环境中被实践。云计算环境可以是分布式的,但是这不是必需的。当是分布式的时,云计算环境可以在组织内国际分布和/或具有跨多个组织的组件。在本描述和所附的权利要求中,“云计算”被定义为这样的模型,该模型用于使得能够进行对可配置计算资源(例如,网络、服务器、存储装置、应用和服务)的共享池进行按需网络访问。“云计算”的定义不限于当被正确地部署时可以从这样的模型中获得的任何其他众多优势。
云计算模型可以包括各种特性,诸如按需自助服务、广域接入、资源池化、快速弹性、可测量服务等。云计算模型也可以以诸如例如软件即服务(“SaaS”)、平台即服务(“PaaS”)和基础设施即服务(“IaaS”)之类的各种服务模型的形式出现。云计算模型也可以使用诸如私有云、共同体云、公共云、混合云等之类的不同的部署模型进行部署。
一些实施例,诸如云计算环境,可以包括具有一个或多个主机的系统,一个或多个主机各自能够运行一个或多个虚拟机。在操作期间,虚拟机模拟操作计算机系统,从而支持操作系统以及可能一个或多个其他应用。在一些实施例中,每个主机包括管理程序,管理程序使用从虚拟机的角度抽象出来的物理资源来模拟针对虚拟机的虚拟资源。管理程序还在虚拟机之间提供适当的隔离。因此,从任何给定虚拟机的角度来看,即使虚拟机仅与物理资源的外观(例如,虚拟资源)交互,管理程序也会给人一种虚拟机正在与物理资源交互的错觉。物理资源的示例包括处理容量、存储器、磁盘空间、网络带宽、媒体驱动程序等。
如图1A所示,每个处理器102包括(除其他外)一个或多个处理单元106(例如,处理器内核),一个或多个处理单元中的每一者从系统存储器103加载并执行机器代码指令(通常经由一个或多个处理器缓存,未示出)。在一些实施例中,(多个)处理器102包括由处理器102提供影子堆栈支持107的硬件和/或微码。基于处理器的影子堆栈支持107的特定功能可以根据设计选择而变化,但是示例功能包括能够分配和保护存储器区域供影子堆栈使用(例如,经由页表映射)、能够在执行程序序言期间将返回地址“推送”到影子堆栈上(例如,作为“调用”指令的执行的一部分)、能够在执行程序尾声期间从影子堆栈“弹出”返回地址(例如,作为“返回”指令的执行的一部分)、能够将从调用堆栈弹出的一个返回地址与从影子堆栈弹出的另一返回地址进行比较(例如,作为“返回”指令的执行的一部分)、和/或能够在从调用堆栈弹出的返回地址与从影子堆栈弹出的返回地址之间存在不匹配时触发异常。然而,可以理解,本文中的实施例可以在没有基于处理器的影子堆栈支持107的情况下实现。例如,影子堆栈支持107的功能可以代替由操作系统提供和/或可以被编译到应用二进制文件的程序序言和尾声中。
如图所示,持久存储装置104存储表示可执行软件组件的计算机可执行指令和/或数据结构;对应地,在(多个)处理器102处执行该软件期间,这些计算机可执行指令和/或数据结构的一个或多个部分被加载到系统存储器103中。例如,持久存储装置104被示出为存储与操作系统108相对应的计算机可执行指令和/或数据结构、一个或多个模块109以及一个或多个应用110。持久存储装置104还存储数据,诸如规则111和日志112。
系统存储器103能够存储各种各样的数据,但是为了图示本文的实施例,系统存储器103被示出为存储至少一个正在运行的应用的代码的至少一部分(即,应用代码110a)以及由该正在运行的应用调用的模块的代码的至少一部分(即,模块代码109a),以及分配给调用堆栈113和影子堆栈114的存储器(包括例如用于正在运行的应用的调用堆栈和影子堆栈)。
图1B图示了根据一些实施例的操作系统108的细节,操作系统108包括促进在模块粒度上强制执行影子堆栈违规的示例组件。可以理解,所描述的组件(包括它们的标识、子组件和布置)仅被呈现为帮助描述本文所描述的操作系统108的各种实施例,并且这些组件不限制于软件和/或硬件如何实现本文描述的各种实施例,或其特定功能。
操作系统108被图示为包括内核115,内核115包括任务管理器116,任务管理器116负责基于(多个)应用110和操作系统108的代码,启动和管理进程(包括一个或多个线程)在(多个)处理器102处的执行。内核115还被示出为包括影子堆栈违规异常处理程序117(以下被称为异常处理程序117),影子堆栈违规异常处理程序117在影子堆栈违规在线程的执行期间被检测到时,处理异常。在一些实施例中,当调用堆栈返回地址与影子堆栈返回地址之间的不匹配被检测到时,异常处理程序117的执行由(多个)处理器102的影子堆栈支持107触发(例如,经由硬件中断)。然而,异常处理程序117可以以其他方式(例如,经由软件中断或异常),诸如通过作为程序尾声的一部分执行并且确定调用堆栈返回地址与影子堆栈返回地址是否匹配的代码被触发。因此,异常处理程序117能够被用于各种各样的环境,包括具有对影子堆栈的硬件支持(例如,影子堆栈支持107)的环境以及缺乏硬件影子堆栈支持的环境(例如,其中诸如经由特殊配置的程序序言和尾声,影子堆栈功能被完全在软件中实现)。
注意,本文对异常处理程序117的描述侧重于当由主应用二进制文件调用的模块引起影子堆栈违规时的异常处理。可以理解,异常处理程序117也可以在其他情形中被调用,诸如当主应用二进制文件本身引起影子堆栈违规时被调用。因此,除了本文描述当由主应用二进制文件调用的模块引起影子堆栈违规时的异常处理之外,异常处理程序117还可以被配置为诸如例如在主应用二进制文件本身引起影子堆栈违规时处理其他情况。因此,可以理解,本文对异常处理程序117的描述不限于本文中具体描述的那些场景和功能。
操作系统108还被示出为包括记录器122以及可能包括规则生成器123。通常,记录器122生成与异常处理程序117的操作相关的日志条目(例如,它们被存储在日志112中)。一般而言,规则生成器123如果存在,则处理日志112,和/或将日志112发送到远程系统进行处理。作为规则生成器123的结果,计算机系统101生成和/或接收可由异常处理程序117使用的规则111。注意,虽然为了便于图示,规则生成器123被描述为作为操作系统108的一部分,但是在一些实施例中,规则生成器123是单独的应用110(例如,系统安全应用,诸如防病毒应用)的一部分。
图1A、图1B的组件的进一步操作现在结合图2A至图2D(其图示了在模块粒度上强制执行影子堆栈违规的示例操作)以及结合图3(其图示了用于在模块粒度上强制执行影子堆栈违规的示例方法300的流程图)和图4(其图示了用于在审计模式下使影子堆栈成为循环堆栈的示例方法400的流程图)来描述。以下讨论涉及多个方法和方法动作。尽管方法动作可以按一定的顺序被讨论或者可以在流程图中被图示为按特定顺序发生,但是除非特别说明或者因为动作被具体描述为与在执行动作之前完成的另一动作相关而需要,否则不需要特定顺序。
首先参考图3,如图所示,方法300包括动作301:基于启用了影子堆栈强制执行的应用二进制文件,在处理器处发起线程的执行。在一些实施例中,动作301包括在处理器处发起线程的执行,包括:发起调用外部模块的第二可执行代码的应用二进制文件的第一可执行代码的执行,应用二进制文件已针对影子堆栈强制执行被启用。例如,在实施例中,任务管理器116在(多个)处理器102处发起应用110中的一个应用的执行。发起执行包括:任务管理器116使针对应用110的应用代码110a被加载到系统存储器103中;创建支持在(多个)处理单元106处执行一个或多个线程的内核数据结构;以及针对这些一个或多个线程中的每个线程创建(或发起创建)调用堆栈(即,在调用堆栈113内)。此外,由于影子堆栈强制执行针对应用的二进制文件被启用,因此发起执行还包括:任务管理器116针对这些一个或多个线程中的每个线程创建(或发起创建)影子堆栈114(即,在影子堆栈114内)。
在更具体的示例中,图2A图示了描述应用二进制文件201的表示的示例200a。虽然二进制文件格式因操作系统而异,但是通常,二进制文件包括描述二进制文件的属性和布局的标头(header)、以及包括应用代码和数据的主体(例如,以文本段、数据段等的形式)。因此,在图2A中,应用二进制文件201被示出为包括标头201a部分和主体201b部分。在实施例中,作为发起应用的二进制文件(例如,应用二进制文件201)的执行的一部分,任务管理器116读取二进制文件的标头(例如,标头201a)以获得二进制文件属性和布局,并且将二进制文件的主体的至少一部分(例如,主体201b)加载到系统存储器103(例如,系统存储器103的至少一部分可以对应于应用代码110a)中。在图2A中,标头201a被示出为包括包含复选标记的复选框。在图2A中,该复选框表示应用二进制文件201是否在被编译时支持的标志或其他指示符,并且请求影子堆栈的强制执行。注意,二进制文件可以被编译为支持影子堆栈(即,二进制文件是影子堆栈感知/兼容的),但是实际上并不请求它们的强制执行(即,二进制文件尚未选择加入影子堆栈强制执行)。因此,虽然标头201a被示出为包括二进制文件指示符(即,复选与否),但是标头201a可以具有更全面的标志/指示符的集合。在示例200a中,由于标头201a包括复选标记,因此影子堆栈强制执行针对应用二进制文件201被启用和/或二进制文件已选择加入影子堆栈强制执行。因此,当任务管理器116发起应用二进制文件201的执行时,任务管理器116针对为该二进制文件创建的任何(多个)线程创建(多个)影子堆栈。图2A示出了任务管理器116已发起针对应用二进制文件201的至少一个线程的执行,因为它创建了与该发起的线程相对应的调用堆栈203和影子堆栈204。注意,在图2B中,调用堆栈203和影子堆栈204向下“增长”;也就是说,新信息被推送到这些堆栈的底部,使得堆栈上的“顶部”项被形象化地示出在调用堆栈203和影子堆栈204的底部处。
在实施例中,当应用二进制文件被加载时,任务管理器116标识由该二进制文件在其执行期间将要访问的任何(多个)模块(例如,基于标头201a中的信息)。图2A描绘了由应用二进制文件201调用的模块202。与应用二进制文件201类似,模块202被示出为包括标头202a部分和主体202b部分。主体202b的代码的至少一部分可以与发起应用二进制文件201的执行结合地或者在一些以后的时间被加载到系统存储器(例如,模块代码109a)中。在图2A中,标头202a被示出为具有空的复选框。因此,由于标头201a在复选框中缺少复选标记,因此模块202不支持影子堆栈强制执行和/或模块尚未选择加入影子堆栈强制执行。然而,由于影子堆栈强制执行针对应用二进制文件201被启用,并且由于模块202的代码在调用堆栈203的上下文内执行,因此计算机系统101在模块202的代码的执行期间也维护影子堆栈204。
注意,与发起针对应用二进制文件201的线程的执行结合,任务管理器116可以存储与影子堆栈强制执行是否针对应用二进制文件201和模块202中的每一者被启用和/或被请求有关的记录(例如,作为内核线程数据结构的一部分)。因此,在一些实施例中,动作301包括与发起线程的执行结合,存储外部模块是否针对影子堆栈强制执行被启用的记录。
图2A示出了调用堆栈203和影子堆栈204在所发起的线程已经被执行至少一段时间之后的状态。例如,调用堆栈203被示出为包括与应用二进制文件201的代码的执行(例如,由于该二进制文件内的内部程序调用)结合被创建的四个堆栈帧203a-203d、以及随后与模块202的代码的执行(例如,由于应用二进制文件201调用模块202内的程序,以及由于模块202调用内部程序)结合被创建的两个堆栈帧203e-203f。这些堆栈帧203a-203f中的每一者被图示为存储对应的返回地址(即,针对堆栈帧203a的返回地址205a、针对堆栈帧203b的返回地址205b、针对堆栈帧203c的返回地址205c、针对堆栈帧203d的返回地址205d、针对堆栈帧203e的返回地址205e、以及针对堆栈帧203f的返回地址205f)。对应地,影子堆栈204也被示出为也以相同的顺序存储这些相同的返回地址205。由于调用堆栈203上的“堆栈”或返回地址与影子堆栈204上的返回地址的“堆栈”匹配,因此如图2A所示,如果堆栈帧203a-203f被从调用堆栈203中弹出,则不会发生影子堆栈违规。
转到图2B,调用堆栈203上的当前“顶部”堆栈帧203f现在包含新的返回地址(即,返回地址205g),它与影子堆栈204上的“顶部”返回地址(即,返回地址205f)不同。由于模块202内的错误,由于模块202的故意ROP行为,或者甚至由于针对模块202的恶意攻击,该新的返回地址205g可能已经被写入堆栈帧203f。转到图2C,堆栈帧203f现在正在被从调用堆栈203中“弹出”(例如,由于在模块202中执行程序尾声)。结果,返回地址205f也被从影子堆栈204中弹出。通过操作影子堆栈逻辑(例如,作为程序尾声的一部分和/或通过(多个)处理器102内的影子堆栈支持107),在返回地址205g与返回地址205f之间检测到不匹配。结果,影子堆栈违规被检测到(例如,通过程序尾声代码和/或通过影子堆栈支持107),从而触发硬件或软件异常。
返回到图3,方法300还包括动作302:基于线程的执行,处理影子堆栈违规302。在一些实施例中,动作301包括:至少基于在处理器处执行线程,处理由从与线程相对应的调用堆栈中弹出的第一返回地址与从与线程相对应的影子堆栈中弹出的第二返回地址之间的不匹配而触发的异常。在示例中,由于由结合图2B和图2C描述的返回地址不匹配而触发的异常,异常处理程序117被调用来处理异常。异常处理程序117被示出为包括可用于处理异常的各种组件。这些组件结合动作303-306来描述,动作303-306在图3中被示出为动作302的子动作。
动作302包括动作303:确定异常通过执行应用二进制文件所调用的模块而被触发。在一些实施例中,动作303包括确定异常由外部模块的第二可执行代码中的指令的执行而引起。例如,异常处理程序117被示出为包括模块标识符118。在实施例中,如果存在,模块标识符118操作用于确定触发异常的模块的标识。
在一些实施例中,模块标识符118通过标识与触发异常的指令的“调用站点”相对应的存储器地址来操作。例如,如果触发指令的指令是程序尾声中的“返回”指令,则与该指令的“调用站点”相对应的存储器地址是“返回”指令被存储在系统存储器中的存储器地址。如果该“返回”指令是执行应用二进制文件(例如,应用二进制文件201)的程序尾声的一部分,则指令的存储器地址将在系统存储器103中的由应用代码110a占用的存储器地址的范围内;在该情况下,模块标识符118将确定调用站点地址是应用二进制文件的一部分。另一方面,如果该“返回”指令是由应用二进制文件(例如,模块202)所调用的模块的程序尾声的一部分,则指令的存储器地址将在系统存储器103中的由模块代码109a占用的存储器地址的范围内;在该情况下,模块标识符118将确定调用站点地址是模块的一部分。
在附加的或备选的实施例中,模块标识符118通过标识与作为触发异常的指令的“目标地址”的存储器地址相对应的存储器地址来操作。例如,如果触发指令的指令是程序尾声中的“返回”指令,则与该指令的“目标地址”相对应的存储器地址是调用堆栈帧中针对该程序所保存的返回地址。如果该保存的返回指令是执行应用二进制文件(例如,应用二进制文件201)的一部分,则指令的存储器地址将在系统存储器103中的由应用代码110a所占用的存储器地址的范围内;在该情况下,模块标识符118将确定目标站点地址是应用二进制文件的一部分。另一方面,如果该保存的返回指令是应用二进制文件所调用的模块(例如,模块202)的一部分,则指令的存储器地址将在系统存储器103中的由模块代码109a所占用的存储器地址的范围内;在该情况下,模块标识符118将确定目标站点地址是模块的一部分。
如所理解的,根据被移除的堆栈帧的性质,模块标识符118可以标识针对调用站点和目标地址两者的同一实体,或者模块标识符118可以标识针对调用站点和目标地址中的每一者的不同实体。例如,模块202内的“返回”指令可以具有模块202内的返回地址作为其目标地址,在这种情况下,调用站点和目标地址两者将对应于同一实体。在另一示例中,模块202内的“返回”指令可以具有应用二进制文件201内的返回地址或者其他实体作为其目标,在这种情况下,调用站点和目标地址将对应于不同实体。
鉴于对模块标识符118的上述讨论,可以理解,在动作302的一些实施例中,确定由外部模块的第二可执行代码中的指令的执行而引起的异常包括确定以下一项或多项:(i)指令的调用站点地址对应于外部模块的第二可执行代码,或者(ii)指令的目标地址对应于外部模块的第二可执行代码。
再次参考图2C的示例,在处理由去除堆栈帧203f而触发的异常期间,在动作303的实施例中,模块标识符118将模块202标识为对应于调用站点地址(即,因为它将是去除程序尾声的模块202的程序尾声)。根据返回地址205g对应于哪个代码(如果存在),在一些实施例中,模块标识符118将目标站点地址标识为对应于模块202、应用二进制文件201、一些其他实体,或者根本不对应于任何实体。
如上所述,异常处理程序117可以在异常不是由模块触发的情况下(例如当主应用二进制文件本身引起影子堆栈违规时)被调用。在这些情况下,异常处理程序117可以通过终止线程、或者通过允许线程继续执行(如果审计模式被启用)来继续强制执行影子堆栈违规。审计模式将在稍后结合动作306来描述。
假设模块在动作303中被标识,则动作302还包括动作304:确定模块是否启用了影子堆栈强制执行。在一些实施例中,动作304包括确定外部模块是否针对影子堆栈强制执行被启用。例如,异常处理程序117被示出为包括影子堆栈强制执行标识符119(以下称为强制执行标识符119)。在实施例中,强制执行标识符119确定在动作303中标识的模块是否启用了影子堆栈强制执行。例如,参考模块202,强制执行标识符119将确定模块202没有启用影子堆栈强制执行(即,因为模块202的标头202a中没有复选标记)。
如结合图2A所讨论的,二进制文件可以在被编译时支持影子堆栈(即,二进制文件是影子堆栈感知/兼容的),但是没有请求影子堆栈强制执行(即,二进制文件尚未选择加入影子堆栈强制执行)。因此,在动作304的一些实施例中,强制执行标识符119确定以下一项或多项:(i)模块是否在被编译时支持影子堆栈,或者(ii)模块是否选择加入影子堆栈强制执行。在一些实施例中,当(i)外部模块针对影子堆栈兼容性而被编译(即,如果没有选择加入或选择退出的选项)时,或者(ii)当外部模块被编译为选择加入影子堆栈强制执行(即,如果有选择加入或选择退出的选项)时,则外部模块针对影子堆栈强制执行被启用。类似地,在一些实施例中,当外部模块未针对影子堆栈兼容性被编译(即,如果没有选择加入或选择退出的选项)时,或者(ii)当外部模块被编译为选择退出影子堆栈强制执行(即,如果有选择加入或选择退出的选项)时,外部模块不会针对影子堆栈强制执行被启用。
在一些实施例中,强制执行标识符119查询在动作303中标识的模块的标头,以确定模块是否针对影子堆栈强制执行被启用。然而,如前所述,在一些实施例中,动作301包括:与发起线程的执行结合,存储外部模块是否针对影子堆栈强制执行被启用的记录。在这些实施例中,确定外部模块是否被启用了影子堆栈强制执行可以包括:强制执行标识符119查询该记录,而不需要实际查看模块标头本身。
在一些实施例中,动作302还包括动作305:标识针对模块的强制执行规则。在一些实施例中,动作305包括至少基于外部模块的标识来标识规则。例如,异常处理程序117被示出为包括规则标识符120。在实施例中,规则标识符120查询规则111以确定是否存在这样的规则,该规则指定异常是否应针对外部模块被允许(即,在这种情况下,线程应被允许继续执行)或者异常是否应针对外部模块被禁止(即,在该情况下,线程应被终止)。在实施例中,规则111基于对影子堆栈违规的先前记录(即,由记录器122)的分析被创建,先前记录涉及在计算机系统101和/或另一计算机系统处的外部模块。在实施例中,规则标识符120进一步基于应用二进制文件的标识(即,除了外部模块的标识之外)来标识规则。因此,在一些实施例中,规则111特定于应用二进制文件和外部模块的特定组合。
动作302还包括动作306:针对模块强制执行影子堆栈违规策略。在一些实施例中,动作306包括:基于已确定外部模块是否针对影子堆栈强制执行被启用,执行终止线程(即,动作306a)或允许线程继续执行(即,动作306b)中的一者。例如,异常处理程序117被示出为包括影子堆栈策略强制执行器(enforcer)121(以下称为策略强制执行器121)。在实施例中,策略强制执行器121根据影子堆栈强制执行是否针对外部模块被启用、在动作305中标识的规则是否指定该影子堆栈违规应被允许、和/或强制执行模式或审计模式是否被启用,终止线程或允许线程继续执行。在一些实施例中,当审计模式被启用时,影子堆栈204中的第二返回地址205f被调用堆栈203中的第一返回地址205g替换,使得影子堆栈违规策略在审计模式下不被强制执行。尽管影子堆栈违规策略在审计模式下未被强制执行,但是审计模式对于记录影子堆栈违规仍然很有用,这将在下文被进一步描述。
如图所示,动作306可以至少基于(i)影子堆栈强制执行针对模块被启用、或者(ii)影子堆栈强制执行针对模块未被启用,但是规则(即,在动作305中被访问)指定了影子堆栈违规不应被允许,调用动作306a来终止线程。例如,如果影子堆栈强制执行针对模块被启用,则模块已请求通过模块强制执行影子堆栈违规,因此策略强制执行器121终止线程。另一方面,如果影子堆栈强制执行针对模块未被启用,则策略强制执行器121可以默认允许线程继续执行,但是如果规则如此指定,则覆盖该默认值;因此,模块可以不针对影子堆栈兼容性被编译(或者可以选择退出影子堆栈强制执行),但是策略强制执行器121仍然可以强制执行由该模块的影子堆栈违规。
另一方面,并且如图所示,动作306可以至少基于(i)影子堆栈强制执行针对模块未被启用(并且没有针对模块的规则)、或者(ii)影子堆栈强制执行针对模块未被启用并且规则指定了影子堆栈违规应被允许,调用动作306b来允许线程继续执行。例如,如果影子堆栈强制执行针对模块未被启用,则策略强制执行器121可以默认允许线程继续执行。此外,规则(即,规则111)可以进一步指定影子堆栈违规应针对模块被允许。因此,在动作306a的一些实施例中,当外部模块针对影子堆栈强制执行未被启用并且规则指定了影子堆栈违规应被允许时,计算机系统允许线程继续执行。
动作306a还示出了线程可以至少基于强制执行模式被启用而被终止,而动作306b还示出了线程可以至少基于审计模式被启用而被允许继续执行。在实施例中,策略强制执行器121以强制执行模式或审计模式来操作,无论是全局的,还是基于每个线程、每个应用二进制文件、和/或每个模块。当在强制执行模式下操作时,策略强制执行器121基于已结合动作306a和动作306b描述的策略,终止线程或者允许其执行。另一方面,当在审计模式下操作时,即使在线程通常根据结合动作306a描述的策略而被终止的情况下,策略强制执行器121也允许线程继续执行。当与记录器122的日志记录组合时,审计模式对于在无需在发生违规时实际终止线程的情况下,通过执行代码(无论是主应用二进制文件内的代码和/或由该应用二进制文件调用的外部模块内的代码)来记录影子堆栈违规是有用的。
方法300还包括动作307:记录异常。例如,记录器122可以将关于异常的一个或多个数据项记录到日志112中。在实施例中,当策略强制执行器121在强制执行模式下操作时和在审计模式下操作时,动作307被执行,但是它可以被配置为在一些情况下避免记录。作为示例,在各种实施例中,记录器122记录调用站点地址、目标地址、外部模块的标识符、线程所属的进程的标识符、线程的标识符、应用二进制文件的标识符、强制执行模式还是审计模式被启用、影子堆栈违规被强制执行还是被允许等中的一者或多者。在实施例中,当记录外部模块的标识符或应用二进制文件的标识符时,记录器122记录到外部模块或应用二进制文件的文件系统路径。在一些实施例中,记录器122通过删除或混淆个人身份信息,诸如与用户的主目录或简档目录相对应的路径部分来在这些情况下保护用户隐私。
如前所述,规则生成器123(如果存在)处理日志112和/或将日志112发送到远程系统进行处理,以生成和/或接收可由异常处理程序117使用的规则111。如前所述,规则标识符120(如果存在)查询这些规则111,以基于外部模块的标识(可以与应用二进制文件的标识组合)来确定异常是否应针对外部模块被允许。规则生成器123(连同所涉及的任何(多个)远程系统)可以使用各种各样的技术处理日志112来生成规则111,包括使用任何适当的机器学习技术。在实施例中,规则生成器123可以基于标识频繁(或不频繁)引起影子堆栈违规的模块、标识频繁(或不频繁)引起影子堆栈违规的应用/模块组合、标识所允许的影子堆栈违规后来引起线程崩溃的情况、标识在所允许的影子堆栈违规之后观察到可疑行为的情况等来生成规则。
因此,本文中的实施例在模块粒度上、而不是在整个线程(或进程)的粒度上强制执行影子堆栈违规。因此,本文中的实施例不是简单地在线程的堆栈上检测到影子堆栈违规时终止线程/进程,而是执行检查来确定在外部模块的执行期间是否发生了影子堆栈违规,并且如果是,则影子堆栈强制执行是否针对该模块被启用。如果在模块的执行期间发生了影子堆栈违规并且如果影子堆栈强制执行针对该模块被启用,则实施例将继续终止线程(或其所属的进程)。但是,如果影子堆栈强制执行针对该模块未被启用,则一些实施例选择允许线程继续执行,而不是像通常那样将其终止。在模块粒度(而不是线程/进程粒度)上强制执行影子堆栈违规可以提高计算机系统的整体安全性,并且增加影子堆栈技术的采用。例如,本文中的实施例不是需要由于应用与触发影子堆栈违规的模块交互而禁用该应用上的影子堆栈强制执行,而是在允许由所调用的模块代码的影子堆栈违规的同时,针对应用的代码强制执行影子堆栈违规。这样,即使应用调用了有意篡改返回地址的外部模块或者尚未与影子堆栈兼容的外部模块,影子堆栈强制执行也可以针对应用被启用。因此,本文中的实施例允许对应用使用影子堆栈强制执行,即使在以前由于应用所依赖的(多个)模块或由于应用执行的环境而不切实际的情况下也是如此。
注意,当影子堆栈强制执行特征在生态系统内被启用时,需要执行代码才能以预期的方式利用其调用堆栈;否则,该代码可能会引起致命的系统错误,诸如“蓝屏”、内核崩溃等。但是,并非所有代码当前都与影子堆栈功能兼容。为了确保生态系统和/或驱动程序与影子堆栈功能兼容,审计模式可以被启用来获取与哪些代码在影子堆栈强制执行被启用时中断有关的遥测数据。在实施例中,当影子堆栈不匹配发生时,CPU发布异常(例如,控制保护异常)。在审计模式下,当异常被发布时,代替强制执行任何策略,影子堆栈中的不匹配条目被替换为调用堆栈中的条目,并且报告遥测数据可以被生成(包括例如应用二进制文件标识符、来自调用堆栈的回溯跟踪信息、来自影子堆栈的回溯跟踪信息等中的一个或多个)。应用二进制文件标识符的示例包括(但不限于)文件名、二进制文件的特定部分的哈希值、应用二进制文件的嵌入式版本元数据、和/或它们的组合。开发人员然后可以利用该遥测数据来改进影子堆栈兼容性,将应用二进制文件标识符添加到影子堆栈块列表等。因此,与影子堆栈的不兼容可以在审计模式下被捕获。
但是,特定影子堆栈不兼容的软件程序,诸如(但不限于)特定游戏,行为不同,使得返回地址的不匹配无法简单地通过将影子堆栈中的返回地址替换为调用堆栈中的返回地址被缓解。例如,当一些不兼容的软件程序在没有对应的返回的情况下连续执行调用时,许多地址被同时推送到调用堆栈和影子堆栈两者上。再例如,一些不兼容的软件程序手动调整它们自己的调用堆栈,诸如以允许更多重复的函数调用。由于这样的现象不会触发CPU发布传统的控制保护异常,因此影子堆栈可能会溢出其被分配的存储器缓冲区并且引起致命的系统错误。
作为另一示例,软件程序(其不知道影子堆栈)可以自我管理其调用堆栈(包括返回地址)来避免深度递归,从而引起调用堆栈耗尽被分配给调用堆栈的存储器区域。在一些情况下,软件程序可以重复使用类似“调用”的指令(例如,函数调用),这些指令也在不干预类似“ret”的指令的情况下使用影子堆栈。由于类似“ret”的指令被配置为弹出和验证影子堆栈中的条目,因此在没有类似“ret”的指令的情况下这样的类似“调用”的指令将引起影子堆栈继续增长。当这样的类似“调用”的指令或函数调用过多时,它们的返回可能会引起影子堆栈耗尽(也被称为“影子堆栈溢出”)。当发生影子堆栈溢出时,可能会发生致命的CPU异常。本文中描述的实施例防止了致命的CPU异常,即使它可能意味着损坏影子堆栈(通过使其的一部分循环)。再例如,软件程序不使用“ret”指令,而是使用分支指令来从函数调用返回。在这样的情况下,对应的返回地址不会从影子堆栈中弹出,并且也可能发生影子堆栈溢出。
为了解决由影子堆栈溢出引起的问题,并且为了在审计模式下安全地启用影子堆栈功能,本文中描述的至少一些实施例涉及这样的方法、系统和计算机程序产品,该方法、系统和计算机程序产品在审计模式下将影子堆栈的至少一部分启用为循环堆栈,使得当影子堆栈的使用量已经达到所限定的使用量阈值时,影子堆栈的至少一部分中的内容被覆写。因此,在审计模式下,计算机系统能够在防止影子堆栈溢出被分配给影子堆栈的存储器区域的同时获取当前不适用于影子堆栈的特定应用二进制文件(诸如但不限于特定驱动程序)上的数据。
图4图示了在审计模式下使影子堆栈成为循环堆栈的示例方法400的流程图。方法400包括在处理器处发起线程的执行(动作410)。在一些实施例中,动作410包括发起应用二进制文件的可执行代码的执行作为线程的一部分(动作412)以及在审计模式下启用线程的影子堆栈功能(动作414)。例如,在实施例中,图1B的任务管理器116在(多个)处理器102处发起应用110中的一个应用的执行。发起执行包括:任务管理器116使针对应用110的应用代码110a被加载到系统存储器103中,创建支持在(多个)处理单元106处执行一个或多个线程的内核数据结构、以及针对这些一个或多个线程中的每一者创建(或发起创建)调用堆栈(即,在调用堆栈113内)。在一些实施例中,审计模式默认被启用。在审计模式期间,影子堆栈功能被启用。由于影子堆栈功能针对应用的二进制文件被启用,因此发起执行还包括任务管理器116针对这些一个或多个线程中的每一者创建(或发起创建)影子堆栈114。
在更具体的示例中,图2A图示了描述应用二进制文件201的表示的示例200a。虽然二进制文件格式因操作系统而异,但是通常,二进制文件包括描述二进制文件的属性和布局的标头、以及包括应用代码和数据的主体(例如,以文本段、数据段等的形式)。因此,在图2A中,应用二进制文件201被示出为包括标头201a部分和主体201b部分。在实施例中,作为发起执行应用的二进制文件(例如,应用二进制文件201)的一部分,任务管理器116读取二进制文件的标头(例如,标头201a)来获得二进制文件属性和布局,并且将二进制文件主体的至少一部分(例如,主体201b)加载到系统存储器103中(例如,其中至少一部分可以对应于应用代码110a)。图2A示出了在任务管理器116已经发起了针对应用二进制文件201的至少一个线程的执行之后的状态、以及在它创建了与所发起的线程相对应的调用堆栈203和影子堆栈204之后的状态。注意,在图2B中,调用堆栈203和影子堆栈204向下“增长”;也就是说,新信息被推送到这些堆栈的底部,使得堆栈上的“顶部”项被形象化地示出在调用堆栈203和影子堆栈204的底部处。
图2A示出了调用堆栈203和影子堆栈204在所发起的线程已执行至少一段时间之后的状态。例如,调用堆栈203被示出为包括与执行应用二进制文件201的代码(例如,由于该二进制文件中的内部程序调用)结合而创建的四个堆栈帧203a-203d、以及随后与执行模块202的代码结合而创建的两个堆栈帧203e-203f(例如,由于应用二进制文件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中弹出,则不会发生影子堆栈违规。
转到图2B,调用堆栈203上的当前“顶部”堆栈帧203f现在包含新的返回地址(即,返回地址205g),它与影子堆栈204上的“顶部”返回地址(即,返回地址205f)不同。由于模块202内的错误,由于模块202的故意ROP行为,或者甚至由于针对模块202的恶意攻击,该新的返回地址205g可能已经被写入堆栈帧203f。通过操作影子堆栈逻辑或功能(例如,作为程序尾声的一部分和/或通过(多个)处理器102内的影子堆栈支持107),在返回地址205g与返回地址205f之间检测到不匹配。结果,影子堆栈违规被检测到(例如,通过程序尾声代码和/或通过影子堆栈支持107),从而触发硬件或软件异常(诸如控制保护异常)。
返回到图4,在一些实施例中,在审计模式中处理影子堆栈违规(动作430)包括用调用堆栈中的返回地址替换影子堆栈中的返回地址(动作432)。例如,在审计模式下,当异常通过调用堆栈203中的与线程相对应的第一返回地址205g与影子堆栈204中的与同一线程相对应的第二地址205f之间的不匹配被触发时,影子堆栈204中的第二返回地址205f被替换为第一返回地址205g。因此,违规不会在审计模式下被强制执行。但是,与异常相关联的遥测数据仍可以在审计模式下被记录。在一些实施例中,在审计模式下处理异常(动作430)还包括记录以下至少一项:(1)线程所属的进程的标识,(2)线程的标识符,或者(3)应用二进制文件的标识符(动作436)。在一些实施例中,应用二进制文件是设备驱动程序。应用二进制标识符的示例包括(但不限于)文件名、二进制文件的特定部分的哈希值、应用二进制文件的嵌入式版本元数据、和/或它们的组合。
如上所述,尽管将影子堆栈中的不匹配的条目替换为调用堆栈中的条目可以捕获与内核影子堆栈的不兼容,但该机制不能处理影子堆栈溢出。例如,当特定软件程序(诸如(但不限于)特定游戏)正在审计模式下运行时,它们可能会连续执行调用,从而将地址推送到调用堆栈和影子堆栈两者上。在一些情况下,软件程序具有手动检查调用堆栈是否接近其结束的指令,以防止调用堆栈超出其被分配的空间。当调用堆栈接近其结束时,应用可以手动开始使用其自身堆栈的早期部分。在一些情况下,应用可能无法使用标准方法来正确地展开堆栈,并且因此影子堆栈将继续增长,从而引起影子堆栈溢出。例如,代替使用“ret”指令,软件程序可以使用分支指令来返回到函数的调用方。在这样的情况下,影子堆栈上的对应的返回地址不会被弹出,从而每次有效地“泄漏”一个影子堆栈位置,并且影子堆栈溢出可能发生。
为了解决由影子堆栈溢出引起的问题,本文中描述的至少一些实施例在审计模式下将影子堆栈的至少一部分启用为循环堆栈(动作420),使得当影子堆栈的使用量已经达到所限定的使用量阈值时,影子堆栈的至少一部分中的内容被覆写。在一些实施例中,方法400还包括确定影子堆栈的使用量是否已经达到所限定的使用量阈值(动作422)。响应于确定影子堆栈的使用量已经达到所限定的使用量阈值,影子堆栈的一个或多个条目被覆写,从而防止影子堆栈溢出被分配给影子堆栈的存储器区域(动作424)。在一些实施例中,标志(例如,布尔值)被设置来指示影子堆栈的至少一个条目是否已被覆写。当标志指示影子堆栈的至少一个条目已被覆写时,则可以理解,影子堆栈的至少一部分已被损坏;因此,影子堆栈的至少一部分中包含的数据不能用于强制执行目的。
在一些实施例中,在影子堆栈违规的处理期间执行检查影子堆栈是否已经达到所限定的阈值。图5图示了方法500的示例的流程图,方法500用于在影子堆栈违规的处理期间检查影子堆栈是否已经达到所限定的阈值,这对应于图4中的在审计模式下对影子堆栈违规进行处理的动作430。如图5所示,当影子堆栈违规由调用堆栈中的第一地址与影子堆栈中的第二地址之间的不匹配触发时,接收到异常(动作510)。响应于在审计模式下接收到异常和影子堆栈中的第二地址,方法500包括:用第一返回地址替换影子堆栈中的第二返回地址(动作510)。方法500还包括:将影子堆栈的至少一部分启用为循环堆栈(动作530),以及确定影子堆栈的使用量是否已经达到所限定的使用量阈值(动作540)。响应于确定影子堆栈的使用量已经达到所限定的使用量阈值,对影子堆栈的一个或多个条目进行覆写,从而防止影子堆栈溢出被分配给影子堆栈的存储器区域(动作550)。在一些实施例中,无论影子堆栈是否被覆写,与线程相关联的遥测数据均被记录(动作560)。这样的遥测数据包括(但不限于):(1)线程所属的进程的标识、(2)线程的标识符、和/或(3)应用二进制文件的标识符。在一些实施例中,应用二进制文件是设备驱动程序。应用二进制文件标识符的示例包括(但不限于)文件名、二进制文件的特定部分的哈希值、应用二进制文件的嵌入式版本元数据、和/或它们的组合。
在一些实施例中,影子堆栈基于被分配给影子堆栈的存储器区域的大小包括针对返回地址的条目的最大数目的空间。返回地址的一个或多个条目被输入最大数目的顺序空间当中的一个或多个空间中,直到影子堆栈的使用量达到所限定的使用量阈值。
图2D图示了影子堆栈220的示例(例如,其对应于图2A至图2C的影子堆栈204)。存储器区域被分配给影子堆栈220,这允许影子堆栈220存储最大数目M个返回地址条目,其中M是自然数。如图所示,第一空间221被示出在影子堆栈220的顶部处,并且最后一个空间(即,第M空间231)被示出在影子堆栈220的底部处。如图所示,影子堆栈220向下生长;也就是说,新生成的返回地址被推送到影子堆栈220的下侧。例如,第一生成的返回地址215a被存储在第一空间221处,第二生成的返回地址215b被存储在第二空间222处,第(N-1)返回地址215c被存储在第(N-1)空间223处,依此类推。
在一些实施例中,确定影子堆栈的使用量已经达到所限定的使用量阈值包括确定影子堆栈中的返回地址的条目数已经达到(例如,等于或大于)预定极限(也称为“第一预定极限”)。例如,如图所示,第一预定极限是P,其中P是自然数。当返回地址的条目被存储在影子堆栈220中的第P空间227中时,例如,当第P空间被返回地址215g或215k填充时,确定影子堆栈220的使用量已经达到所限定的使用量阈值。
在一些实施例中,确定影子堆栈的使用量已经达到所限定的使用量阈值包括:确定影子堆栈中的返回地址的条目的数目与针对影子堆栈中的条目的空间的最大数目M之间的比值大于预定极限(也被称为第二预定极限)。例如,在一些实施例中,第二预定极限是80%。如果最大数目M=512,则P=80%×512≈409。因此,当返回地址的条目被存储在影子堆栈220的第409空间中时,确定影子堆栈的使用量已经达到所限定的使用量阈值。
在一些实施例中,确定影子堆栈的使用量已经达到所限定的使用量阈值包括确定影子堆栈220中最大数目M的空间当中的可用空间数目低于预定极限(也称为“第三预定极限”)。例如,在一些实施例中,第三预定极限=100。如果最大数目M=512,则P=512–100=412。因此,当返回地址的条目被存储在影子堆栈220的第412空间中时,确定影子堆栈的使用量已经达到所限定的使用量阈值。
在一些实施例中,被存储在特定编号的空间(例如,N)中的现有条目首先被覆写,其中N是自然数,并且N<P。例如,第(P+1)返回地址215h将被存储在现有条目215d先前已经被输入的第N空间224中;第(P+2)返回地址215i将被存储在先前已输入现有条目215e的第(N+1)空间225处,依此类推,直到再次到达第P空间。如图所示,当返回地址215k对第P空间中的返回地址215g进行覆写时,影子堆栈的使用量已经再次达到了所限定的使用量阈值。在这样的情况下,循环堆栈232将再次循环,并且循环堆栈232中的返回地址的一个或多个现有条目将再次被一个或多个新条目覆写。例如,返回地址215l(在返回地址215k之后)将被再次存储在第N空间中,从而对第N空间中的当前被存储的返回地址215h进行覆写;返回地址215m(在返回地址215l之后)将被再次存储在第(N+1)空间中,从而对第N空间中的当前被存储的返回地址215i进行覆写。该过程可以重复,并且被存储在第N空间与第P空间之间(并且包括第N空间与第P空间)的空间中的返回地址可以根据需要被覆写多次,使得第N空间与第P空间之间(并且包括第N空间与第P空间)的空间形成循环堆栈232。
在一些实施例中,计算机系统的操作系统被配置为将影子堆栈的至少一部分启用为循环堆栈。在一些实施例中,CPU被配置为允许特权指令直接设置活动(active)的影子堆栈的下一影子堆栈位置,将其设置为N。在一些实施例中,CPU可以利用影子堆栈结束地址来配置,并且在将值推送到影子堆栈时产生异常,从而写入到结束地址。在一些实施例中,CPU可以利用影子堆栈结束地址和影子堆栈循环起始地址来配置。在这样的实施例中,不同于在影子堆栈溢出时引起异常,CPU可以设置用于在仍然在影子堆栈不匹配方面引起异常的同时,指示影子堆栈的至少一个条目是否已被覆写的标志(例如,布尔值)。
在一些实施例中,循环堆栈232的起点N和/或循环堆栈232的终点P是预定的数目。在一些实施例中,循环堆栈232的起点N和/或循环堆栈232的终点P基于影子堆栈220的起点N与最大空间M之间的比值N/M和/或影子堆栈220的终点P与最大空间M之间的比值P/M。在一些实施例中,起点N和/或终点P可以在数目的范围内被随机地选择。
如图2D所示,循环堆栈232的起点N可以是影子堆栈中的任何点。在一些实施例中,起始部分(从第1条目到第(N-1)条目)被保留,即,不被覆写。保留影子堆栈220的起始部分是有利的,因为起始部分可以提供与已发生的事情有关的更有用的信息。
在一些实施例中,第三预定极限和/或终点P基于可以在特定事件发生时被同时输入影子堆栈中的返回地址的条目的最大数目被确定。例如,当发生拦截时,可能基本上同时生成多达30个返回地址。因此,为了防止影子堆栈溢出发生,在循环堆栈232的终点P之后应该留出至少30个空间,即,M-P>30。在一些实施例中,出于谨慎考虑,在循环点的终点P之后留下约100个空间,即,M-P>100;因此,几乎可以肯定的是,影子堆栈永远不会溢出。在一些实施例中,统计数据可以被收集用于确定可以在影子堆栈中被同时输入的返回地址的最大数目,并且P基于所收集的统计数据被确定。
只要影子堆栈不溢出,计算机系统就可以继续收集和记录与线程相关联的遥测数据。再次返回到图4,在一些实施例中,响应于对影子堆栈的一个或多个当前被使用的条目进行覆写,与线程相关联的一个或多个遥测数据被记录(动作426)。在一些实施例中,一个或多个遥测数据包括(但不限于):(1)线程所属的进程的标识、(2)线程的标识符、和/或(3)应用二进制文件的标识符(动作426)。在一些实施例中,应用二进制文件是设备驱动程序。应用二进制文件标识符的示例包括(但不限于)文件名、二进制文件的特定部分的哈希值、应用二进制文件的嵌入式版本元数据、和/或它们的组合。
尽管主题已经以特定于结构特征和/或方法动作的语言被描述,但是应理解,所附的权利要求中所限定的主题不一定限于上述描述的特征或动作、或者上述动作的顺序。相反,所描述的特征和动作被公开为实现权利要求的示例形式。
本发明可以在不脱离其精神或本质特征的情况下以其他具体形式被体现。所描述的实施例在所有方面都应被视为仅是例示性的,而不是限制性的。本发明的范围因此由所附的权利要求而不是前述的说明书指示。在权利要求的含义和等同范围内的所有变更均应被涵盖其范围内。当在所附的权利要求中引入元素时,冠词“一”、“一个”、“该”和“所述”旨在表示存在这些元素中的一个或多个元素。术语“包括”、“包含”和“具有”旨在是包容性的,并且意指可以存在除了所列的元素之外的其他元素。

Claims (10)

1.一种计算机系统,包括:
处理器;以及
计算机可读硬件存储设备,在其上已经存储有计算机可执行指令,所述计算机可执行指令能够由所述处理器执行,用于将所述计算机系统配置为在审计模式下安全地启用影子堆栈功能,所述计算机可执行指令包括能够由所述处理器执行以将所述计算机系统配置为至少执行以下的指令:
在所述处理器处发起线程的执行,所述线程的所述执行包括:
发起应用二进制文件的可执行代码的执行作为所述线程的一部分;以及
在所述审计模式下,启用针对所述线程的影子堆栈功能;以及
至少基于所述线程在所述审计模式下在所述处理器处的执行,将影子堆栈的至少一部分启用为循环堆栈;
确定所述影子堆栈的使用量是否已经达到所限定的使用量阈值;以及
响应于确定所述影子堆栈的使用量已经达到所限定的所述使用量阈值,对所述影子堆栈的一个或多个当前被使用的条目进行覆写,从而防止所述影子堆栈溢出被分配给所述影子堆栈的存储器区域。
2.根据权利要求1所述的计算机系统,其中确定所述影子堆栈的使用量是否已经达到所限定的所述使用量阈值响应于检测到由调用堆栈中的第一地址与所述影子堆栈中的与所述第一地址相对应的第二地址之间的不匹配触发的影子堆栈违规而被执行。
3.根据权利要求1所述的计算机系统,其中响应于对所述影子堆栈的一个或多个当前被使用的条目进行覆写,所述计算机系统还被配置为记录与所述线程相关联的一个或多个遥测数据。
4.根据权利要求3所述的计算机系统,其中与所述线程相关联的所述一个或多个遥测数据包括以下至少一项:
所述线程所属的进程的标识符,
所述线程的标识符,
与所述线程相关联的应用二进制文件的标识符。
5.根据权利要求1所述的计算机系统,其中所述计算机系统还被配置为:
在所述处理器处发起第二线程的执行,所述第二线程的所述执行包括:
发起所述应用二进制文件的可执行代码的执行作为所述线程的一部分;
在强制执行模式下,启用针对所述线程的影子堆栈功能;以及
避免将所述影子堆栈的任何部分启用为循环堆栈。
6.根据权利要求1所述的计算机系统,其中将所述影子堆栈启用为循环堆栈还包括:确定所述审计模式在将所述影子堆栈的至少一部分启用为循环堆栈之前被启用。
7.根据权利要求1所述的计算机系统,其中所述影子堆栈基于被分配给所述影子堆栈的所述存储器区域的大小包括针对条目的最大数目的空间,并且返回地址的一个或多个条目被输入所述最大数目的空间当中的一个或多个顺序空间中,直到所述影子堆栈的使用量已经达到所限定的所述使用量阈值。
8.根据权利要求6所述的计算机系统,其中确定所述影子堆栈的使用量已经达到所限定的所述使用量阈值包括:确定所述影子堆栈中的返回地址的条目的第一数目已经达到第一预定极限。
9.根据权利要求7所述的计算机系统,其中确定所述影子堆栈的使用量已经达到所限定的所述使用量阈值包括:确定所述影子堆栈中的返回地址的条目的第一数目与针对条目的空间的所述最大数目之间的比值大于第二预定极限。
10.根据权利要求7所述的计算机系统,其中确定所述影子堆栈的使用量已经达到所限定的所述使用量阈值包括:确定所述影子堆栈中的所述最大数目的空间当中的可用空间的第二数目小于第三预定极限。
CN202280042717.5A 2021-06-19 2022-05-12 审计模式下的循环影子堆栈 Pending CN117501244A (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US17/352,283 2021-06-19
US17/352,283 US11861364B2 (en) 2020-03-24 2021-06-19 Circular shadow stack in audit mode
PCT/US2022/028891 WO2022265762A1 (en) 2021-06-19 2022-05-12 Circular shadow stack in audit mode

Publications (1)

Publication Number Publication Date
CN117501244A true CN117501244A (zh) 2024-02-02

Family

ID=81927417

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202280042717.5A Pending CN117501244A (zh) 2021-06-19 2022-05-12 审计模式下的循环影子堆栈

Country Status (3)

Country Link
EP (1) EP4356247A1 (zh)
CN (1) CN117501244A (zh)
WO (1) WO2022265762A1 (zh)

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7617383B2 (en) * 2006-02-16 2009-11-10 Vns Portfolio Llc Circular register arrays of a computer
US9501637B2 (en) * 2014-09-26 2016-11-22 Intel Corporation Hardware shadow stack support for legacy guests

Also Published As

Publication number Publication date
EP4356247A1 (en) 2024-04-24
WO2022265762A1 (en) 2022-12-22

Similar Documents

Publication Publication Date Title
US10664592B2 (en) Method and system to securely run applications using containers
EP2659421B1 (en) Application execution in a restricted application execution environment
US7430760B2 (en) Security-related programming interface
US8910155B1 (en) Methods and systems for injecting endpoint management agents into virtual machines
US11709931B2 (en) Shadow stack violation enforcement at module granularity
US10101915B2 (en) Methods and apparatus to manage inter-virtual disk relations in a modularized virtualization topology using virtual hard disks
US9928010B2 (en) Methods and apparatus to re-direct detected access requests in a modularized virtualization topology using virtual hard disks
US10171502B2 (en) Managed applications
WO2014181197A2 (en) Mobile information management methods and systems
CN109784039B (zh) 移动终端安全运行空间的构建方法、电子设备、存储介质
US11861364B2 (en) Circular shadow stack in audit mode
US9804789B2 (en) Methods and apparatus to apply a modularized virtualization topology using virtual hard disks
US10223526B2 (en) Generating packages for managed applications
US10884764B1 (en) Optimizing managed runtime applications for serverless environments
CN107636667B (zh) 在设备中创建多个工作空间的系统及方法
EP3356983B1 (en) Multi-tenant environment using pre-readied trust boundary components
CN115362433A (zh) 用于动态代码的影子堆栈强制范围
CN117501244A (zh) 审计模式下的循环影子堆栈
CN108241801B (zh) 处理系统调用的方法和装置
Umar et al. A Comparative Study of Modern Operating Systems in terms of Memory and Security: A Case Study of Windows, iOS, and Android
US10126983B2 (en) Methods and apparatus to enforce life cycle rules in a modularized virtualization topology using virtual hard disks
US20210263858A1 (en) Memory protection in hypervisor environments
US20170315827A1 (en) Merging application configurations to enhance multi-layer performance
CN115136133A (zh) 按需代码执行的单次使用执行环境
CN110795164B (zh) 应用封装方法、装置及应用运行方法、装置

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