首页 / 专利库 / 天文学 / 虫洞 / 具有非可读页的存储器保护

具有非可读页的存储器保护

阅读:945发布:2020-09-07

专利汇可以提供具有非可读页的存储器保护专利检索,专利查询,专利分析的服务。并且在各种实现方式中,一种方法包括:规定用于仅执行 访问 的 存储器 区域,将一组指令存储在存储器区域中,执行该组指令之中的早期指令,以及执行该组指令之中的一组后续指令。早期指令将秘密值加载到易失性寄存器中。后续指令的正确执行取决于加载到易失性寄存器中的秘密值。在各种实现方式中,系统包括存储器和具有一个或多个易失性寄存器的处理器。处理器规定对存储器的部分进行访问。响应于执行存储在存储器的仅执行部分中的程序,处理器能够将秘密值加载到易失性寄存器中。处理器被配置为响应于异步事件而丢失加载在易失性寄存器中的信息。,下面是具有非可读页的存储器保护专利的具体信息内容。

1.一种存储计算机指令以用于执行的方法,所述方法包括:
规定用于仅执行访问存储器区域;
将一组指令存储在所述存储器区域中;
执行所述一组指令之中的早期指令,其中,执行所述早期指令包括将秘密值加载到易失性寄存器中;以及
执行所述一组指令之中的一组后续指令,其中,所述后续指令的正确执行取决于被加载到所述易失性寄存器中的所述秘密值。
2.根据权利要求1所述的方法,其中,所述一组指令包括被配置为阻止以下中的一个或多个的一组事务性指令:
不按顺序执行所述一组指令;或者
部分执行所述一组指令。
3.根据权利要求1或2所述的方法,其中,所述秘密值包括非规范地址,并且其中,所述易失性寄存器包括堆栈指针
4.根据权利要求3所述的方法,其中,所述后续指令被配置为使得所述处理器执行到基于所述堆栈指针中的秘密值的地址的间接跳转。
5.根据权利要求4所述的方法,其中,所述后续指令被配置为在加载所述秘密值之后且在所述间接跳转之前的时间段期间不干扰所述堆栈指针。
6.根据权利要求3-5中任一项所述的方法,包括:
保留所述堆栈指针中的秘密值,直到对于正确执行所述后续指令不再需要所述秘密值为止。
7.根据权利要求1-6中任一项所述的方法,其中,所述一组指令被配置为使得所述处理器禁用以下中的一个或多个:
中断;或者
断点。
8.根据权利要求1-7中任一项所述的方法,其中,规定所述存储器区域包括:
将所述存储器区域限制为在以下情况下执行:Ring 0访问特权、CPL0保护级别、或其它监督模式。
9.根据权利要求1-8中任一项所述的方法,其中,将所述秘密值加载到所述易失性寄存器中包括:
将立即值加载到所述易失性寄存器中。
10.根据权利要求1-9中任一项所述的方法,其中,执行所述一组后续指令包括将所述秘密值变换为有效地址。
11.根据权利要求1-10中任一项所述的方法,其中,执行所述一组后续指令包括:
从所述易失性寄存器中擦除所述秘密值。
12.根据权利要求1-11中任一项所述的方法,其中:
执行所述一组后续指令包括根据加载在所述易失性寄存器中的所述秘密值对地址进行解码。
13.根据权利要求1-12中任一项所述的方法,其中:
执行所述一组后续指令包括执行到至少基于加载在所述易失性寄存器中的所述秘密值的地址的跳转。
14.根据权利要求1-13中任一项所述的方法,其中:
执行所述一组后续指令包括具有至少基于加载在所述易失性寄存器中的所述秘密值的地址的至少一个MOV指令。
15.根据权利要求1-14中任一项所述的方法,其中:
存储在所述易失性寄存器中的所述秘密值包括存储器视图索引;以及
所述处理器被配置为响应于执行VMFUNC指令而至少基于所述存储器视图索引切换到存储器视图。
16.根据权利要求1-15中任一项所述的方法,其中:
存储在所述易失性寄存器中的所述秘密值包括密钥;以及
所述处理器被配置为执行至少基于所述密钥的密码功能。
17.根据权利要求1-16中任一项所述的方法,其中,规定所述存储器区域包括由处理器将对于扩展页表的访问许可设置为以下中的一个:
仅执行许可,或者
仅监督程序执行许可。
18.根据权利要求1-17中任一项所述的方法,其中,规定所述存储器区域包括由处理器将对于扩展页表的访问许可设置为排除:读取访问和写入访问。
19.根据权利要求1-18中任一项所述的方法,其中,规定所述存储器区域包括防止操作系统读取所述存储器区域,其中,所述防止是由执行所述操作系统的处理器执行的。
20.根据权利要求1-19中任一项所述的方法,其中,所述存储器区域包括这样的存储器:对于所述存储器一组连续的虚拟存储器地址被映射到一组不连续的机器存储器地址。
21.根据权利要求20所述的方法,包括:
维护从所述虚拟存储器地址到所述机器存储器地址的映射,其中
维护所述映射是由管理程序执行的,
所述管理程序以vmx-root ring-0访问特权来执行,
操作系统调用所述一组指令,以及
所述操作系统是由所述管理程序支持的,并且在比Ring 0更受限制的访问保护的情况下执行。
22.根据权利要求21所述的方法,其中:
规定所述存储器区域是由所述管理程序执行的;以及
所述一组指令是在由所述管理程序支持的软件中的指令之中的。
23.根据权利要求1-22中任一项所述的方法,其中,所述秘密值指示虫洞地址。
24.根据权利要求1-23中任一项所述的方法,其中,所述一组指令被配置为使得所述处理器将关于所述秘密值的信息仅存储在被保护免受攻击方代码的存储器中。
25.一种用于存储计算机指令的系统,所述系统包括:
存储器;以及
包括至少一个易失性寄存器的处理器,其中
所述处理器被配置为规定对所述存储器的部分进行访问,
所述处理器被配置为执行存储在所述存储器的第一部分中的第一组指令,所述第一组指令被配置为使得所述处理器将秘密值加载到所述易失性寄存器中,以及所述处理器被配置为响应于异步事件而丢失加载在所述易失性寄存器中的信息。
26.根据权利要求25所述的系统,其中,所述存储器的第一部分被规定具有仅执行访问。
27.根据权利要求25或权利要求26所述的系统,包括:
存储介质,其包括能够由所述处理器执行的指令,并且所述指令被配置为使得所述处理器
将所述第一组指令存储在所述存储器的第一部分中,以及
规定所述存储器的第一部分作为仅执行存储器。
28.根据权利要求25-27中任一项所述的系统,其中:
所述第一组指令之中的一个或多个早期指令被配置为使得所述处理器将所述秘密值加载到所述易失性寄存器中;以及
所述第一组指令之中的一个或多个后续指令对于正确执行取决于所述秘密值。
29.根据权利要求28所述的系统,其中,所述第一组指令包括一组事务性指令,其被配置为阻止以下中的一个或多个:
不按顺序执行所述一组指令;或者
部分执行所述一组指令。
30.根据权利要求25-29中任一项所述的系统,其中,所述秘密值包括非规范地址,并且其中,所述易失性寄存器包括堆栈指针。
31.根据权利要求30所述的系统,其中,所述后续指令被配置为使得所述处理器执行到基于所述堆栈指针中的秘密值的地址的跳转。
32.根据权利要求31所述的系统,其中,所述后续指令被配置为避免在所述秘密值被加载之后且在所述跳转之前的时间段期间干扰所述堆栈指针。
33.根据权利要求30-32中任一项所述的系统,其中,所述后续指令被配置为使得所述处理器保留所述堆栈指针中的秘密值,直到对于正确执行所述后续指令不再需要所述秘密值为止。
34.根据权利要求25-33中任一项所述的系统,其中,所述第一组指令被配置为使得所述处理器禁用以下中的一个或多个:
中断;或者
断点。
35.根据权利要求25-34中任一项所述的系统,其中,所述处理器被配置为将所述存储器的第一部分限制为在以下情况下执行:Ring 0访问特权、或CPL0保护级别、或其它监督模式。
36.根据权利要求25-35中任一项所述的系统,其中,所述第一组指令被配置为使得所述处理器将立即值加载到所述易失性寄存器中。
37.根据权利要求25-36中任一项所述的系统,其中,所述第一组指令被配置为使得所述处理器将所述秘密值变换为有效地址。
38.根据权利要求25-37中任一项所述的系统,其中,所述第一组指令被配置为使得所述处理器从所述易失性寄存器中擦除所述秘密值。
39.根据权利要求25-38中任一项所述的系统,其中,所述第一组指令被配置为使得所述处理器根据加载在所述易失性寄存器中的所述秘密值对地址进行解码。
40.根据权利要求25-39中任一项所述的系统,其中,所述第一组指令被配置为使得所述处理器执行到至少基于所述秘密值的地址的跳转。
41.根据权利要求25-40中任一项所述的系统,其中,所述第一组指令包括具有至少基于加载在所述易失性寄存器中的所述秘密值的地址的至少一个MOV指令。
42.根据权利要求25-41中任一项所述的系统,其中:
所述秘密值包括存储器视图索引;以及
所述第一组指令包括VMFUNC指令,VMFUNC指令被配置为使得所述处理器至少基于加载在所述易失性寄存器中的所述存储器视图索引切换到存储器视图。
43.根据权利要求25-42中任一项所述的系统,其中:
所述秘密值包括密钥;以及
所述处理器被配置为执行至少基于所述密钥的密码功能。
44.根据权利要求25-43中任一项所述的系统,其中,所述处理器被配置为将对于扩展页表的访问许可设置为以下中的一个:
仅执行许可,或者
仅监督程序执行许可。
45.根据权利要求25-44中任一项所述的系统,其中,所述处理器被配置为将对于扩展页表的访问许可设置为排除:读取访问和写入访问。
46.根据权利要求25-45中任一项所述的系统,其中,所述处理器被配置为防止操作系统读取所述存储器的第一部分。
47.根据权利要求25-46中任一项所述的系统,包括:
被配置为执行管理程序的模,其中
所述存储器的第一部分包括这样的存储器:对于所述存储器一组连续的虚拟存储器地址被映射到一组不连续的机器存储器地址,
所述管理程序被配置为维护从所述虚拟存储器地址到所述机器存储器地址的映射,所述管理程序以vmx-root ring-0访问特权来执行,
操作系统调用所述第一组指令,以及
所述操作系统是由所述管理程序支持的,并且在比Ring 0更受限制的访问保护的情况下执行。
48.根据权利要求47所述的系统,其中:
所述第一组指令是在由所述管理程序支持的软件中的指令之中的。
49.根据权利要求25-48中任一项所述的系统,其中,所述秘密值指示虫洞地址。
50.根据权利要求25-49中任一项所述的系统,其中,第一组指令被配置为使得所述处理器将关于所述秘密值的信息仅存储在被保护免受攻击方代码的存储器中。
51.至少一种非暂时性的、机器可访问的存储介质,其上存储有指令,其中,所述指令被配置为当在机器上执行时使得所述机器:
规定用于仅执行访问的存储器区域;
将一组指令存储在所述存储器区域中;
执行所述一组指令之中的早期指令,其中,所述早期指令被配置为使得所述机器将秘密值加载到易失性寄存器中;以及
执行所述一组指令之中的一组后续指令,其中,所述后续指令的正确执行取决于被加载到所述易失性寄存器中的所述秘密值。
52.根据权利要求51所述的存储介质,其中:
所述处理器被配置为响应于异步事件而丢失加载在所述易失性寄存器中的信息;以及所述一组指令包括被配置为阻止以下中的一个或多个的一组事务性指令:
不按顺序执行所述一组指令,或者
部分执行所述一组指令。
53.根据权利要求51或权利要求52所述的存储介质,其中,所述秘密值包括非规范地址,并且其中,所述易失性寄存器包括堆栈指针。
54.根据权利要求53所述的存储介质,其中,所述后续指令被配置为使得所述处理器执行到基于所述堆栈指针中的秘密值的地址的间接跳转。
55.根据权利要求54所述的存储介质,其中,所述后续指令被配置为在所述秘密值被加载之后且在所述间接跳转之前的时间段期间不干扰所述堆栈指针。
56.根据权利要求53-55中任一项所述的存储介质,其中,所述一组指令被配置为使得所述处理器:
保留所述堆栈指针中的秘密值,直到对于正确执行所述后续指令不再需要所述秘密值为止。
57.根据权利要求51-56中任一项所述的存储介质,其中,所述一组指令被配置为使得所述处理器禁用以下中的一个或多个:
中断;或者
断点。
58.根据权利要求51-57中任一项所述的存储介质,其中,所述一组指令被配置为使得所述处理器:
将所述存储器区域限制为在以下情况下执行:Ring 0访问特权、CPL0保护级别、或其它监督模式。
59.根据权利要求51-58中任一项所述的存储介质,其中,所述一组指令被配置为使得所述处理器:
将立即值加载到所述易失性寄存器中。
60.根据权利要求51-59中任一项所述的存储介质,其中,所述一组指令被配置为使得所述处理器:
将所述秘密值变换为有效地址。
61.根据权利要求51-60中任一项所述的存储介质,其中,所述一组指令被配置为使得所述处理器:
从所述易失性寄存器中擦除所述秘密值。
62.根据权利要求51-61中任一项所述的存储介质,其中,所述一组指令被配置为使得所述处理器:
根据加载在所述易失性寄存器中的所述秘密值对地址进行解码。
63.根据权利要求51-62中任一项所述的存储介质,其中,所述一组指令被配置为使得所述处理器:
执行到至少基于加载在所述易失性寄存器中的所述秘密值的地址的跳转。
64.根据权利要求51-63中任一项所述的存储介质,其中,所述一组指令包括:
至少一个MOV指令,其具有至少基于加载在所述易失性寄存器中的所述秘密值的地址。
65.根据权利要求51-64中任一项所述的存储介质,其中:
存储在所述易失性寄存器中的所述秘密值包括存储器视图索引;以及
所述处理器被配置为响应于执行VMFUNC指令而至少基于所述存储器视图索引切换到存储器视图。
66.根据权利要求51-65中任一项所述的存储介质,其中:
存储在所述易失性寄存器中的所述秘密值包括密钥;以及
所述处理器被配置为执行至少基于所述密钥的密码功能。
67.根据权利要求51-66中任一项所述的存储介质,其中,所述一组指令被配置为使得所述处理器:
将对于扩展页表的访问许可设置为以下中的一个
仅监督程序执行许可。
68.根据权利要求51-67中任一项所述的存储介质,其中,所述一组指令被配置为使得所述处理器:
将对于扩展页表的访问许可设置为排除:
读取访问和写入访问。
69.根据权利要求51-68中任一项所述的存储介质,其中,所述一组指令被配置为使得所述处理器防止操作系统读取所述存储器区域,其中,所述处理器执行所述操作系统。
70.根据权利要求51-69中任一项所述的存储介质,其中,所述存储器区域包括这样的存储器:对于所述存储器一组连续的虚拟存储器地址被映射到一组不连续的机器存储器地址。
71.根据权利要求70所述的存储介质,其中,所述一组指令被配置为使得所述处理器:
执行管理程序,所述管理程序被配置为维护从所述虚拟存储器地址到所述机器存储器地址的映射,其中
所述管理程序被配置为以vmx-root ring-0访问特权来执行,
操作系统调用所述一组指令,以及
所述操作系统是由所述管理程序支持的,并且在比Ring 0更受限制的访问保护的情况下执行。
72.根据权利要求71所述的存储介质,其中:
所述管理程序被配置为规定所述存储器区域。
73.根据权利要求51-72中任一项所述的存储介质,其中,所述秘密值指示虫洞地址。
74.根据权利要求51-73中任一项所述的存储介质,其中,所述一组指令被配置为使得所述处理器将关于所述秘密值的信息仅存储在被保护免受攻击方代码的存储器中。

说明书全文

具有非可读页的存储器保护

技术领域

[0001] 本公开总体上涉及信息安全,并且具体地涉及使用硬件规定的访问许可

背景技术

[0002] 现代的计算系统采用各种技术来确保恶意的、虚假的或其它无效程序不能够获得对计算机处理器的控制。许多处理器被设计为使得硬件和软件能够努合作以防止无效代码被处理器执行。许多处理器设计实现针对访问处理器和/或其它资源的保护的分层域。例如,只准许诸如操作系统或管理程序的特殊程序在处理器上使用处理器的最高特权模式(例如,“ring 0”或“监督”模式)执行。取决于各种程序被分配的特权级别,各种程序可以能够或可以不能访问受保护的资源,例如,I/O设备、受保护的存储器区域、存储器表、中断禁用、对处理器的直接访问、其它虚拟机的映像、或者其它资源。
[0003] 各种无效程序可以通过执行存在于计算系统上的其它特权代码的部分区段来获得对受限制的资源的访问。示例包括恶意的面向返回的编程(ROP)攻击和面向跳转的编程(JOP)攻击,其可以尝试部分执行特权代码(例如,通过在代码流中的中间点处启动执行)。在各种情况下,木、蠕虫、病毒、或其它载体能够引入启动执行已经存在于计算机存储器中的特权代码的区段的恶意软件。通过执行特权代码的所选择的区段或多个区段,恶意软件可能能够完成否则对于恶意软件将被拒绝的任务。
附图说明
[0004] 关于以下描述和附图,本公开的益处、特征、以及优点将变得更好理解,在附图中:
[0005] 图1示出了计算系统的一个实现方式。
[0006] 图2示出了页表的一个示例。
[0007] 图3示出了页的内容的示例。
[0008] 图4示出了其中受保护代码被准备并成功地执行的有效操作的示例。
[0009] 图5示出了其中受保护代码被准备并继而经受不恰当访问的无效操作的示例。
[0010] 图6示出了可以用于使用密钥字符串加载易失性寄存器的入口点指令的一些示例。
[0011] 图7示出了处理器核心的一个示例。
[0012] 图8是片上系统的一个示例的框图

具体实施方式

[0013] 图1示出了计算系统100的一个实现方式。系统100包括处理器110、随机存取存储器(RAM)130、输入/输出电路(I/O)140、以及存储设备160。系统总线180连接处理器110、RAM 130、I/O 140、以及存储设备160,以实现这些组件与其它组件之间的通信。
[0014] 处理器110包括被配置为执行计算指令的电路。处理器110内部是各种存储器组件,例如,高速缓存、寄存器、以及缓冲器。在所示出的示例中,处理器110包括寄存器120和存储器管理单元(MMU)111,存储器管理单元(MMU)111包括转换后备缓冲器(TLB)112。RAM 130用于在系统100的操作期间存储可执行代码和信息。存储设备160表示用于对数据和指令进行批量存储或非易失性存储的一个或多个硬盘驱动器光驱动器、闪存驱动器、或其它存储器。I/O 140由系统100用于与其它系统或设备进行通信。I/O 140能够包括有线或无线网络设备或其它接收器、发射器、或收发器,以及支持调制器和基带电路。
[0015] 寄存器120由处理器110用于保存正在由在处理器110上执行的机器语言指令使用或操纵的数据。在该示例中,寄存器120包括若干通用寄存器(包括rax 121和rbx 122)、基指针(rbp)123、堆栈指针(rsp)124、指令指针(rip)125、以及易失性寄存器(包括rv1 126和rv2 127)。易失性寄存器在硬件方面被配置为响应于可能指示由恶意代码或其它无效代码进行的活动的事件而擦除、加扰或以其它方式保护其内容。例如,易失性寄存器126和127可以被配置为使得:无论何时中断、存储器错误、保护错误、或其它故障发生,或者指示控制流的异步改变的任何事件发生,其内容被擦除。
[0016] 在操作期间,一组页(包括页134、135、136)可以存储在RAM 130中。每个页是被分配以供一个或多个进程或其它活动执行的处理器110使用的存储器。在各种实现方式中,每个页由具有连续的地址集的存储器构成。在所示出的实现方式中,每个页中的连续地址是虚拟地址空间的部分。页被映射到,其指示对应的硬件地址或机器地址(未示出)。在其它实现方式中,存储器页中的连续地址直接指示存储器硬件设备中的地址。在各种系统中,存储器页是由操作系统分派以供程序使用或用于在RAM130与存储设备160之间进行传输的存储器的基本单元。在各种系统中,处理器110的架构要求每个页的大小是固定值,例如512Bytes、4KB、2MB、1MB、16MB、或其它值。在其它系统中,页能够分配有不同的大小。
[0017] 页表132也可以存储在RAM 130中。页表132是维持在存储器中的各种页的主动索引。在所示出的示例中,页表132指示每个页134、135、136的范围,并且还保存虚拟地址空间与数据在硬件元件中实际存储的对应物理地址空间之间的映射信息。例如,页表132可以指示对应于页编号(在虚拟地址空间中)的适当帧号(在物理地址空间中)。页表132包括针对由在处理器110上执行的应用和其它程序使用的页中的每个页的页表入口(PTE)。为了加速虚拟存储器地址与物理存储器地址之间的转换,TLB 112高速缓存各种页表映射,其可以直接地或间接地与入口页表132相关。
[0018] 调用堆栈138也可以存储在RAM 130中。调用堆栈138保存关于正在由处理器110执行的进程或程序的信息,包括当前执行的子例程的状态和调用当前例程的任何更高级别的例程的状态。特别地,调用堆栈138保存关于一旦当前子例程完成则控制应该返回的调用点的信息。调用堆栈138的顶部由存储在堆栈指针124(图1中)的地址指示。调用堆栈138的当前区段的底部由存储在基指针123中的地址指示。
[0019] 图2示出了页表132的一个示例。在该示例中,页表包括若干页表入口:一个页表入口用于驻留在RAM 130中的或者已经被卸载到存储设备160的每个页。每个PTE包括提供虚拟地址(虚拟地址可以由处理器110在与程序通信时使用)与物理地址(物理地址可以由处理器110在通过地址总线访问存储器硬件时使用)之间的转换的映射。
[0020] 每个PTE还包括授权用于对应的页的许可指示符,例如,读取、写入、以及执行许可。在所示出的示例中,这些许可被存储为准许或拒绝访问的读取、写入以及执行位。
[0021] 例如,如果页表指示页被指定用于写入访问,则处理器110将允许能够访问该页的(多个)进程或(多个)线程将数据写入页或以其它方式更改页中的信息。否则,进程(或多个进程)将不能够写入页。类似地,如果页被指定用于读取访问,则处理器110将允许能够访问该页的进程读取页中的信息并将该信息复制到其它存储器位置。否则,该进程将不能够读取页。此外,如果页被指定用于执行访问,则处理器110将允许能够访问该页的进程调用或分支到页上的指令,或者以其它方式启动由处理器110执行指令。否则,进程将不能够执行页中存储的指令。
[0022] 每个PTE还可以保存关于对应页的状态的信息。例如,当前位能够指示该页当前是否驻留在RAM 130中。如果页在被需要时未驻留,则MMU111启动“页故障”条件,这导致操作系统将页从存储设备160加载到RAM130中。经修改的位能够指示自从页上次写入到存储设备160以来在RAM130中是否已经对该页进行修改。
[0023] 图3示出了页136的内容的示例。在该示例中,页136被设置为具有仅执行(execute-only)访问。例如,这种访问能够用于保存处理器可执行指令的一部分的页。在该示例中,一组机器语言指令存储在页136中。该指令形成能够由诸如处理器110的处理器执行的一组可执行代码305。例如,代码305能够是被配置为按顺序一起工作以完成以下期望的任务的一组指令,例如,计算的一部分、对存储设备160或RAM 130的另一部分进行读取或写入、通过I/O 140进行通信、对外围设备进行访问、或一些其它操作。
[0024] 代码305可以由一个或多个进程用于完成任务。调用进程将通过分支指令(例如,子例程分支(call/ret)、跳转(jmp)、或条件跳转(je、jne、jz...))来启动代码305的执行。进入代码305中的有效分支将在开始执行代码305之前更新调用堆栈138。例如,该更新可以记录关于调用进程的状态的特定信息。记录到调用堆栈138中的状态信息可以包括各种寄存器120(包括指令指针125)的内容,以及由调用进程使用的各种变量。堆栈指针124和基指针123的内容也能够记录到调用堆栈138中,并且然后被修正以指示经更新的堆栈的新的帧。
[0025] 一旦调用堆栈被更新,则代码305的执行能够进行。对代码305进行有效调用将在适于恰当执行代码的点处启动代码的执行。在所示出的示例中,代码305仅具有一个有效开始点:入口点310。在该示例中,代码305被设计为使得安全且可靠的执行依赖于在入口点310处开始的执行。
[0026] 在计算机系统的保护中出现的一个问题在于防御系统免受在并非旨在用于进入的中间点处启动执行代码段(例如,代码305)的恶意的、或不正确的、或虚假的程序。例如,可能针对系统发动恶意的代码重用攻击。随着设计者使得其系统抵抗代码注入,代码重用攻击(例如,面向返回的编程(ROP)和面向跳转的编程(JOP))变成越来越大的威胁。该抵抗能够阻止攻击者将其自己的代码插入到计算机系统中。因此,一些攻击者已经转向代码重用攻击。这些攻击尝试将已经存在于计算机系统上的有效代码的部分串在一起,但是以该有效代码的设计者并不意图的方式。现有的有效代码的片段由攻击以对系统或依赖于系统安全性的用户有害的方式执行。
[0027] 代码305是被配置为抵抗代码重用攻击的代码的示例。在入口点310启动执行之后立即或不久,代码305包括用于将密钥字符串移动到易失性寄存器126中的入口点指令324。密钥字符串是成功执行块305的后续部分所需要的值。这些后续指令在图3中示为受保护代码326。
[0028] 在受保护代码326之前,代码305可以包括一些防御性指令325。防御性指令325可以实现认证或其它保护措施,以确保受保护代码仅由有效的程序到达。例如,防御性指令325可以针对认证调用程序的有效性的适当签署或签名来检查堆栈或存储器的其它部分。
如果恶意的或以其它方式无效的程序尝试运行代码305,则防御性指令可以检测到无效操作并返回或以其它方式结束程序控制,以使得执行不进行到受保护代码326。然而,如果防御性指令325验证当前执行,则控制进行到受保护代码326,其执行一些有用的功能(例如,存储器访问、对存储器或设备进行读取或写入、或计算、或加密或签名操作,以及其它功能)。
[0029] 无效的调用程序可以尝试在保护措施325之后的点进入代码305。为了帮助阻止这种无效程序的进展,受保护代码326本身可以被设计为具有保护性特征。
[0030] 在该示例中,受保护代码326被配置为取决于密钥字符串,密钥字符串在易失性寄存器126中保存为秘密值。特别地,受保护代码被结构化为使得在不知道密钥字符串的情况下受保护代码不能被恰当地执行。例如,密钥字符串可以是对由受保护代码326访问的数据进行解或锁定或认证所需要的密码密钥。
[0031] 可替代地,在易失性寄存器126中保存为秘密的密钥字符串可以是目标地址,或者可以被解码或以其它方式用于确定目标地址。受保护代码可以使用目标地址进行跳转或调用进一步执行,或者取回在该地址可用的一些敏感数据。目标地址可以是受保护代码326外的地址,或者目标地址可以是受保护代码326内的地址。
[0032] 在目标地址是受保护代码326外的地址的一些实现方式中,可以将密钥字符串理解为提供对目标地址的访问的“虫洞(wormhole)”。没有密钥字符串,攻击方将不得不猜测目标地址以成功地达到该目标地址、以及在那里可用的可执行代码或信息。使用当前的寻址方案(例如,物理或虚拟地址可能具有64位或128位地址大小),对于攻击方而言在大范围的可能地址之中猜测目标地址可能是棘手的。因此,敏感信息或代码只能由使用“虫洞”密钥字符串的一方访问。此外,管理程序可以被配置为检测并关闭执行可疑行为(例如,通过存储器空间明显随机地搜索正确的目标地址)的程序。
[0033] 在目标地址是到受保护代码326内的指令的地址的一些实现方式中,可以将密钥字符串理解为用于解开“加扰”或“随机”格式的工具,受保护代码326已经以这种格式写入。在一些实现方式中,当受保护代码326最初存储在只执行页上时,受保护代码326可以由管理程序或其它监督程序加扰。此时,监督程序可以将所需要的解扰信息记录到入口指令324中的密钥字符串中。
[0034] 可替代地,密钥字符串可以是用于扩展页表的页表地址或VMFUNC视图索引(其可以作为秘密值加载到ECX寄存器中)。后续指令(例如,MOVE CR3指令或VMFUNC指令)可以对页表或扩展页表进行解码,并使用该信息来改变存储器映射或许可。
[0035] 由于受保护代码326取决于保存在易失性寄存器126中的密钥字符串,受保护代码326依赖于在块305中较早出现的移动指令324。作为结果,块305形成事务单元。在该示例中,需要在指令324之后执行受保护代码326中的指令,以便于产生可使用的或合理的结果。
如果恶意的或其它无效的行为要跳转到受保护代码326中间某处的指令,则结果将不可使用;事实上,代码的向前进程可能是不可能的。在不知道密钥字符串的情况下,受保护代码
326的部分执行将失败。在这个意义上,块305是代码的基元(atomic)部分:除非该块作为一个整体执行,否则其实际上不可使用。
[0036] 在受保护代码326被执行之后,代码305在出口点330处结束。例如,出口点330可以是使得调用例程恢复执行的返回指令,或者启动执行另一代码块的跳转指令。例如,出口点330可以包括子例程分支(call/ret)、跳转(jmp)、或条件跳转(je、jne、jz...)。作为退出操作的一部分,调用堆栈138以合适的方式拆堆栈以将控制传递或返回到另一个代码。在返回操作中,可以从调用堆栈138中移除堆栈指针124和基指针123的旧的内容,并将其加载回堆栈指针124和基指针123中。
[0037] 可以在代码305中使用的指令的概要的一个示例如下所示。
[0038]
[0039]
[0040] 图4示出了其中受保护代码被准备并成功地执行的有效操作400的示例。图4示出了一般说明;图3的代码的页是可以在操作400中使用的代码的示例。在动作410中,将存储器页或存储器的其它区域指定用于仅执行访问,例如,图1和图3的存储器页136。例如,该指定可以由操作系统或其它监督程序来执行,监督程序使得处理器在许可表中设置适当的位。例如,可以将对应的扩展页表中的读取、写入、以及执行位设置为{0 0 1}——或者使得能够执行而拒绝对存储器区域进行读取或写入访问的其它设置。
[0041] 在动作420中,操作系统或监督程序使得处理器将包括受保护代码(例如,图3的代码305)的一组指令写入到存储器区域中。紧随其后,或在某个后续的时间,处理器可以在动作430中开始执行该组指令。该开始在该组指令中的有效入口点(例如,入口点310)处。在动作440中,该组指令中的初始指令或其它早期指令使得处理器执行实现该组中的后期指令(例如,图3中的受保护代码326)的恰当操作所需要的动作。例如,易失性寄存器能够加载有后期指令(例如,入口点指令324)所取决于的密钥。在动作450中,该组指令中的剩余指令继续并以在处理器上恰当执行结束。(在图3的示例中,剩余指令使用存储在易失性寄存器中的密钥来恰当地执行所意图的活动。)
[0042] 图5示出了其中受保护代码被准备并继而经受不恰当访问的无效操作500的示例。例如,攻击方可以尝试通过仅使用受保护代码的一部分来获益。在一些情况下,通过将受保护代码存储在其它程序不可读取(例如,仅执行)的页中,能够有助于隐藏受保护代码。尽管如此,攻击方可以尝试通过某种方式跳转到受保护代码或以其它方式执行受保护代码来推断受保护代码的内容或功能。在图5的示例中,可以通过使用取决于较早期指令的在先执行的后期指令来阻止这种不适当的探索。
[0043] 在动作510中,将存储器页或存储器的其它区域指定用于仅执行访问。在动作520中,将包括受保护代码的一组指令写入存储器区域。到目前为止,这些动作(510、520)对应于在图4的先前示例中的有效操作期间的上面讨论的动作(410、420)。然而,在该示例中,一些错误或攻击发生,并且处理器在有效开始点530处不执行该组指令。而是,在动作545中,恶意的或其它无效的进程使得处理器在无效入口点——在有效入口点之后的点处启动执行受保护代码。这种无效入口对于攻击方可能是有帮助的,例如,这是因为后期的入口可以绕过刚好在入口点之后在初始指令块中发生的一些初始保护措施(举例来说,认证或存储器保护,例如,图3中的防御性指令325)。通过绕过这些初始保护措施,攻击方可能希望使用受保护代码的有价值部分,而不会受到初始块中的保护措施的阻止。例如,这样的方法可以由攻击方在设计或执行ROP或JOP攻击中使用。
[0044] 由于这种进入到受保护代码的无效入口,无效操作500的执行跳过受保护代码的初始部分:在540中不执行实现后期指令的有效操作的(多个)早期指令。
[0045] 例如,如上面所讨论的,受保护代码中的一个或多个早期指令(例如,图3中的指令324)可以被配置为将密钥加载在易失性寄存器中,并且后期指令(例如,图3中的指令326)可以被配置为依赖于存储在该易失性寄存器中的字节。在没有执行早期指令的益处的情况下,后期指令不能够访问通过执行早期指令540而提供的使能特征。
[0046] 然后,当后期指令在动作550中被执行时,后期指令失败。故障因为后期指令不能够以有效的方式操作而发生。例如,如果使能指令540被配置为将密码密钥提供到易失性寄存器中,则后期指令可能不能够解密或认证或签署要被读取或写入的数据。相反,后期指令将尝试使用在易失性寄存器中作为密钥偶然存在的无论任何驻留信息。这种尝试将导致不合理的或不正确的解密、或认证失败、或可检测的无效签名。
[0047] 类似地,如果缺失的特征是应该已经加载到易失性寄存器中的地址,则后期指令可能不能够跳转到该地址处的适当指令,或者可能不能够从该地址读取数据。相反,后期指令可以基于在易失性寄存器中偶然存在的无论任何驻留信息而访问不正确的地址。类似地,如果缺失的特征是针对扩展页表的页表地址或视图索引,则后期指令可能不能够以可使用的方式改变存储器映射或许可。
[0048] 由于在动作550中执行失败,操作500可以使用虚假的驻留信息而不是适当的密钥来完成后期指令(例如,图3中的指令326)的执行。结果将是无效的或不可使用的结果,如在行为552中所指示的。可替代地,行为550中的不恰当执行可以触发故障或中断或以其它方式警告监督程序,这可以中止在行为554中执行无效操作500。这些结果(552或554)或其它失败结果中的任何结果都是对恶意的或其它无效的尝试使用受保护代码的成功拒绝。这些拒绝可以防止ROP或JOP能够执行(或检查)受保护代码。
[0049] 各种代码保护方案依赖于精细的分页结构来限制对受保护代码的访问。这些方案可以引入实质的开销,例如,通过在故障、中断、以及将控制传递给管理程序以用于访问认证的其它出口期间花费时钟周期来切换页。这种切换可以引入很大的开销,例如,通过需要冲洗转换后备缓冲器(例如,TLB 112)并继续进行冷硬件高速缓存。在各种实现方式中,使用入口点指令(例如,入口点310和/或指令324)以及根本上取决于入口点指令的在先的执行的代码能够有助于保护代码,而不用在页之间进行大量的切换,并且没有相关联的开销。例如,在动作450中成功地结束有效操作和在552中阻止结束无效操作500二者是通过串联执行受保护代码而达到的,而不需要可能伴随由管理程序或其它监督程序进行的中断或其它干预的页切换。
[0050] 图6示出了可以用于使用密钥字符串加载易失性寄存器的入口点指令的一些示例。入口点指令的一个示例是Intel 64汇编指令610:
[0051] mov rsp,0xF4F4F4F4F4F4F4F4
[0052] 在该示例中,堆栈指针(例如,堆栈指针124)被用作易失性寄存器。在汇编语言中,指令610可以被表示为“48BCF4F4F4F4F4F4F4F4”(以原始十六进制)或“\x48\xBC\xF4\xF4\xF4\xF4\xF4\xF4\xF4\xF4”(以字符串常量)或“{0x48,0xBC,0xF4,0xF4,0xF4,0xF4,0xF4,0xF4,0xF4,0xF4}”(以数组常量)。
[0053] 指令610的反汇编表示的一个示例是:
[0054] 0:48bc F4F4F4F4F4 movabs rsp,0xF4F4F4F4F4F4F4F4
[0055] 7:F4F4F4
[0056] 例如,指令610可以用作要被放置在具有仅执行访问的存储器页上的入口点指令(例如,图3中的指令324)。例如,指令610可以被放置在仅在监督模式下可执行(并且其不具有读取或写入访问)的存储器页上。在本示例中,“F4F4F4F4F4F4F4F4”是立即四倍长字(64位)值。指令610使得该立即值移动到堆栈指针中。
[0057] 如果该密钥字符串值被读取为地址,则其将是一个非规范地址(因为它以0xF4开头)。这方面提供了针对可以尝试推断立即值的恶意的或其它无效的软件的一些攻击抵抗。在各种实现方式中,系统可以被配置为使得使用非规范地址(例如,当执行读取或写入时)会导致一般保护故障(#GP)或双重故障(例如,当在64位监督模式中执行时)。这样的条件能够将执行控制返回到管理程序,例如,虚拟机扩展的根模式(VMX-root)。例如,可以将虚拟机控制结构(VMCS)配置为使得虚拟机在这样的故障时退出(VM Exit)。这样的响应能够帮助避免向无效软件显露密钥字符串或其它秘密值。
[0058] 类似地,如果该值被读取为指令,那么它也将提供一定攻击抵抗,因为F4十六进制值解码为1字节HLT(停止)操作码。如果被执行,HLT操作码将调用管理程序或其它监督程序。在本示例中,完整的字符串(8个F4值)是用于MOV指令的立即值:该字符串本身包括在指令中。该值由MOV指令加载到堆栈指针中。HEX值F4F4F4F4F4F4F4F4用作继而后续指令可用的密钥字符串或秘密值。受保护代码中的后续指令可以从堆栈指针中读取密钥字符串。当从只能以监督特权执行的存储器中被执行时,将非规范的值用于64位模式中的堆栈指针寄存器可以有助于保证如果代码随后被中断则将会调用VMX-root(管理程序)。以这种方式将控制返回到管理程序可以有助于避免将秘密堆栈指针值显露给不恰当的操作系统或其它不恰当的软件。
[0059] 在各种实现方式中,管理程序可以被配置为确保入口点指令(具有其秘密的密钥字符串)被放置在仅可执行(不可读取、不可写入)页内。此配置增加安全性,这是因为禁止各种软件从仅可执行存储器页中读取信息。因此,恶意的或其它无效的软件可能不能够从仅可执行存储器页中读取密钥字符串。除了仅执行存储器之外,处理器的各种实现方式允许管理程序使用扩展页表中的许可将存储器页指定为在监督模式下仅可执行。因此,只有在这样的页上的代码以高(管理程序)特权运行的情况下,才能够执行在这样的页上的代码,并且不能够从用户空间执行。
[0060] 此外,堆栈指针在对于控制流的异步改变的情况下其内容被重写的意义上而言是易失性的。因此,如果恶意程序在尝试执行读取堆栈指针的代码时以某种方式中断受保护代码的流程,则在恶意程序可能执行指令以执行读取尝试之前,堆栈指针中的信息将被破坏。
[0061] 适当的后期指令——其在代码序列中比入口点指令出现地晚——可以被配置为使得在恰当执行的情况下后期指令的恰当执行依赖于存储在堆栈指针中的密钥字符串。有效的软件程序(其在入口点指令处开始执行仅可执行页上的代码)初始地将密钥字符串加载到堆栈指针中,并且然后能够在后期指令期间被需要时从堆栈指针访问密钥字符串。
[0062] 注意,指令610将堆栈指针从其正常实体转移:在指令610被执行之后,堆栈指针不再指示堆栈的正确顶部。因此,指令610之后的代码可以被剪裁,以使得其不需要使用堆栈,或者至少使得其不需要知道堆栈的顶部。
[0063] 指令610可以有助于保护代码序列中的后续指令。这些后期指令(例如,图3中的受保护代码326)可以被配置为使得需要密钥字符串以便于做任何有用的事情。例如,密钥字符串可以是后期指令能够解码并且然后跳转(JMP)到的地址,或者后期指令能够解码并且然后用于访问加载/存储存储器(例如,经由另一个MOV指令)的存储器地址,或者后期指令将解码并且用于经由或者MOV CR3指令改变存储器映射和许可的针对扩展页表的页表地址,或者后期指令将解码并且用于经由VMFUNC指令改变存储器映射和许可的针对扩展页表的视图索引,或者后期指令能够用于加密、解密、或以密码方式一般性地验证存储器内容的完整性的密钥。
[0064] 如果不恰当的软件程序尝试在后期指令处开始执行仅可执行页上的代码,那么它将在不能够访问入口点指令可用的密钥字符串的情况下这样做。也可以代替地或另外地使用其它措施,以保护密钥字符串免受恶意代码访问。
[0065] 在不能够从仅执行存储器页读取密钥字符串并且没有执行入口指令的情况下,不恰当的软件程序将缺少秘密的密钥字符串。因此,不恰当的软件程序将不能够使用后期指令来完成有用的操作。
[0066] 在上面的示例中,入口指令将堆栈指针中的秘密值存储为非规范地址,HEX值“F4F4F4F4F4F4F4F4”。如果后期指令中断并且处理器尝试访问该无效堆栈地址,则此方法可以导致双重故障。因此,如果一些事件中断后续的程序执行流程,则将对管理程序进行警告。另一方面,如果执行页上的指令被正确地访问,以入口点指令开始,并且没有尝试中断程序流程,则后期指令将以来自其它软件的保密性正确地执行。
[0067] 在各种实现方式中,对仅执行页上的密钥字符串进行编码可以防止攻击方以某种方式执行密钥字符串来显露它。虽然攻击方可能能够读取存储器,但是各种处理器架构(例如,各种x86架构)能够允许针对执行尝试的字节粒度偏移。在各种64位x86模式下,Intel 64中存在多个无效的操作码。这些无效的操作码能够用于如果其被执行则触发退出到管理程序。例如,操作码60h、61h、62h是64位模式下的无效指令。与HLT指令一样,管理程序能够被配置为使得执行这些操作码将导致退出到管理程序。因此,尝试使用字节偏移执行来检查密钥字符串的攻击方可以在试图推断秘密的密钥字符串时被检测到。
[0068] 在上面的示例中,密钥字符串是HEX值“F4F4F4F4F4F4F4F4”。密钥字符串的其它值也是可能的。如上面指出的,除了1字节的HLT操作码(F4)之外,能够使用操作码60h、61h、62h。在一个实现方式中,该组四个操作码用作2位符号的字母表,以构造对秘密值进行编码的密钥字符串。一个示例方法可以将数字0(二进制00)编码为密钥字符串中的60,将数字1(二进制01)编码为密钥字符串中的61,将数字2(二进制10)编码为密钥字符串中的62,以及将数字3(二进制11)编码为密钥字符串中的F4。图6示出了说明该编码的三个示例入口点指令620、630、640。指令620是:
[0069] mov rsp,0x606162F4F4F4F4F4
[0070] 在汇编语言中,指令620可以呈现为“48BCF4F4F4F4F4626160”(以原始十六进制机器码)。该指令使用对二进制数字00011011(十进制27)编码的四字节字符串(606162F4)、以及使用四个填充字节“F4”来加载堆栈指针。经编码的字符串(606162F4)将被解码以供也与入口点指令620在同一仅执行存储器页上的后续指令使用。
[0071] “HLT”操作码的四个填充字节(F4F4F4F4)可以有助于防止攻击方尝试推断密钥字符串。例如,攻击方可以试图执行作为32位指令的密钥字符串620的部分:mov esp,0x606162F4F4F4F4F4(原始hex=BCF4F4F4F4)。在一些情况下,如果未恰当地填充该编码,则这种执行可以显露该编码的秘密部分。类似地,在具有F4的入口点指令之前,在仅执行页中填充存储器可以是有帮助的,以帮助防止前面的指令序列在由攻击方执行的情况下显露秘密值。
[0072] 图6还示出了示例指令630:
[0073] mov rsp,0xF4626160F4F4F4F4
[0074] 在汇编语言中,指令630可以被呈现为“48BCF4F4F4F4606162F4”(以原始十六进制)。该指令使用对二进制数字11100100(十进制228)进行编码的四字节字符串(F4626160)、以及使用四个填充字节“F4”来加载堆栈指针。
[0075] 图6还示出了示例指令640:
[0076] mov rsp,0x60606060F4F4F4F4
[0077] 在汇编语言中,指令640可以被呈现为“48BCF4F4F4F460606060”(以原始十六进制)。该指令使用对二进制数字00000000(十进制0)进行编码的四字节字符串(60606060)、以及使用四个填充字节“F4”来加载堆栈指针。
[0078] 技术熟练的设计者将认识到,也能够使用这种4个字母的字母表(操作码60=0;操作码61=1;操作码62=2;操作码F4=3)进行其它编码。例如,考虑图3的入口点310旨在向受保护代码326中的后期指令安全地提供VMFUNC视图索引的情况。入口点指令324能够被配置为通过移动使用四个对应的操作码编码的密钥字符串来提供八位的值(256个可能的索引值)。
[0079] 此外,能够使用多个这样的指令来部分地编码能够通过若干堆栈指针MOV指令之间的中间代码来级联或以其它方式编译在一起的大的秘密。因此,可以使用简单的编码对128位或更大的秘密值进行编码。例如,第一入口点指令将秘密值的第一部分MOV到堆栈指针。然后,后续指令能够将结果解码到分隔开的暂存寄存器(例如,另一个易失性寄存器)中,然后执行另一MOV到堆栈指针,然后将该值解码到暂存寄存器的下一个部分中,等等。这种重复性的方法能够在暂存寄存器中建立很大的秘密值。在一个示例中,相同的堆栈指针可以用作易失性寄存器。在堆栈指针用作易失性寄存器的情况下,应当首先将密钥字符串的先前部分秘密值从堆栈指针寄存器复制到暂存寄存器,在暂存寄存器中能够对其进行操纵。然后能够将下一个紧接着的非规范的部分秘密值加载到堆栈指针中,并且然后与暂存值组合。该过程能够重复,直到构造完全的秘密值位置。以这种方式使用堆栈指针和暂存寄存器能够协助避免将秘密值的任何部分公开给其它软件。
[0080] 此外,还能够使用其它字母表,或者使用这四个操作码(60、61、62、F4),或者其它操作码,或者甚至使用其它数量的操作码。例如,各种处理器架构允许管理程序指定什么样的以其它方式未定义的指令或中断将退出到该管理程序。因此,能够由管理程序向CPU指定附加的非执行操作码。这些操作码可以适于用作编码字母表中的字母。
[0081] 在入口点指令610、620、630、640的示例中,堆栈指针的先前内容在适当地进入到受保护的代码区段时立即被破坏。因此,在这些示例中,对于受保护代码而言分支到其它代码段可能是困难的或不可能的。这是因为分支通常会向调用堆栈添加另一个层,这在不知道堆栈顶部的地址的情况下是不可实践的。该地址通常存储在堆栈指针中,但是在入口点指令610、620、630、640的示例中被重写。该限制说明了什么可以是受保护代码的特征。返回参考图3,受保护代码326旨在作为单位事务执行而不受干扰。为了帮助确保执行的完整性,该代码一般可以被结构化,以使得该代码不依赖于分支到任何外来的代码。因此,堆栈指针的先前内容的初始毁坏可能不会造成问题。当受保护代码326终止时,作为正常返回过程的一部分,旧的堆栈指针值(与调用帧相关)被重新加载回堆栈指针中。
[0082] 如果受保护代码326确实需要调用或分支到其它代码的能力,则可以使用替代的入口点指令。代替立即重写堆栈指针,这些其它入口点指令可以首先读取并记录当前帧的堆栈指针,并且然后将关键字移动到堆栈指针中。
[0083] 图6还具有不采用堆栈指针的入口点指令的示例。示例指令650读取:
[0084] mov rv1,0x6062F461F4F4F4F4
[0085] 该指令使用对二进制数字00101101(十进制45)进行编码的四字节字符串(6062F461)、以及使用四个填充字节“F4”来加载易失性寄存器。易失性寄存器(例如,图1中的易失性寄存器126)是专设计的寄存器。如上面所讨论的,该寄存器被配置为响应于可能指示由恶意的或其它无效的代码进行的活动的事件来擦除、加扰、或以其它方式保护其内容。在该示例中,入口点指令650使用易失性寄存器并使堆栈指针不受干扰。
[0086] 例如,易失性寄存器在硬件方面可以被配置为使得:无论何时中断、存储器错误、保护错误、或其它故障发生,或者发生指示控制流的异步改变的事件时,其内容被擦除。
[0087] 示例指令660读取:
[0088] mov rv2,0x3aee5514cb65f3fc
[0089] 该指令使用8字节字符串(3aee5514cb65f3fc)来加载易失性寄存器rv2(不使用先前示例中的填充字节“F4”)。入口点指令660使用指定的易失性寄存器(例如,图1中的易失性寄存器127),并且如在先前的示例中那样使堆栈指针不受干扰。
[0090] 如上面所讨论的,使用易失性寄存器(例如,堆栈指针124或专用的易失性寄存器126、127)可以保护密钥字符串不受在中断或控制流的异步改变之后的恶意访问。在各种实现方式中,受保护的指令集可以包括禁用中断和所有其它异步事件的指令。类似地,受保护的指令集可以包括禁用断点的指令。在该点之后,攻击方程序不能够容易地中断执行并尝试通过执行替代的代码来暴露密钥字符串。(可替代地,系统可以被配置为使得将值加载到特别寄存器中的动作也能够使得处理器禁用中断,以使得中断被禁用,并且秘密被加载在单个基元操作中。)因此,受保护的指令集可以被配置为禁用异步事件,然后从易失性寄存器中读出密钥字符串,或者以其它方式将其存储在其它寄存器或其它存储器中。因此,在禁用异步事件之后,受保护指令集的一些实现方式可以重新声明易失性寄存器以用于其它用途。
[0091] 在未来的硬件、操作系统、以及软件的上下文中可以出现附加的示例。例如,VMFUNC的未来版本可以与授权访问指令的密钥字符串一起使用(例如,如果使用正确的密钥,指令功能将执行,否则将产生故障)。这样的指令可以是具有较大的索引字段或能够保存另一较大的秘密的密钥字符串的VMFUNC(例如,将64位的值加载到另一寄存器中),以使得由攻击方进行的猜测附加地不切实际。
[0092] 此外,使用存储在易失性寄存器中的功能使能的密钥字符串在各种其它上下文中可能有帮助。例如,上面的讨论中的各种示例设想页表(例如,由虚拟机监视器(VMM)管理的扩展页表)的使用。然而,上面的讨论中的各种示例也设想一些系统可以被配置为使得将仅执行存储器宣称为一系列存储器地址。如果这样的存储器范围表示物理存储器的地址,则可以将基本输入/输出系统(BIOS)或早期启动固件或软件配置为利用使用并依赖于存储在易失性寄存器中的密钥字符串的代码(例如,代码305)来填充存储器范围,并且配置为然后将该存储器范围设置为仅执行访问。在各种实现方式中,该存储器范围可以在一次设置的寄存器中定义,因此在其被设置之后不能被软件撤销(直到系统经历硬件重置或重启)。系统的各种实现方式可以允许预启动服务对受保护的存储器范围进行配置,在受保护的存储器范围中可以保存秘密的密钥字符串并提供相关的隐私和/或安全性服务。
[0093] 图7示出了处理器核心700的一个示例。处理器核心700可以是用于各种类型的处理器或处理元件(例如,微处理器、嵌入式处理器、数字信号处理器(DSP)、网络处理器、或用于执行代码的其它电路设备)的核心。尽管图7中仅示出了一个处理器核心700,但是处理元件可以替代地包括多于一个处理器核心。处理器核心700可以是单线程核心,或者可以是多线程的,因为它可以包括每个核心多于一个硬件线程上下文(或“逻辑处理器”)。
[0094] 图7还示出了耦合到处理器核心700的存储器770。存储器770可以是各种类型的存储器电路中的任何一种。存储器770可以包括要由处理器核心700执行的一个或多个指令代码713。处理器核心700被配置为遵从由代码713指示的指令的程序序列。每个指令进入处理器核心的前端部分710,并由核心中的一个或多个解码器720进行处理。解码器可以生成微操作(例如,以预定义的格式的固定宽度微操作)作为其输出,或者可以生成反映原始代码指令的其它指令、微指令、或控制信号。前端710还可以包括寄存器重命名逻辑725和调度逻辑730,其一般分配资源和队列操作以用于执行。
[0095] 处理器核心700包括被配置为在处理器核心700内存储数据的一个或多个寄存器740。寄存器740可以包括通用寄存器、一个或多个堆栈指针、以及其它堆栈相关的寄存器、一个或多个指令指针、和/或一个或多个易失性寄存器。
[0096] 处理器核心700包括执行逻辑750,执行逻辑750具有一组执行单元755-1、755-2至755-N。一些版本的处理器可以包括专用于特定功能或功能集合的多个执行单元。其它实施例可以仅包括一个执行单元或一个能够执行特定功能的执行单元。执行逻辑750执行由代码指令指定的操作。在完成执行由代码指令指定的操作之后,处理器核心中的后端逻辑760引退代码713的指令。在一个实施例中,处理器核心700允许不按顺序执行,但需要按顺序引退指令。后端逻辑760中的引退逻辑765可以采用本领域技术人员已知的各种形式(例如,重新排序缓冲器等)。以这种方式,处理器核心700在执行代码713期间被转换,至少在由解码器生成的输出、由寄存器重命名逻辑725使用的表、以及通过执行逻辑750的操作被修改的任何寄存器740方面。
[0097] 尽管图7中未示出,但是处理元件可以包括具有处理器核心700的芯片上的其它元件。例如,处理元件可以包括连同处理器核心的存储器控制。处理元件可以包括I/O控制逻辑和/或可以包括与存储器控制逻辑集成的I/O控制逻辑。处理元件还可以包括一个或多个高速缓存。
[0098] 图8是片上系统800的一个示例的框图。在各种实现方式中,片上系统800可以被设计为单个集成电路封装。在一些实现方式中,片上系统800可以制造在单个半导体晶片衬底上。在各种示例中,片上系统800可以使用各种SOC设计和制造方法来构造,以高效地创建小型计算系统。在其它单元中,片上系统800可以包括处理单元815、存储器单元820、存储单元825、图形处理单元827、通信单元850、以及传感器控制器单元830。应当注意,在其它实现方式中,片上系统800中的各种器件和模块中的一个或多个可以在分隔开的半导体晶片衬底上制造。
[0099] 另外,片上系统800可以经由传感器控制器单元830耦合到传感器硬件835,例如,照相机、麦克、天线、扬声器、触摸屏键盘鼠标位置传感器、邻近传感器、光传感器、加速度计磁传感器压力传感器温度传感器、生物识别安全传感器等。
[0100] 在一些实施例中,指令/软件代码可以存储在非易失性/易失性存储器(例如,存储单元825和存储器单元820)的组合中。指令可以被配置为由处理单元815处理,以便于促进片上系统800的功能中的至少一些功能。处理单元815包括寄存器840,寄存器840可以被配置为存储数据以供处理单元快速访问。寄存器840可以包括一个或多个易失性寄存器。
[0101] 在一些实施例中,片上系统800可以是便携式设备,例如,移动电话、具有触摸屏的智能手机、平板计算机、膝上型计算机、混合设备、另一通信设备等。
[0102] 附加注释和示例。下面指出了方法、设备、以及系统的实现方式的一些另外的说明性示例。
[0103] 示例1是一种存储计算机指令以用于执行的方法。该方法包括规定用于仅执行访问的存储器区域,将一组指令存储在存储器区域中,以及执行该组指令之中的早期指令。执行早期指令包括将秘密值加载到易失性寄存器中,以及执行一组后续指令。后续指令的正确执行取决于加载到易失性寄存器中的秘密值。
[0104] 示例2可以包括示例1的方法,其中,该组可执行指令形成一组事务性指令,其被配置为使用秘密值来阻止不恰当执行(例如,部分执行或不按顺序执行)。在各种实现方式中,指令被配置为使得它们不能被成功地执行,除非密钥字符串或其它秘密值被加载到寄存器中。
[0105] 示例3可以包括示例1至2中任一项的方法,其中,易失性寄存器包括堆栈指针。
[0106] 示例4可以包括示例1至3中任一项的方法,其中,秘密值包括非规范地址。
[0107] 示例5可以包括示例1至4中任一项的方法,其中,后续指令被配置为执行到基于秘密值的地址的间接跳转。
[0108] 示例6可以包括示例1至5中任一项的方法,其中,后续指令被配置为在加载秘密值之后且在间接跳转之前的时间段期间不干扰堆栈指针。
[0109] 示例7可以包括示例1至6中任一项的方法,并且保留堆栈指针中的秘密值,直到对于正确执行后续指令不再需要秘密值为止。
[0110] 示例8可以包括示例1至7中任一项的方法,其中,后续指令被配置为禁止中断、和/或间接跳转、和/或调用/返回指令。
[0111] 示例9可以包括示例1至8中任一项的方法,其中,规定存储区域包括限制存储区域在以下情况下执行:Ring 0访问特权、CPL0保护级别、或其它监督模式。
[0112] 示例10可以包括示例1至9中任一项的方法,其中,将秘密值加载到易失性寄存器中包括将立即值加载到易失性寄存器中。
[0113] 示例11可以包括示例1至10中任一项的方法,其中,执行该组后续指令包括将秘密值变换为有效地址。
[0114] 示例12可以包括示例1至11中任一项的方法,其中,执行该组后续指令包括从堆栈指针中擦除秘密值。
[0115] 示例13可以包括示例1至12中任一项的方法,其中,秘密值包括地址。
[0116] 示例14可以包括示例1至13中任一项的方法,其中,执行该组后续指令包括根据加载在易失性寄存器中的秘密值对地址进行解码。
[0117] 示例15可以包括示例1至14中任一项的方法,其中,执行该组后续指令包括执行到地址的跳转。
[0118] 示例16可以包括示例1至15中任一项的方法,其中,执行该组后续指令包括对地址执行一个或多个加载/存储操作。
[0119] 示例17可以包括示例1至16中任一项的方法,其中,执行该组后续指令包括具有作为操作数的地址的一个或多个MOV指令。
[0120] 示例18可以包括示例1至17中任一项的方法,其中,存储在易失性寄存器中的秘密值包括存储器视图索引,并且其中,处理器被配置为响应于执行VMFUNC指令而至少基于存储器视图索引切换到存储器视图。
[0121] 示例19可以包括示例1至18中任一项的方法,其中,存储在易失性寄存器中的秘密值包括密钥,并且其中,处理器被配置为执行至少基于密钥的密码功能。
[0122] 示例20可以包括示例19中任一项的方法,其中,密码功能包括以下中的一个或多个:对存储器的一部分的内容进行加密,对存储器的一部分的内容进行解密,或者对存储器的一部分的内容进行认证。
[0123] 示例21可以包括示例1至20中任一项的方法,其中,规定存储器区域包括由处理器将对于扩展页表的访问许可设置为以下中的一个:仅执行许可,或仅监督程序执行许可。
[0124] 示例22可以包括示例1至21中任一项的方法,其中,规定存储器区域包括由处理器将对于扩展页表的访问许可设置为禁止读取访问,以及禁止写入访问。
[0125] 示例23可以包括示例1至22中任一项的方法,其中,规定存储器区域包括防止操作系统读取存储器区域,该防止由执行操作系统的处理器执行。
[0126] 示例24可以包括示例1至23中任一项的方法,其中,存储器区域包括这样的存储器:对于存储器一组连续的虚拟存储器地址被映射到一组不连续的机器存储器地址,或一组潜在地不连续的机器存储器地址。
[0127] 示例25可以包括示例1至24中任一项的方法,并且维护从虚拟存储器地址到机器存储器地址的映射。
[0128] 示例26可以包括示例1至25中任一项的方法,其中,管理程序以Ring0访问特权来执行。操作系统由管理程序支持并调用该组指令。操作系统在比Ring 0更受限制的访问保护的情况下执行。
[0129] 示例27可以包括示例1至26中任一项的方法,其中,规定存储器区域由管理程序执行。该组指令是在由管理程序支持的软件中的指令之中的。
[0130] 示例28可以包括示例1至27中任一项的方法,其中,秘密值指示虫洞地址。
[0131] 示例29可以包括示例1至28中任一项的方法,其中,该组指令被配置为不将关于秘密值的信息存储在低安全性软件可访问的存储器中。
[0132] 示例30可以包括示例1至29中任一项的方法,其中,该组指令被配置为不将关于秘密值的信息存储在被配置为执行代码重用攻击的攻击方代码可读取的存储器中。
[0133] 示例31可以包括示例1至30中任一项的方法,其中,攻击方代码被配置为执行以下中的一个或多个:面向返回的编程攻击,或面向跳转的编程攻击。
[0134] 示例32包括用于存储计算机指令的系统。该系统包括存储器和包括一个或多个易失性寄存器的处理器。处理器被配置为规定对存储器的部分的访问,并且执行存储在存储器的第一部分中的第一组指令。第一组指令被配置为使得处理器将秘密值加载到一个或多个易失性寄存器中。处理器被配置为响应于异步事件而丢失加载在易失性寄存器中的信息。
[0135] 示例33可以包括示例32的系统,其中,存储器的第一部分被规定具有仅执行访问。
[0136] 示例34可以包括示例32至33中任一项的系统,以及包括能够由处理器执行的指令的存储介质。指令能够由处理器执行以将第一组指令存储在存储器的第一部分中,并规定存储器的第一部分作为仅执行存储器。
[0137] 示例35可以包括示例32至34中任一项的系统,其中,第一组指令之中的一个或多个早期指令被配置为指示处理器将秘密值加载到易失性寄存器中。第一组指令之中的一个或多个后续指令对于正确执行取决于秘密值。
[0138] 前述描述呈现了各种系统和方法的一个或多个实施例。应当注意,这些实施例和任何其它实施例都是示例性的,并且旨在对本发明进行说明而非进行限制。虽然本发明广泛地应用于各种类型的工艺和技术,但是本领域技术人员将意识到,不可能将本发明的可能的实施例和上下文的全部包括在本公开内容中。
[0139] 此外,本领域技术人员将意识到,上面描述操作的功能之间的界限仅是说明性的。可以将若干操作的功能组合成单个操作,和/或可以将单个操作的功能分布在附加的操作中。此外,替代实施例可以包括特定操作的多个实例,并且可以在各种其它实施例中改变操作的顺序。本领域技术人员将认识到,结合本文公开的实施例描述的说明性逻辑块、模块、电路、动作、以及步骤中的一些可以被实现为硬件、固件、软件或其组合。为了说明硬件、固件、以及软件的这种可互换性,上面已经在一些说明性组件、块、模块、电路、动作、以及步骤的功能方面对其进行了一般性地描述。这种功能是被实现为硬件还是软件取决于特定应用和施加在整个系统上的设计约束。本领域技术人员可以针对每个特定应用以变化的方式实现所描述的功能,但是这种实现决定不应被解释为导致偏离本发明的精神或范围。
[0140] 上面已经描述了一些实施例可以提供的一些益处和优点。这些益处或优点、以及可能使得这些益处或优点发生或变得更加显著的任何元素或限制不应被解释为权利要求中的任何或全部的关键、必需、或必要特征。如本文所使用的,术语“包括”、“包括有”、或其任何其它变型旨在被解释为非排他性地包括这些术语之后的元素或限制。虽然前述描述涉及特定实施例,但是应当理解,实施例是说明性的,并且本发明的范围不限于这些实施例。对上面描述的实施例进行许多变化、修改、添加、以及改进是可能的。
[0141] 硬件元件的示例可以包括处理器、微处理器、电路、电路元件(例如,晶体管、电阻器、电容器、电感器等)、集成电路、专用集成电路(ASIC)、可编程逻辑器件(PLD)、数字信号处理器(DSP)、现场可编程门阵列(FPGA)、逻辑门、寄存器、半导体器件、芯片、微芯片、芯片组等。软件的示例可以包括软件组件、应用程序、操作系统软件、固件、子例程、应用程序接口(API)、或其它、或其任何组合。
[0142] 一些系统或支持系统可以被实现,例如,使用机器可读介质或有形的计算机可读介质或者可以存储指令或一组指令的物品,指令或一组指令如果由机器执行,可以使得机器执行根据实施例的方法和/或操作。指令可以存储在机器可读介质上,例如,磁介质(例如,硬盘、软盘、磁带)、半导体介质(例如,闪存、RAM)、光学介质(例如,CD、DVD)、或其它介质、或其组合。系统的一个或多个方面可以包括存储在机器可读介质上的代表性指令,其代表处理器内的各种逻辑,代表性指令当由机器读取时,可以使得机器制造逻辑以执行本文描述的技术。
[0143] 本文描述的各种动作涉及由电子计算设备执行的操作,其将表示为计算系统的寄存器和/或存储器内的物理量(例如,电子)的数据操纵和/或变换为其它数据,其它数据类似地表示为计算系统的存储器、寄存器或其它这样的信息存储、传输、或显示设备内的物理量。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈