使用密码式计算的精细粒度式栈保护的制作方法

文档序号:30619709发布日期:2022-07-02 02:09阅读:102来源:国知局
使用密码式计算的精细粒度式栈保护的制作方法

1.本公开总体上涉及计算机系统的领域,更具体而言,涉及密码式计算。


背景技术:

2.密码式计算可以指代计算机系统安全解决方案,其在处理器组件的内部采用密码机制以保护由计算系统存储的数据。密码式机制可以用以使用密钥、细调或其他安全机制对数据自身和/或指向数据的指针进行加密。密码式计算是计算行业中的重要趋势,其中,计算自身的真正基础从根本上变为密码式的。密码式计算代表浩瀚的改变,对系统安全性的根本性重新思考,对行业具有广泛影响。
附图说明
3.为了更完整地理解本公开及其特征和优点,结合附图参考以下描述,其中,相同的附图标记代表相同的部分,其中:
4.图1是根据本公开的至少一个实施例的被配置有安全存储器存取逻辑的示例计算设备的简化框图;
5.图2是示出根据本公开的至少一个实施例的图1的安全存储器存取逻辑的应用的简化环境图;
6.图3a是示出根据本公开的至少一个实施例的将广义化的已编码指针绑定到由该指针引用的数据的加密的过程的流程图;
7.图3b是示出根据本公开的至少一个实施例的对绑定到广义化的已编码指针的数据进行解密的过程的流程图;
8.图4是根据本公开的至少一个实施例的示例指针的图;
9.图5是根据实施例的用于对于指针提供安全性的过程的至少一个实施例的简化流程图;
10.图6是根据实施例的用于验证先前已编码指针的过程的至少一个实施例的简化流程图;
11.图7是示出根据至少一个实施例的将密码式已编码指针的一个实施例绑定到由该指针引用的变量的加密的示例过程的流程图;
12.图8是示出根据至少一个实施例的将信息嵌入到所编译的代码中的编译器的简化框图;
13.图9a是示出根据至少一个实施例的将密码式已编码指针绑定到由该指针引用的数据的加密的示例过程的流程图;
14.图9b是示出根据至少一个实施例的用于由密码式已编码指针引用的受加密数据的示例解密过程的流程图;
15.图10是根据实施例的与写入操作有关的示例过程的流程图;
16.图11是根据实施例的与读取操作有关的示例过程的流程图;
17.图12是示出根据至少一个实施例的示例密码式计算环境的框图;
18.图13是示出根据至少一个实施例的示例处理器的框图;
19.图14a是示出根据特定实施例的示例性有序流水线和示例性寄存器重命名、无序发放/执行流水线二者的框图;
20.图14b是示出根据特定实施例的包括于处理器中的有序架构内核的示例性实施例和示例性寄存器重命名、无序发放/执行架构内核二者的框图;
21.图15是根据至少一个实施例的示例计算机架构的框图;以及
22.图16是根据本公开的实施例的对比使用软件指令转换器以将源指令集中的二进制指令转换为目标指令集中的二进制指令的框图。
具体实施方式
23.本公开提供用于使用密码式计算在栈和堆二者存储器分配中实现精细粒度式保护的各种可能的实施例或示例。精细粒度式栈保护实施例可以包括:用变量基和边界信息对指针进行编码,并使用精确边界编码以保护敏感变量。用于栈和堆二者存储器分配中数据的另一精细粒度式保护与基于数据类型的编码有关。在这些实施例中,变量或数据元素的数据类型可以被编码在指向变量的指针中,并且可以用在数据元素的加密和解密在。可以从存取并且潜在地操纵数据的指令推断特定变量的数据类型。
24.包括读取和写入操作的本说明书中公开的至少一些实施例涉及基于指针的数据加密和解密,其中,指向用于数据或代码的存储器位置的指针得以用标签和/或其他元数据(例如,安全上下文信息)编码,并且可以用以导出对数据或代码密码式(例如,加密和解密)算法的细调输入的至少一部分。因此,可以在密码式寻址层与数据/代码加密和解密之间创建密码式绑定。这样隐含地强制边界,因为远离超出对象(例如,数据)的末尾的指针很可能对于该相邻对象使用不正确的标签值。在一个或多个实施例中,用指向存储器位置和元数据的线性地址(本文也称为“存储器地址”)对指针进行编码。在一些指针编码中,指针中地址的切片或分段包括多个比特,并且在秘密地址密钥和基于元数据的细调的基础上得以加密(并且解密)。可以用明文存储器地址(例如,线性地址)和元数据对其他指针进行编码。
25.为了说明用于在强制存储器区域的密码式隔离的同时主动地阻止越界存储器存取的若干实施例的目的,重要的是首先理解与数据保护和存储器安全关联的操作和活动。因此,以下根本信息可以视为可以恰当地解释本公开所依据的基础。
26.已知的计算技术(例如,用于进程/内核分离的页表、虚拟机管理器、所管理的运行时等)已经使用架构和元数据以提供数据保护和隔离。例如,在先前的解决方案中,cpu边界外部的存储器控制器支持按更粗糙粒度性(例如,应用)的存储器加密和解密,并且受加密数据的隔离是经由存取控制实现的。典型地,密码式引擎放置在处于cpu内核外部的存储器控制器中。为了受加密,在对于加密应使用哪些密钥的某种标识的情况下,数据从内核行进到存储器控制器。该标识经由物理地址中的比特进行通信。因此,针对提供附加密钥或细调的任何偏差可能导致增加的费用(例如,对于新总线)或从地址总线正“窃取”的附加比特,以允许用物理地址携带用于密钥或细调的附加索引或标识。存取控制可能需要使用元数据,并且处理器将使用查找表以对用于所有权、存储器大小、位置、类型、版本等的策略或关于数据的数据进行编码。动态地存储并且加载元数据需要附加存储(存储器开销)并且影响
性能,尤其是对于精细粒度元数据(例如,功能即服务(faas)工作负载或对象边界信息)。
27.以下公开提供用于实现密码式计算的各种可能实施例或示例。密码式计算是计算行业中的重要趋势,其中,计算自身的真正基础从根本上变为密码式的。密码式计算代表浩瀚的改变,对系统安全性的根本性重新思考,对行业具有广泛影响。
28.本技术中公开的实施例涉及基于指针的数据加密,其中,指向用于数据的存储器位置的指针用标签和/或其他元数据得以编码,并且可以用以导出对数据密码式(例如,加密和解密)算法的细调输入的至少一部分。因此,在密码式寻址层与数据/代码加密和解密之间创建密码式绑定。这样隐含地强制边界,因为远离超出对象(例如,数据)的末尾的指针很可能对于该相邻对象使用不正确的标签值。在一个或多个实施例中,用指向存储器位置和元数据的线性地址(本文也称为“存储器地址”)对指针进行编码。指针中的地址的切片或分段包括多个比特,并且基于秘密地址密钥和包括元数据的细调受加密(和解密)。参照一些实施例,指针中的存储器地址的该加密的切片在本文中也称为“密文”。可以通过使用基于指针的细调和秘密数据密钥在存储器位置处对数据进行加密实现绑定数据加密和指针。可以从已编码指针和潜在附加上下文信息导出用于对数据进行加密(和解密)的基于指针的细调。具体而言,可以至少部分地基于已编码指针中的地址的所加密的切片(例如,密文)和已编码指针中的元数据创建用于数据的基于指针的细调。在其他实施例中,可以对存储器地址进行解密并且解码,以创建用于对数据进行加密/解密的细调。在至少一些实施例中,也可以在细调中包括与指针分离地存储的上下文信息。
29.在一个或多个实施例中,用于对待嵌入指针中的存储器地址的切片进行加密和解密的不同细调的变型是可能的。例如,不同的和/或附加的上下文信息(例如,各种类型的元数据、密码式上下文标识符、明文存储器地址的部分或其任何合适的组合)可以用在用以在指针中对存储器地址的切片进行加密/解密的细调中。相似地,用于对由已编码指针引用的数据进行加密并且解密的细调的变型也是可能的。在其他实施例中,已编码指针的附加部分可以用在基于指针的细调中,或者完整已编码指针可用作基于指针的细调。此外,在至少一些实施例中,不同的和/或附加的上下文信息(例如,元数据、密码式上下文标识符、明文地址的切片或其任何合适的组合)也可以用在用以对由已编码指针引用的数据进行加密/解密的细调中。
30.为了示出基于指针的数据加密的若干实施例,重要的是,首先理解与数据保护和存储器安全关联的操作和活动。因此,以下根本信息可以视为可以恰当地解释本公开所依据的基础。
31.当前的计算技术(例如,用于进程/内核分离的页表、虚拟机管理器、所管理的运行时等)已经使用架构和元数据以提供数据保护和隔离。例如,在先前解决方案中,处理器将使用查找表以对用于所有权、存储器大小、位置、类型、版本等的策略或关于数据的数据进行编码。动态地存储并且加载元数据需要附加存储(存储器开销)并且影响性能,尤其是对于精细粒度元数据(例如,功能即服务(faas)工作负载或对象边界信息)。
32.密码式计算可以解决许多上述问题(以及更多)。在根本上新的精细粒度保护模型的情况下,密码式计算可以使进程分离、用户空间和内核的遗留模式冗余。在密码式计算的情况下,保护是密码式的,其中,处理器和加速器同样利用秘密密钥和密码以按日渐更精细粒度性提供存取控制和分离。此外,代替当前系统中的虚拟机和进程分离,在密码式计算的
情况下,单独功能可能变为边界,允许经由加密的指针共享地址空间,其中,加密的指针和密钥提供下至单独数据对象的受控存取。
33.本文所公开的密码式计算实施例可以借助密码式寻址层的概念,其中,处理器基于隐式和显式元数据(例如,上下文信息、密码式上下文标识符等)和/或存储器地址自身的切片(例如,作为对可细调分组密码的细调(例如,针对密文窃取的基于xor-加密-xor的细调码本模式(xts)))对软件分配的存储器地址(线性/虚拟地址空间,有时称为“指针”)进行解密。如本文所使用的那样,除了普通明文或密文输入和密钥(例如,秘密密钥116(1))之外,“细调”还可以指代对分组密码的额外输入等。细调包括表示值的一个或多个比特。在一个或多个实施例中,细调可以组成用于分组密码的初始化矢量(iv)的全部或部分。当执行地址的解密时,如果用以创建细调(例如,隐式和显式元数据、存储器地址的明文地址切片等)的信息对应于存储器分配器(例如,软件分配方法)进行的存储器地址的原始分配,则处理器可以正确地对地址进行解密。否则,随机地址结果将引起故障并为处理器所捕获。这些密码式地址(或地址切片)可以进一步由处理器用作对用以对它们引用的数据(由密码式已编码指针引用的数据)进行加密/解密的数据加密密码的细调,在密码式寻址层与数据/代码加密之间创建密码式绑定。应注意,用作对分组密码的输入以对存储器地址进行加密/解密的细调在本文中也称为“地址细调”。相似地,用作对分组密码的输入以对数据进行加密/解密的细调在本文中也称为“数据细调”。
34.通过将元数据以密码方式编码到地址和它们的所引用的数据中,密码式计算可以减少或消除对于额外分离存储器/存储的需要,以提供策略和上下文信息/元数据。归因于单独元数据的减少,这样可以在计算行业中(例如,在动态随机存取存储器(dram)费用方面)节省多达数十亿美元。客户可以在仍然用密码式计算得到他们想要的安全性、平安性和无错误功能的同时收获存储器成本方面的这些节省。通过允许安全推测,密码式计算的根本密码式分离策略可以允许处理器自由地推测并提供增加的性能。
35.在密码式计算中,其中,数据安全从根本上与密码式存储器寻址联系,对数据的处理和精细粒度密码式存取控制是重要的。密码式计算将所有计算矢量从cpu转移到gpu,从加速器转移到fpga,等。在密码式计算的情况下,保护可以是密码式的,其中,处理器和加速器同样利用秘密密钥和密码以按日渐精细的粒度性提供存取控制和分离。此外,代替虚拟机和进程分离,单独功能可能变为边界,地址空间在指针受加密的同时得以共享,其中,密钥提供下至单独数据对象的受控存取。能力可以因此在密码式操作中变为交缠的,以在防止在系统的每一等级的缓冲区上溢、类型混淆和时间(例如,释放后使用)漏洞的同时提供对数据对象的粒度式存取控制。密码式代码可以在本机安全地执行,并且不需要解释器或所管理的运行时以提供存储器和类型安全性。存储器可以从隔离的域和容器移动到全局共享的存储器模型,其中,数据是可基于密码式存取控制机制存取的,并且消失的是难以扩展的分布式许可、分页和关联控制结构。甚至文件也可以安全地直接存储在存储器中(例如,非易失性存储器模块(例如,非易失性双列直插式存储器模块(nvdimm))中),单独地受加密,密码式地受大小化,并且不可因软件错误而破坏。这样可以具有关于功能安全性、可靠性和多租赁的影响,潜在地允许更多推测以用于改进处理性能。
36.密码术继续变得更快和更轻。例如,使用128比特分组密码,高级加密标准(aes)一直是用于数据加密的支柱达数十年。同时,如今,存储器寻址典型地是64比特。可以参照用
于64台计算机的64比特存储器寻址示出并且解释虽然本文实施例,但是所公开的实施例并非旨在受限于此,并且可以容易地适用于容纳用于指针的32比特、128比特或任何其他可用比特大小。同样,本文实施例可以进一步适用于容纳各种大小的分组密码(例如,使用simon、speck、可细调k-密码、prince或任何其他分组密码的64比特、48比特、32比特、16比特等)。
37.适合于指针加密的轻量级密码近来已经显现。例如,prince密码可以实现于在10nm工艺中需要少如799μm2的面积的3个时钟中,在十分之一硅面积中提供aes的时延的一半。密码式计算可以利用这些新密码以及其他密码,引入新颖计算机架构概念,包括但不限于:(i)密码式寻址(即,使用关于所引用的数据(例如,嵌入指针中的元数据和/或外部元数据)、地址自身的切片或其任何合适组合的上下文信息作为细调的处理器处的数据指针的加密);和(ii)使用密码式已编码指针或其部分、非密码式已编码指针或其部分、关于引用数据的上下文信息或其任何合适的组合作为用于数据加密的细调的内核处的数据自身的加密。出于包括元数据(例如,计数器模式(ctr)和针对密文窃取的基于xor-加密-xor(xex)的细调码本模式(xts))的这种目的,可以使用可细调的各种加密模式。除了提供数据机密性的加密之外,其隐式完整性也可以允许处理器确定是否正使用正确的密钥流和细调恰当地对数据进行解密。在一些分组密码加密模式下,分组密码创建密钥流,其然后(例如,使用xor运算)与输入分组组合,以产生加密的或解密的分组。在一些分组密码中,密钥流馈送到下一分组密码中,以执行加密或解密。
[0038]“元数据墙”可以指代附加地获取关于存储器操作(例如,存取控制、对象类型/大小和版本)的元数据的问题。如今的计算机架构要求处理器查找元数据或关于数据的数据,以确定是否允许存储器存取。用于元数据的附加存储器存取可能影响性能,用于元数据的附加存储是需要的,并且元数据自身需要受保护以提供安全性。以硬件将用以检测缓冲区上溢的边界表的形式添加元数据的一些当前解决方案已经示出对于一些工作负载具有带有400%存储器开销的高达4倍性能影响。相似地,影子栈元数据赋能控制流强制技术,并且存储器标签化使用元数据以用于版本化,而且能力添加元数据以用于验证数据类型。存储器标签化不适合于减轻类型混淆以及防止未初始化的使用变量。此外,虽然使用纠错码比特可以减少存储器标签化的开销,但是它可能仍然需要附加设备,这可能增加成本。能力机器也可以使用胖指针以嵌入与指针内联的安全元数据,归因于将指针大小加倍而施加实质性存储器开销(例如,指针重型应用中的25%)。
[0039]
与之对比,密码式计算可以提供编纂用于密码式寻址和数据、密码式寻址和代码或其组合的细调的元数据,消除因包括该元数据而引起的潜在性能和存储器开销。所得密文可以无需超越密钥的附加保护,允许反复使用与数据相同的存储器。如本文进一步讨论的,密码式计算可以使用计算而不是存储器通过相同的统一机制解决无数的漏洞。
[0040]
图1是根据本公开的至少一个实施例的被配置有安全存储器存取逻辑的示例计算设备100的简化框图。在所示示例中,计算设备100包括处理器102,其具有安全存储器存取逻辑150的集合和数个寄存器110。安全存储器存取逻辑150利用关于间接地址114的元数据,其编码为间接地址114的未使用的比特(例如,64比特地址的非正规比特,或例如由操作系统留出的地址范围,以使得地址范围的对应高阶比特可以用以存储元数据),以保护和/或提供对由间接地址114指向的存储器位置的存取控制。例如,由安全存储器存取逻辑150
提供的元数据编码和解码可以防止间接地址114被操纵以引起缓冲区上溢,和/或可以防止程序代码存取它没有对存取的许可的存储器。安全存储器存取逻辑150的地址编码逻辑152当存储器受分配时(例如,由操作系统,在堆中)调用,并以任何数种不同方式(包括:通过使用函数(例如,malloc、alloc或new);或经由加载程序以隐式方式,或由编译器静态地分配存储器等)提供给执行中的程序。结果,用地址元数据对指向所分配的存储器的间接地址114进行编码。
[0041]
地址元数据可以包括有效范围元数据。有效范围元数据允许执行中的程序在有效范围内操纵间接地址114的值,但是如果使用超越有效范围的间接地址114存取存储器,则将破坏间接地址114。替代地或附加地,有效范围元数据可以用以标识有效代码范围(例如,许可存取程序代码的存储器的范围(例如,所编码的范围信息可以用以在寄存器上设置显式范围))。可在地址元数据中编码的其他信息包括对间接地址114的存取(或许可)限制(例如,间接地址114是否可以用以写入、执行或读取所引用的存储器)。
[0042]
本文将进一步描述的至少一些其他实施例中,可以在间接地址114的未使用的比特中对其他元数据(或上下文信息)(例如,明文地址切片的大小(例如,间接地址中嵌入的存储器地址的明文切片中的比特的数量)、存储器分配大小(例如,由间接地址引用的所分配的存储器的字节)、数据或代码的类型(例如,由编程语言定义的数据或代码的类)、许可(例如,间接地址的读取、写入和执行许可)、数据或代码的位置(例如,存储数据或代码的地方)、待存储指针自身的存储器位置、数据或代码的所有权、间接地址的版本(例如,每次对于新分配的存储器创建间接地址就递增的序列号,及时确定所引用的所分配的存储器的当前所有权)、(例如,关于与间接地址关联而生成的)随机化比特的标签、特权等级(例如,用户或管理员)、密码式上下文标识符(或密式上下文id)(例如,用于每个间接地址的随机化或确定性唯一值)等)进行编码。例如,在一个实施例中,地址元数据可以包括对间接地址中的明文地址切片的大小进行编码的大小元数据。大小元数据可以指定可以由执行中的程序修改的间接地址中的最低阶比特的数量。大小元数据取决于由程序请求的存储器的量。因此,如果请求16个字节,则将大小元数据编码为4(或指针的5个高比特中的00100),并且将指针的4个最低比特指定为可修改的比特,以允许寻址到存储器的所请求的16个字节。在一些实施例中,地址元数据可以包括与间接地址关联的随机化比特的标签,以使标签对于敌手是不可预测的。敌手可以尝试猜测标签值,以使得敌手能够存取由指针引用的存储器,并且与用于生成标签的确定性方法相比,将标签值随机化可以使敌手成功地猜测值成为较不可能的。在一些实施例中,代替随机化的标签值或除此之外,指针可以包括及时确定所引用的所分配的数据的当前所有权的版本号(或其他确定性地不同的值)。即使敌手能够猜测用于存储器的区域的当前标签值或版本号,例如,因为用于生成版本号的算法是可预测的,所以归因于敌手没有对稍后将用以对指针的该部分进行解密的密钥的存取,敌手也可能仍然不能正确地生成指针的对应受加密部分。
[0043]
地址解码/解密逻辑154关于利用处理器指令的存储器读取和写入操作(例如,mov,其中,通用寄存器用作存储器地址,以从存储器读取值(例如,加载)或将值写入存储器(例如,存储))以及涉及存储器的“使用”的操作(例如,具有存储器操作数的算术指令(例如,add)和控制转移指令(例如,call/jmp)等)验证所编码的元数据。它们看作存储器操作数,其可以指定存储用于控制转移的目标地址的存储器中的位置。示例安全存储器存取逻
辑150体现为处理器指令的部分(例如,体现为处理器指令集架构的部分)或微代码(例如,存储在只读存储器中并由处理器102直接执行的指令)。在其他实施例中,安全存储器存取逻辑150的部分可以体现为硬件、固件、软件或其组合(例如,体现为由计算设备100的特权化系统组件142执行的编程代码)。例如,安全存储器存取逻辑150可以在软件中体现为指令集仿真器(例如,二进制仪器工具(例如,pin工具)),其使用如本文所公开的所编码的地址仿真指令逻辑。
[0044]
安全存储器存取逻辑150可由计算设备100执行,以例如在由计算设备100执行程序(例如,用户空间软件应用)期间“内联”提供关于间接地址的安全性。如本文所使用的那样,术语“间接地址”和“指针”可以均指代存储其他数据或指令的存储器位置的地址(例如,虚拟地址或线性地址)等。在示例中,对存储数据或代码的存储器位置的所编码的存储器地址进行存储的寄存器可以充当指针。故此,间接地址114可体现为例如数据指针(其指代数据的位置)、代码指针(其指代可执行代码的位置)、指令指针或栈指针。间接地址可以由其他术语(例如,“指针”、“地址指针”或“指针地址”)指代。如本文所使用的那样,“元数据”可以指代关于或涉及间接地址114的信息(例如,有效数据范围、有效代码范围、指针存取许可、(例如,在比特中编码为幂的)明文地址切片的大小、存储器分配大小、数据或代码的类型、数据或代码的位置、数据或代码的所有权、间接地址的版本、随机化比特的标签、版本、软件的特权等级、密码式上下文标识符等)等。
[0045]
如本文所使用的那样,“存储器加载”可以指代“mov”、“load”或“pop”指令、或使数据在一个存储位置(例如,存储器)得以读取、拷贝或以其他方式存取并移动到另一存储位置(例如,寄存器)的任何其他指令(其中,“存储器”可以指代主存储器或缓存(例如,随机存取存储器),并且“寄存器”可以指代处理器寄存器(例如,硬件))、或存取或操纵存储器的任何指令等。同样如本文所使用的那样,“存储器存储”可以指代“mov”、“store”或“push”指令、或使数据在一个存储位置(例如,寄存器)中得以读取、拷贝或以其他方式存取并移动到另一存储位置(例如,存储器)的任何其他指令、或存取或操纵存储器的任何指令等。
[0046]
然而,本文公开的间接地址编码/解码技术不限于mov或加载/存储指令。例如,控制转移指令(例如,调用和跳转指令)可以适用于以与本文关于mov指令描述的相似的方式处置已编码间接地址,其中,代码用于在有效地址范围内执行。类似地,指令指针(例如,寄存器)可以是范围绑定的,给定由控制转移指令(例如,jmp/call)指定的所编码地址导致所编码的地址用于指令指针,因此将有效的程序执行限制在有效的地址范围内(实际上,程序计数器可以正确地递增,直到到达所编码的范围的末尾)。此外,在一些架构中,任何数量的处理器指令可以具有呈间接地址的形式的存储器操作数(例如,算术运算(例如,add、sub、mul、and、or、xor等)可以具有呈间接地址和/或源/目标寄存器操作数的形式的源/目标存储器引用)。然而,在其他架构中,存储器操作数的格式可以变化。例如,可以通过某种方式(例如,通过加法)组合寄存器以产生有效地址。附加地,可以可选地包括其他参数(例如,乘以寄存器值之一(例如,索引)的缩放因子和/或直接相加的指令中嵌入的常数位移值)。此外,应注意,虽然说明性实施例指代“指令”,但是这些指令可以体现为例如处理器指令、操作系统例程或其他形式的计算机程序代码。
[0047]
示例安全存储器存取逻辑150包括地址编码/加密逻辑152(其可以包括用于执行元数据编码和地址加密的逻辑)、加密存储逻辑156和解密读取逻辑158。说明性地,虽然地
址解码/解密逻辑154(其可以包括用于从已编码指针解密并且形成线性地址的逻辑)可以体现于加密存储逻辑156和解密读取逻辑158中,但是可以体现于其他处理器指令中,或体现为单独指令或指令系列,或体现为由特权化系统组件(例如,操作系统内核或虚拟机监控器)执行的高级代码,或体现为指令集仿真器。如下文更详细描述的那样,地址编码逻辑152和地址解码/解密逻辑154均使用元数据(例如,有效范围、许可元数据、大小(幂)、存储器分配大小、类型、位置、所有权、版本、标签值、特权等级(例如,用户或管理员)、密式上下文id等中的一个或多个)和秘密密钥(例如,秘密密钥116(1))对间接地址114进行操作,以在存储器分配/存取等级保护间接地址114。同样如下文更详细描述的那样,加密存储逻辑156和解密读取逻辑158均使用间接地址的至少一部分和秘密密钥(例如,秘密密钥116(2))对(由间接地址114引用的)数据进行操作,以通过将数据加密绑定到间接地址保护由间接地址114引用的存储器位置处的数据。
[0048]
示例间接地址114体现为寄存器110(例如,处理器102的通用寄存器)。通常,可以基于特定需要和架构实现方式以任何合适的方式处置密钥116(1)-116(n)和细调117。密钥和细调可以存储在寄存器110或存储器120中。
[0049]
示例秘密密钥116(1)-116(n)可以由特权化系统组件142的密钥创建模块148生成,并且存储在寄存器110之一(例如,专用寄存器或机器特定的寄存器(msr))或可由处理器102读取的另一存储器位置中。在一些实施例中,秘密密钥116(1)-116(n)可以存储在仅可由处理器读取的位置中。在其他实施例中,用以保护间接地址、数据和代码的秘密密钥116(1)-116(n)可以存储在另一存储器位置(例如,固件、数据存储设备126或另一数据存储设备的安全部分、或适合于执行本文描述的功能的另一形式的存储器)中。在一些实施例中,秘密密钥116(1)-116(n)可以跨越安全通信信道得以发送,并且由执行程序(例如,操作系统或虚拟机监控器(例如,以下描述的特权化系统组件142))恢复。在虚拟机从一台机器迁移到另一台机器的虚拟化环境中,和/或在计算设备100上运行的虚拟机、进程或程序在间接地址和所引用的数据/或代码使用秘密密钥受保护之后开始睡眠/休眠模式并且然后在稍后续用的情况下,将需要复原并且恢复秘密密钥。在这些情况下,秘密密钥可以在睡眠/休眠模式之前得以存储或可能地跨越(安全)通信信道得以发送,然后由执行程序(例如,操作系统或虚拟机监控器(例如,特权化系统组件142))检索/恢复。
[0050]
应注意,本文描述的实施例允许任何数量的秘密密钥用于特定程序。在一个示例中,相同的秘密密钥可以用于程序中所使用的所有间接地址。在另一示例中,不同的密钥可以用于与不同存储器分配关联的每个间接地址,或用于与不同存储器分配关联的每个预定存储器地址群组。在又进一步的实施例中,用于地址加密/解密的相同秘密密钥也可以用于对绑定到该地址的数据进行加密。在其他实施例中,一个秘密密钥可以用于地址加密/解密,而不同的密钥可以用于绑定到该地址的数据加密/解密。为了易于解释,本文进一步描述的实施例指代“秘密地址密钥”或“地址密钥”以指代存储器地址的加密和解密操作中的秘密密钥的使用,并且指代“秘密数据密钥”或“数据密钥”以指代用于对数据进行加密并且解密的操作中的秘密密钥的使用。
[0051]
在存储器分配操作(例如,“malloc”)时(或期间),存储器分配逻辑146对于缓冲区分配存储器的范围并返回间接地址114和元数据(例如,范围、许可元数据、大小(幂)、存储器分配大小、类型、位置、所有权、版本、标签、特权等级、密式上下文id等中的一个或多个)。
例如,存储器分配逻辑146可以对间接地址114中(例如,在加密之前,未使用的/非正规比特中)的明文范围信息进行编码,或者将元数据作为一个或多个分离参数提供给指令,其中,参数指定范围、代码许可信息、大小(幂)、存储器分配大小、类型、位置、所有权、版本、标签、特权等级(例如,用户或管理员)、密式上下文id或其某种合适的组合。说明性地,存储器分配逻辑146体现于特权化系统组件142的存储器管理器模块144中。存储器分配逻辑146发起地址编码逻辑152。地址编码逻辑152包括元数据编码逻辑156,例如,如果对范围元数据进行编码,则其用元数据(例如,范围、许可元数据、大小(幂)、存储器分配大小、类型、位置、所有权、版本、标签值、特权等级、密式上下文id、其某种合适的组合等)以及潜在地“调整”对间接地址114进行编码,如下所述。地址编码逻辑152将元数据存储在间接地址114的未使用部分(例如,64比特地址的非正规比特)中。对于一些元数据或元数据组合,可以在更大的地址空间(例如,128比特地址、256比特地址)中对间接地址114进行编码,以容纳元数据或元数据组合的大小。
[0052]
为了确定有效范围元数据,示例范围规则逻辑选择有效范围元数据,以指示用于由间接地址114引用的缓冲区的大小的上限。地址调整逻辑根据需要调整有效范围元数据,以使得只要间接地址114引用处于由范围元数据指示的有效范围内的存储器位置,地址范围中的地址的高地址比特(例如,最高有效比特)就不改变。这样赋能间接地址114(例如,由执行算术运算的软件等)操纵,但是仅只要操纵不使间接地址114超出有效范围(例如,上溢缓冲区)。
[0053]
在实施例中,地址编码/加密逻辑152使用有效范围元数据以选择待加密的间接地址114的部分(或切片)。在其他实施例中,待加密的间接地址114的切片可以是先验已知的(例如,高32比特、低32比特等)。地址编码/加密逻辑152使用秘密地址密钥116(1)和地址细调对间接地址114的所选择的切片(以及在一些实施例中,调整)进行加密,如下文进一步描述的那样。在存储器存取操作(例如,读取、写入或执行操作)时,地址解码/解密逻辑154对先前已编码间接地址114进行解码。为此,地址解码/解密逻辑154使用秘密密钥116(1)和地址细调对间接地址114的受加密切片(并且在一些实施例中,受加密调整)进行解密,如下文进一步描述的那样。
[0054]
间接地址114基于适当的操作返回其原始(例如,正规)形式,以恢复间接地址114的原始值(例如,真实的原始线性存储器地址)。为了在至少一个可能实施例中进行该操作,可以移除间接地址114的未使用的比特中所编码的地址元数据(例如,将未使用的比特返回它们的原始形式)。如果间接地址114成功地进行解码,则存储器存取操作成功地完成。然而,如果已编码间接地址114已经(例如,由软件、疏忽地、或由敌手)操纵,以使得其值落在由范围元数据指示的有效范围之外(例如,上溢缓冲区),则作为由地址解码/解密逻辑154执行的解密过程的结果,间接地址114将受破坏。受破坏的间接地址将引起故障(例如,如果地址并未从分页结构/页表映射为存在,则普通保护故障或页故障)。可能导致生成故障的一种状况是稀疏地址空间。在此情况下,受破坏的地址很可能着落在未映射的页上并生成页错误。以此方式,安全存储器存取逻辑150赋能计算设备100提供对抗缓冲区上溢攻击和相似利用的间接地址安全性。本文公开的间接地址安全技术的实施例也可以用于软件调试目的,或用作存取控制机制,以防止软件存取软件没有许可的存储器的区域。附加地,与其他缓冲区上溢缓解技术相比,所公开的间接地址安全技术的实施例可以在没有任何附加存
储器读取/写入的情况下、或在没有任何附加指令的情况下、或在没有任何二进制修改的情况下、或在无需重新编译遗留代码的情况下进行操作。此外,所公开的技术的实施例响应于可能读取存储器并且盖写指针值的敌手以及可能创建/选择任意指针值的敌手。此外,所公开的技术的实施例可以从非常小的存储器范围扩展到非常大的存储器范围,或者可以通过使用不同的已编码指针级联其他存储器范围内的存储器范围。更进一步地,(例如,归因于用于以编程方式内联创建范围已编码指针的能力),所公开的技术的实施例针对动态存储器分配是有效的。附加地,所公开的技术的实施例可以扩展为提供对数据的代码块(代码位置)存取控制。此外,所公开的技术的实施例通过保留用于包含地址的元数据的地址范围兼容于x86指令集的64比特版本以及arm、mips、powerpc和其他处理器架构(包括更宽(例如,大于64比特)地址比特架构和更小(例如,32比特)架构)。
[0055]
所公开的技术的一些实施例利用地址调整逻辑和地址恢复逻辑的方面以支持遗留代码兼容性,如下所述。如本文所使用的那样,“遗留代码”可以指代被设计为在较早的、现在过时的或不再受支持的计算机架构上工作的计算机代码的版本。例如,遗留代码可以包括最初对于32比特处理器开发但是现在运行在64比特处理器上的软件。“遗留代码”还指代在不使用或适用于使用专用指令以用于对本文描述的间接地址进行编码并且加密的情况下设计的计算机代码的版本。可以在不使用新程序指令的情况下并且因此在不需要重新编译遗留代码的情况下实现本文所公开的至少一些实施例。
[0056]
现在更详细地参照图1,计算设备100可以体现为用于执行本文描述的功能的任何类型的电子设备。例如,计算设备100可以体现为但不限于智能电话、平板计算机、可穿戴计算设备、膝上型计算机、笔记本计算机、移动计算设备、蜂窝电话、手机、消息传送设备、车辆遥测设备、服务器计算机、工作站、分布式计算系统、多处理器系统、消费者电子设备和/或被配置为执行本文描述的功能的任何其他计算设备。如图1所示,示例计算设备100包括至少一个处理器102,其体现有安全存储器存取逻辑150。
[0057]
计算设备100还包括存储器122、输入/输出子系统124、数据存储设备126、显示设备128、用户接口(ui)子系统130、通信子系统132、至少一个用户空间应用134和特权化系统组件142(其说明性地包括存储器管理器模块144和密钥创建模块148)。在其他实施例中,计算设备100可以包括其他或附加组件(例如,一般在移动和/或固定计算机中发现的组件(例如,各种传感器和输入/输出设备))。附加地,在一些实施例中,示例组件中的一个或多个可以并入另一组件中或以其他方式形成其部分。计算设备100的组件中的每一个可以体现为软件、固件、硬件或软件和硬件的组合。
[0058]
处理器102可以体现为能够执行本文描述的功能的任何类型的处理器。例如,处理器102可以体现为多核处理器、其他多cpu处理器或处理/控制电路、或多个各样处理单元或电路(例如,cpu和gpu等)。处理器102具有数个寄存器110,其包括通用寄存器和专用寄存器。间接地址114和秘密密钥116(1)-116(n)存储在寄存器110中。计算设备100的存储器122可以体现为能够执行本文描述的功能的任何类型的易失性或非易失性存储器或数据存储。在操作中,存储器122可以存储在计算设备100的操作期间所使用的各种数据和软件以及操作系统、应用、程序、库和驱动程序。
[0059]
存储器122例如经由i/o子系统124以通信方式耦合到处理器102。i/o子系统124可以体现为电路和/或组件,以促进与处理器102、存储器122和计算设备100的其他组件的输
入/输出操作。例如,i/o子系统124可以体现为或以其他方式包括存储器控制器集线器、输入/输出控制集线器、固件设备、通信链路(即,点到点链路、总线链路、导线、电缆、光导、印制电路板迹线等)和/或其他组件和子系统,以促进输入/输出操作。在一些实施例中,i/o子系统124可以形成片上系统(soc)的部分,并且连同处理器102、存储器122和/或计算设备100的其他组件一起合并于单个集成电路芯片上。
[0060]
数据存储设备126可以体现为任何类型的物理设备或被配置用于数据的短期或长期存储的设备(例如,比如存储设备和电路、存储卡、硬盘驱动器、固态驱动器、闪存或其他只读存储器、作为只读存储器和随机存取存储器的组合的存储器设备、或其他数据存储设备)。
[0061]
显示设备128可以体现为能够显示数字信息的任何类型的显示器(例如,液晶显示器(lcd)、发光二极管(led)、等离子体显示器、阴极射线管(crt)或其他类型的显示设备)。在一些实施例中,显示设备128可以耦合到触摸屏或其他人机接口设备,以允许用户与计算设备100的交互。显示设备128可以是用户接口(ui)子系统130的部分。用户接口子系统130可以包括包含物理或虚拟控制按钮或键、麦克风、扬声器、单向或双向静止图像和/或视频像机等的数个附加设备,以促进用户与计算设备100的交互。用户接口子系统130可以还包括诸如运动传感器、接近度传感器和眼睛跟踪设备之类的设备,其可以被配置为检测、捕获并且处理涉及计算设备100的各种其他形式的人类交互。
[0062]
计算设备100还包括通信子系统132,其可以体现为能够赋能计算设备100与其他电子设备之间的通信的任何通信电路、设备或其集合。通信子系统132可以被配置为使用任何一种或多种通信技术(例如,无线或有线通信)和关联协议(例如,以太网、蓝牙
tm
、wi-fi
tm
、wimax、3g/lte等)以实行该通信。通信子系统132可以体现为网络适配器(包括无线网络适配器)。
[0063]
示例计算设备100还包括数个计算机程序组件(例如,用户空间应用134和特权化系统组件142)。用户空间应用134可以体现为经由例如显示设备128或ui子系统130与终端用户直接或间接进行交互的任何计算机应用(例如,软件、固件、硬件或其组合)。用户空间应用134的一些示例包括文字处理程序、文档查看器/阅读器、网络浏览器、电子邮件程序、消息传送服务、计算机游戏、相机和视频应用等。此外,特权化系统组件142促进用户空间应用134与计算设备100的硬件组件之间的通信。特权化系统组件142的部分可以体现为能够执行本文描述的功能的任何操作系统(例如,microsoft公司的windows的版本、google公司的android等)。替代地或附加地,特权化系统组件142的部分可以体现为能够执行本文描述的功能的任何类型的虚拟机监控器(例如,类型i或类型ii管理程序)。
[0064]
示例特权化系统组件142包括数个计算机程序组件(例如,存储器管理器模块144和密钥创建模块148)。特权化系统组件142的组件中的每一个可以体现为软件、固件、硬件、或软件和硬件的组合。例如,特权化系统组件142的组件可以体现为操作系统内核、虚拟机监控器或管理程序的模块。存储器管理器模块144将存储器122的部分分配给计算设备100上运行的各种进程(例如,作为虚拟存储器地址的范围)。存储器管理器模块144体现为例如加载器、存储器管理器服务或堆管理服务。密钥创建模块148创建秘密密钥116(1)-116(n)(例如,秘密地址密钥和秘密数据密钥),并且将它们写入处理器102具有读取存取的一个或多个寄存器(例如,专用寄存器)。为了创建密钥,密钥创建模块148可以执行例如随机数生
成器或能够生成可以执行本文描述的功能的密钥的另一算法。
[0065]
应注意,可以使用无数方法以生成或获得用于本文公开的实施例的密钥。例如,虽然密钥创建模块148示出为计算设备100的部分,但是可以使用任何合适的认证过程从任何合适的外部源获得一个或多个秘密密钥,以将密钥安全地传递到计算设备100,这可以包括:生成密钥作为这些过程的部分。此外,特权化系统组件142可以是可信执行环境(tee)、虚拟机、处理器102、协处理器(未示出)或计算设备100中的或安全地连接到计算设备100的任何其他合适的硬件、固件或软件的部分。此外,密钥可以是“秘密的”,这旨在意指着其值保持隐藏、不可存取、混淆或以其他方式受保护以防未授权的行动方(例如,软件、固件、机器、无关的硬件组件和人类)。
[0066]
图2是示出根据本公开的至少一个实施例的图1的安全存储器存取逻辑150的应用的简化环境图。在一些实施例中,计算设备100可以在操作期间建立环境200(例如,本机和/或虚拟运行时或“执行”环境)。示例环境200中描绘的各种模块可以体现为硬件、固件、软件或其组合。在环境200中,用户空间应用134(或特权化系统组件142(例如,在加载用户空间应用134中))可以随着时间而在计算设备100的操作期间发放存储器分配202。在一些示例中,存储器分配202可以是程序中的显式存储器分配(例如,用于动态存储器分配),并且可以由特权化系统组件142的存储器分配逻辑146根据需要转译(例如,编译或解释),然后传递到处理器102。在其他场景中,存储器分配可以是程序中的特定指令对存储器的隐式请求。例如,调用需要用于局部变量的栈存储器的函数、将参数传递给函数、声明局部变量可以是对关于需要存储的特定对象或数据元素(例如,返回的地址,传递的参数,局部变量数据)待在栈中分配的存储器的隐式请求。
[0067]
在处理器102中,响应于存储器分配202(例如,代替用于动态存储器分配的常规“malloc”指令/函数调用,或代替用于栈的隐式存储器分配操作)执行地址编码逻辑152。地址编码逻辑152对包括元数据205(例如,范围许可信息、大小(幂)、存储器分配大小、类型、位置、所有权、版本、标签、特权等级、密式上下文id或密钥、或其任何组合等)的间接地址204进行编码,如本文所述,并返回已编码间接地址206。元数据可以呈明文格式嵌入间接地址或指针(例如,标准64比特寄存器或扩大的寄存器(例如,128比特或256比特)以配合更多元数据)中,嵌入提供给指针加密/解密指令和数据存取指令的另一操作数内,存储在控制寄存器中,存储在存储器中的表中,或经由它们的任何组合得以提供。例如,大小(幂)元数据和标签值可以嵌入指针中,并且密式上下文id可以存储在控制寄存器中。
[0068]
相似地,用户空间应用134或特权化系统组件142可以随着时间而发放存储器存储220,其可以由处理器102处置为从寄存器110(或其他存储单元)读取并使用间接地址114写入存储器122或缓存的处理器指令(例如,store、mov指令、变量的声明或赋值)。使用store指令作为示例,当地址解码逻辑(例如,154)已经成功地对已编码间接地址进行解码时,加密存储逻辑156存储数据。加密存储逻辑156还使待存储在由间接地址204指向的(堆或栈中的)存储器位置的数据基于数据细调和秘密数据密钥116(2)得以加密。地址解码逻辑154的成功执行基于间接地址中的密文的成功解密,其中,解密使用地址细调和秘密地址密钥116(1)以对已编码间接地址206的所加密的密文进行解密。
[0069]
相似地,用户空间应用134或特权化系统组件142可以随着时间而发放存储器加载230,其可以由处理器102处置为从存储器122(例如,用于加载的堆、用于弹出的栈)读取并
使用间接地址114写入寄存器110的处理器指令(例如,load、mov或pop指令)。使用load指令作为示例,解密读取逻辑158仅在成功地执行地址解码逻辑(例如,154)以对已编码间接地址206进行解码之后执行存储器存取。地址解码逻辑154的成功执行基于间接地址中的密文的成功解密,其中,解密使用地址细调和秘密地址密钥116(1)以对已编码间接地址206的所加密的密文进行解密。一旦获得间接地址204并且存取存储器122以从由间接地址204指向的存储器位置加载数据,解密读取逻辑158就可以基于数据细调和秘密数据密钥116(2)对所加载的数据进行解密。成功解密取决于用以创建数据细调以对数据进行解密的间接地址的部分以及用以创建数据细调的附加元数据(如果有)是否对应于由间接地址指向的存储器位置的原始分配。
[0070]
应理解,地址解码/解密逻辑154可以并入(例如,指令集架构的)指令逻辑,或者可以体现为单独指令集或多个指令。此外,应理解,替代地或除了load、store、mov和pop指令(例如,具有存储器操作数、call、jmp等的算术指令)之外,地址解码/解密逻辑154还可以并入其他类型的指令中或者为其所引用。例如,控制转移指令(例如,call、jmp等)可以将用于代码执行的已编码指针地址加载到处理器的程序计数器寄存器(例如,指令指针)(例如,rip,其中,rip是64比特代码中的指令指针寄存器)中。程序可以然后查询指令指针寄存器,并且因此,当前程序计数器地址将是所编码的形式(偏移到当前程序计数器位置)。
[0071]
如果地址解码/解密逻辑154成功地对已编码间接地址206进行解码(其包括已编码间接地址中的受加密密文的成功解密),则原始间接地址204返回到特权化系统组件142,并且存储器存取完成,或者程序执行开始于新的程序计数器位置处(在控制流程更改的情况下)。如果已编码间接地址206并未成功地解码,则引起故障。基于存储器存储220的成功完成或失败,适当的验证或故障信号213返回到用户空间应用134。相似地,基于存储器加载230的成功完成或失败,适当的验证或故障信号222是返回到用户空间应用134。
[0072]
图3a是示出基于已编码指针310(其也可以称为已编码间接地址)的实施例的密码式计算的普通过程300a的简化流程图。过程300a示出根据至少一个实施例的将数据存储(例如,写入、推送)到由已编码指针310指示的存储器地址处的存储器区域,其中,数据的加密和解密绑定到指针的内容。计算设备100的硬件、固件和/或软件可以执行过程300a的至少一些部分。在所示示例中,已编码指针310是间接地址114的示例,并且体现为包括元数据部分的已编码线性地址。元数据部分是某种类型的上下文信息(例如,大小/幂元数据、标签、版本等),并且线性地址可以通过任何数量的可能配置(本文描述其中的至少一些)得以编码。
[0073]
根据各种实施例,已编码指针310可以具有各种配置。例如,已编码指针310可以用明文线性地址得以编码,或可以用一些明文线性地址比特和一些受加密线性地址比特得以编码。已编码指针310也可以取决于特定实施例用不同的元数据得以编码。例如,已编码指针310中所编码的元数据可以包括但不一定限于大小/幂元数据、标签值或版本号中的一个或多个。
[0074]
通常,过程300a示出密码式计算流程,其中,已编码指针310用以获得用于待存储数据的存储器320的存储器区域的存储器地址,并用以至少部分地基于从已编码指针310导出的细调对于待存储的数据进行加密。首先,地址密码术单元302对已编码指针310进行解码,以获得已解码线性地址312。已解码线性地址312可以用以使用转译后备缓冲区304或页
表(未示出)获得存储器320中的物理地址314。至少部分地从已编码指针310导出数据细调317。例如,数据细调317可以包括完整已编码指针、已编码指针的一个或多个部分、已解码线性地址的部分、完整已解码线性地址、所编码的元数据和/或外部上下文信息(例如,未在指针中编码的上下文信息)。
[0075]
一旦已经从已编码指针310导出细调317,密码式计算引擎370就可以通过基于数据密钥316和数据细调317对未加密数据322进行加密计算受加密数据324。在至少一个实施例中,密码式计算引擎370包括加密算法(例如,密钥流生成器),其可以按特定大小粒度性(任何合适的大小)体现为aes-ctr模式分组密码372。在该实施例中,数据细调317可以用作初始化矢量(iv),并且已编码指针310的明文偏移可以用作计数器值(ctr)。密钥流生成器可以对数据细调317进行加密,以产生密钥流376,并且然后密码式操作(例如,逻辑函数374(例如,异或(xor))或其他更复杂的操作)可以对未加密的数据322和密钥流376得以执行,以生成受加密数据324。应注意,在正从已编码指针310获得物理地址314的同时,密钥流376的生成可以开始。因此,并行操作可以增加对未加密的数据进行加密的效率。应注意,在存储到存储器320之前或在一些实例中代替存储到存储器320,受加密数据可以存储到缓存(例如,170)。
[0076]
图3b是示出基于已编码指针310的实施例的密码式计算的普通过程300b的简化流程图。过程300b示出在由已编码指针310引用的存储器处地址获得(例如,读取、加载、获取、弹出)存储器区域中存储的数据,其中,根据至少一个实施例,数据的加密和解密绑定到指针的内容。计算设备100的硬件、固件和/或软件可以执行过程300b的至少一些部分。
[0077]
通常,过程300b示出密码式计算流程,其中,已编码指针310用以获得用于存储受加密数据的存储器320的存储器区域的存储器地址,并且一旦受加密数据从存储器区域得以获取,就至少部分地基于从已编码指针310导出的细调对受加密数据进行解密。首先,地址密码术单元302对已编码指针310进行解码,以获得用以从存储器获取受加密数据324的已解码线性地址312,如在332所指示的那样。至少部分地从已编码指针310导出数据细调317。在用于从存储器加载/读取数据的该过程300b中,以与用于向存储器存储/写入数据的反向过程300a中相同的方式导出数据细调317。
[0078]
一旦已经从已编码指针310导出细调317,密码式计算引擎370就可以通过基于数据密钥316和数据细调317对受加密数据324进行解密计算所解密的(或未加密的)数据322。如先前所描述的那样,在该示例中,密码式计算引擎370包括加密算法(例如,以特定大小粒度性(任何合适的大小)体现为aes-ctr模式分组密码372的密钥流生成器)。在该实施例中,数据细调317可以用作初始化矢量(iv),并且已编码指针310的明文偏移可以用作计数器值(ctr)。密钥流生成器可以对数据细调317进行加密以产生密钥流376,并且然后密码式操作(例如,逻辑功能374(例如,异或(xor)或其他更复杂的操作))可以对受加密数据324和密钥流376得以执行,以生成解密的(或未加密的)数据322。应注意,在受加密数据在332正被获取的同时,密钥流的生成可以开始。因此,并行操作可以改进对受加密数据进行解密的效率。
[0079]
用于密码式计算的指针编码已经典型地应用于堆,其中,用相同的加密密钥(或数据密钥)对整个存储器进行加密并且解密。然而,用于堆存储器的指针编码并未充分地支持栈中的存储器存取。用于堆的指针编码并非精确地对特定存储器目标的边界信息进行编
码,栈可以包括需要精确边界编码的敏感数据。例如,用于特定存储器位置的一个代表性64比特堆指针可以涉及:采取明文输入指针,并对作为线性地址的偏移的确定指针中编码的线性地址的比特有多少可以是可调整(例如,不定)的幂值进行编码。线性地址的一些其他比特可以是固定的,并且线性地址的另一部分可以受加密。其他元数据(例如,版本号)也可以包括于指针中。例如,具有3的值的指针中的幂字段可以使指针具有23或8个可调整(不定)比特作为线性地址的偏移。然而,幂编码并不提供精确的上下边界以确证存储器中的特定对象的准确大小。因此,本文描述不同类型的指针编码,以赋能基于指针的密码式编码用于栈。
[0080]
栈为将其与堆区分的特定属性所定义。例如,可以当创建线程时分配栈,而典型地在应用启动时分配堆。栈的大小变化,但是远小于堆,并由程序维护。例如,一些默认栈大小是8兆字节(例如,linux操作系统),而一些默认栈大小为1兆字节(例如,windows)。栈可以存储各种类型的数据,并且一些示例包括局部变量数据、用于活动函数调用的返回地址和用于在函数之间和/或函数与主程序之间传递信息的参数。
[0081]
操作系统、存储器和/或计算机架构中的漏洞或弱点一般在称为栈缓冲区上溢(或超限(overrun))和栈粉碎的利用的情况下成为靶子。当程序写入预期数据结构之外的程序的调用栈上的存储器地址(这可能响应于编程错误或恶意软件而发生)时,栈缓冲区上溢(或超限)发生。这些错误通常导致受破坏的数据,并且可能使程序崩溃。当程序以特殊特权运行或接受来自不可信来源(例如,另一函数)的数据时,于是栈缓冲区上溢错误可能变为潜在的安全漏洞。例如,如果运行中的程序调用函数,则程序向cpu通知哪个函数要运行,用于程序的返回地址可以由cpu加载到栈中。一旦第二函数完成执行并发放返回指令以返回程序,就可以对它给予要使用的返回地址。如果第一函数是恶意的,则它可能将不可信的可执行代码加载到栈,并且该代码可能注入到运行中的程序中且危及与程序关联的数据和代码的安全性。因此,保护栈中存储的数据可能是高度期望的,以避免可能引发的恶意软件和其他疏忽或无意的编程错误。
[0082]
精细粒度式栈指针编码可以使用用于栈指针的新编码技术解决这些问题。因为栈与堆具有不同的性质(例如,在大小方面受限),所以偏移比特受限制,因为它需要更少的比特以表示用于程序的完整栈存储器。因此,可以在指针中使用附加比特以创建用于指针的强编码。本文描述的一个或多个实施例提供栈中存储的对象的精确边界控制。由于栈大小更受限制,因此一些高地址比特是固定的,而并非对于不同的栈地址而改变。因此,可以使用更少数量的比特以表示偏移(例如,23个比特),并且高地址比特可以存储在存储器或寄存器中。此外,可以使用细调和地址密钥(本文也称为“指针密钥”)对一些固定的高地址比特连同由指针引用的存储器分配的精确大小信息进行加密。细调可以包括用于栈帧的变量基址(其可以是指针中的固定偏移比特)。用于加密算法的地址密钥输入可以是对于与栈关联的特定运行程序(即,进程)生成的专用地址密钥。
[0083]
图4是根据本公开的至少一个实施例的用于栈中存储的对象的示例指针410的图。栈对象典型地是在程序的执行期间使用达短时间量的局部变量。栈中存储的数据的示例可以包括但不一定限于局部变量数据、返回地址和用于函数的参数。当程序初始化以运行时,可以对于用于程序的栈分配存储器。栈指针可以得以生成并指向栈的顶部。栈指针中的高地址比特在程序运行时期间不改变,但是低地址比特(例如,偏移比特)可以取决于哪个栈
帧是活动的而改变。可以对于需要使用栈以用于其操作的每个函数或子例程分配栈中的新帧。栈帧可以存储它自己的函数或子例程状态信息、局部变量、关于其调用方的返回地址信息。在一个示例中,例如,(可以在栈帧指针中编码的)用于特定栈帧的线性地址可以包括在程序运行时期间不改变的高地址比特和指向栈帧的顶部的低地址比特。
[0084]
图4示出用于使用指数(幂)元数据以基本格式存储在栈帧中的对象的密码式已编码64比特指针(地址)。在所示示例中,已编码指针包括幂大小(指数)元数据部分412(例如,所示示例中的5比特),其指示指针410的偏移部分418的大小(例如,所示示例中的6比特)(例如,包括指针410的偏移部分418的数个低阶地址比特,这些比特可以由软件自由操纵以用于指针算术)。在一些实施例中,幂大小元数据部分412可以基于2的幂指示偏移比特的数量。
[0085]
如图4所示,幂大小元数据部分412可以指示组成非不定(或固定)偏移部分416和不定(或可调整)偏移部分418的比特的数量。对于栈,取决于特定实现方式和架构,包括固定偏移416和不定偏移418的整个偏移部分415的比特的总数量可以是固定数量。在一个示例中,偏移部分包括23比特。固定偏移416对于栈帧所属的函数或程序不改变,而不定偏移418可以取决于线性地址引用的对象而改变。
[0086]
在已编码指针410中,构成固定偏移部分416和不定偏移部分418的比特的总数量可以是恒定的,其中,各个部分的大小由幂大小元数据部分412规定。例如,如果幂元数据值是0,则不存在不定偏移比特。在此情况下,所有23比特组成固定偏移416。作为进一步的示例,如果幂元数据值是1,则存在1比特的不定偏移部分418,如果幂元数据值是2,则存在2比特的不定偏移部分418,依此类推,直到不定偏移的偏移比特415的总数量(例如,23比特)不导致固定偏移比特。不定偏移418可由软件操纵,例如,以用于指针算术或其他操作。所有不定偏移比特为零的地址是由指针指定的达2的幂对齐的时隙的起始地址。具有一些非零不定偏移比特的其他地址是时隙内的地址。
[0087]
可以用小的可细调分组密码(例如,simon、speck、或32比特分组大小的可细调k密码或其他可变比特大小可细调分组密码)对指针410的密文部分414(例如,所示示例中的32比特)进行加密。在一个或多个实施例中,固定偏移部分416可用作细调,以从高地址比特的至少一部分(例如,线性地址的高比特中的9比特,其中,高地址比特的该部分在本文中也称为“第一高地址比特”)和用于由指针410引用的对象的存储器分配大小(例如,23比特)生成密文部分414。密文部分414可以与固定偏移部分416相邻,并且包括相对于其的更多有效比特。
[0088]
一些地址比特组成固定偏移部分416(例如,所示示例中的17比特),并且可以用作用于用以对密文部分414进行加密的可细调分组密码的细调的部分。虽然这些比特也是地址的明文(未加密)部分,但是它们不能在不使密文部分414不正确地解密的情况下像不定偏移418的比特那样由软件(例如,指针算术)修改。图4所示的基本指针格式允许以密码方式精确地定义对象的边界及其在栈中的位置。在一些情况下,除了指针之外,指数/幂大小元数据部分412也可以提供为单独参数;然而,在一些情况下(例如,如所示),幂大小元数据部分412的比特可以与指针410集成,以在特定情况下提供遗留兼容性。
[0089]
还应注意,在替代实现方式中,幂大小元数据部分412可以指示组成固定偏移416的比特的数量,并且因此规定剩余的比特的数量以构成不定偏移418。例如,如果幂元数据
值是0,则不存在固定偏移比特(例如,416),并且所有23个偏移比特可以由软件操纵。作为进一步的示例,如果幂元数据值是1,则存在1比特的固定偏移,如果幂元数据值是2,则存在2比特的固定偏移,直至偏移比特的最大数量(例如,23比特),导致没有不定偏移(例如,418),并且因此没有可以由软件操纵的比特。
[0090]
此外,虽然基于对于密文部分414使用32比特示出并且描述指针410,但是指针格式并非旨在受限于此。可以基于容易可得的32比特分组加密密码选择待加密的地址切片。然而,可以另外使用采用任何其他分组大小(例如,27、16、变量等)的加密密码。如果密文比特的数量(向上或向下)受调整,则可以相应地细调待编码的剩余地址比特(例如,固定和不定偏移部分)。
[0091]
在一个或多个实施例中,指针410的幂大小元数据部分412可以容纳特殊值,以指示指针410待如何由使用指针的软件处置。在一个实施例中,可以定义特殊值以指示指针待视为常规或遗留指针(例如,不视为密码式已编码指针)。例如,保留值11111和00000可以指示指针是常规或遗留指针(因为它们是用于用户与管理员空间之间的高线性地址比特的遗留非正规编码)。任何其他值可以指示指针被编码为密码式已编码指针。因此,这两种类型的指针(例如,传统的和密码式已编码的)可以潜在地用在同一地址空间中。在其他实施例中,可以保留密码式已编码指针中的最高有效比特中的一个或多个,以指示指针是遗留指针还是密码式已编码指针。例如,可以将两个最高有效比特编码为保留比特。当保留比特具有相同的值时,这指示指针是遗留指针。在又一实施例中,两个最高有效比特可被编码为标签/版本号(例如,随机的或确定性地不同的值)。
[0092]
当处理器在密码式模式下正运行并且正使用已编码指针(地址)(例如,以与图4的指针410相同或相似的方式格式化的指针)存取存储器以得到实际线性/虚拟地址存储器位置时,处理器采取所编码的地址格式并使用由幂大小/指数元数据比特(例如,图4中的412)确定的可变数量的固定偏移比特(例如,图4的416)和秘密密钥对密文部分(例如,图4的414)进行解密。在一些实例中,可以将幂大小/指数元数据412和/或其他元数据或上下文信息包括作为用于对密文部分414进行解密的细调的部分(本文也称为“地址细调”)。如果地址不正确地解密,则处理器可能归因于在受破坏的线性/虚拟地址的情况下的所尝试的存储器存取而产生普通保护故障(#gp)或页故障。
[0093]
如本文所使用的那样,“上下文信息”旨在包括与存储器分配、其关联存储器地址、其关联指针、分配存储器所针对的软件和/或所分配的存储器的内容有关的任何元数据或其他信息。例如,上下文信息可以包括但不限于以下中的一个或多个:指示组成指针的固定和不定偏移部分的比特的数量的大小、包含与存储器地址关联的随机化比特的标签、指示用于所分配的存储器中存储的数据的存取许可的许可信息、可以用于重新指派/撤销先前指派给程序的指针的指针版本号、所分配的存储器中存储的数据的类型或类别、指示分配存储器所针对的软件的用户或管理员模式的特权等级和包括用于存储器地址的随机化或确定性唯一值的密式(密码式)上下文标识符。一个或多个指针编码实施例可以使用上下文信息的任何单个项作为细调(地址细调或数据细调)的部分,或者可以使用上下文信息项的任何合适的组合。
[0094]
上下文信息可以存储在任何类型的存储中,这可以基于特定需要和实现方式。例如,上下文信息的一个或多个项可以嵌入标准大小化的(例如,64比特)指针(例如,指针
310)中。在该场景中,代替或除此幂大小元数据之外,在最高比特中还可以存储上下文信息。用于上下文信息的其他示例类型的存储包括但不一定限于:将上下文信息嵌入已经扩大以配合更多或更大细调的指针(例如,128比特指针、265比特指针等)中,将上下文信息嵌入提供给指针加密指令和数据存取指令的另一操作数内,和/或将上下文信息存储在控制寄存器中。控制寄存器可以由指令自动选择,以用作密式输入(例如,如果只存在存储该类型的细调的一个寄存器)。否则,可以使用一些其他指令操作数(例如,指针自身中或提供有被配置用于特定操作数编码实施例的数据存取指令(例如,特殊加载和存储指令)的上下文操作数中的字段)选择控制寄存器。例如,存取指令的索引字段可以用以选择包含用于数据(或代码)密钥或细调的寄存器。通常,对于仅当切换上下文时更新的细调,用于细调的项可能尤其适合于寄存器中的存储。与特定指针更密切地关联的其他细调可能更适合于嵌入指针中或在指令操作数中传递。然而,如前所述,上下文信息的任何项可以嵌入或存储在任何类型的存储中。
[0095]
现在参照图5,图5是示出用于保护指针(例如,指向栈中的对象的线性地址)的示例操作的流程图500。对象可以是可以存储在存储器中并由程序操纵的任何数据。对象的示例包括但不一定限于数据结构、数据组成、(例如,可以处于数据结构或数据组成内的)数据元素,其包括任何类型的原语或非原语。过程500的部分可以由计算设备100的硬件、固件和/或软件(例如,由执行地址编码/加密逻辑152、地址密码术单元104、302的处理器102)执行。
[0096]
过程可以关于待存储在栈存储器中的对象响应于程序中的隐式存储器分配而开始。隐式存储器分配的示例包括但不一定限于用于局部变量的存储器分配、指向调用程序或函数的返回地址、传递到函数或程序的参数。在一个示例中,程序可以声明局部变量,并且存储器可以在没有程序代码中的显式请求的情况下关于变量在栈上得以自动地分配。
[0097]
在502,存储器分配的大小得以确定,并且可以基于请求存储器所针对的特定变量。如果需要其他元数据以对指针进行编码,则也可以获得该元数据。在504,获得指向将要存储对象的栈中的变量基址的线性地址。可以基于当前栈指针或帧指针获得线性地址。线性地址可以引用当前(或活动)栈帧内的栈中的位置。
[0098]
在506,线性地址的高地址比特可以保存在存储器中。例如,高地址比特可以包括比固定偏移更有效的所有地址比特。高地址比特可以保存在寄存器中,或者可以潜在地受加密并保存在低级存储器中。
[0099]
在508,确定用于定义固定和不定偏移比特的数量的范围元数据。在一些实施例中,范围元数据包括幂或“指数”,以确定存储器范围大小的2的幂(有效地确定固定和不定偏移比特的数量)。在一些情况下,“调整”用以将值强制为2的幂范围的末尾。在其他实施例中,当需要解决缓冲区“下溢”(与缓冲区“上溢”相反)时,可以使用调整以将缓冲区强制为2的幂范围的开头。使用指数元数据,可以定义任何2的幂存储器范围(例如,2、5、8、16......2^64)。
[0100]
在510,幂元数据和存储器分配大小可以存储在线性地址的非正规比特中,并且可以替换高地址比特的部分。例如,可以使用预定数量的高地址比特(例如,9比特)以生成已编码指针的密文部分414。因此,幂元数据和存储器分配大小可以存储在比待包括于加密中以生成密文的这些第一高地址比特更高的比特中。虽然未在图4中示出,但是一些附加保留
比特(例如,2-4比特)可以用于如本文先前描述的其他目的(例如,遗留编码、标签元数据、版本元数据)。
[0101]
在512,可以使用秘密地址密钥和地址细调对指针中的高地址比特连同存储器分配大小元数据进行加密。地址密钥可以是对于待用于指针地址加密和解密的特定运行程序(或进程)定义的密钥。可以如本文所描述的那样以任何合适的方式创建密钥。
[0102]
如本文所使用的那样,除了普通明文或密文输入和密钥(例如,秘密密钥116(1)-116(n))之外,“细调”还可以指代对分组密码的第二输入等。在至少一些实施例中,细调可以组成用于分组密码的初始化矢量(iv)的全部或部分。对存储器分配大小元数据连同线性地址的高地址比特的部分进行加密赋能计算设备100检测指针何时已经非法地改变,因为加密算法将使非法地改变的比特产生对于敌手是非确定性的比特的随机序列,其当非法地改变的指针被使用时可能导致故障。
[0103]
在至少一个实施例中,使用固定偏移(例如,416)和幂元数据(例如,412)作为细调,使用密码模式加密算法(例如,可细调分组密码)对于待加密的指针部分(例如,存储器分配大小和高地址比特的某部分)进行加密。固定偏移可以填充以零,以对于分组密码提供完整的初始化矢量输入。可细调分组密码的一些示例包括:k密码、xor-加密-xor(xex)、liskov、rivest和wagner(lrw)、和针对密文窃取的基于xex的细调码本模式(xts)。可以使用其他比特扩散方法,其中,密文中的任何单个比特改变导致跨越完整已解密明文的改变。如果期望,则替选实施例可以通过使用仍然实现类似于分组密码的合理比特扩散的非密码式方法关于性能权衡安全性。
[0104]
在一些实施例中,密码具有足够的比特扩散,以使得对所加密的地址比特进行的任何位改变当解密时将同等地影响(级联通过)所有比特位置。给定任何改变或边界违规,这提供用于受破坏地址的基础。使用该方法,如果敌手尝试篡改元数据(例如,指数或调整值、或所加密的最高有效比特),则所得已解码地址将受破坏。在64比特地址空间中,地址破坏将以高概率导致故障,因此允许特权化系统组件142(例如,操作系统/执行程序/vmm/替代模式/调试跟踪/管理处理器/子系统等)捕捉地址破坏(和指针存取或边界违规)。
[0105]
在514,一旦已经在指针中对适当的元数据和部分高地址比特进行加密,所得密码式已编码指针就可以返回存储器管理器,以用于存取程序中所使用的对象。例如,输出可以是与已编码指针410相同或相似的已编码指针。
[0106]
现在参照图6,示出用于对已编码指针进行解码的示例过程600。过程600的部分可以由计算设备100的硬件、固件和/或软件(例如,由执行程序的读取或写入(例如,push/store或pop/load)指令处理器102和/或地址解码/解密逻辑154、地址密码术单元104、302)执行。过程600可以关于待存储到栈存储器中(例如,推送)或从栈存储器读取(例如,弹出)的对象响应于程序中的隐式存储器存取请求而开始。存储器存取请求的示例包括但不一定限于程序代码中的push和pop指令。
[0107]
在602,获得指向与存储器存取请求关联的存储器位置的已编码指针(例如,可以从寄存器110获得的已编码地址206)。在604,使用与用以在图5的512执行加密相同的秘密地址密钥和地址细调对已编码指针的受加密部分进行解密。解密生成包括用于由指针引用的变量的存储器分配大小的数据和指针中编码的线性地址的高地址比特的部分的数据。
[0108]
在606,例如在图5的506,高地址比特的受解密部分与当指针被编码时存储在存储
器中的高地址比特的对应部分进行比较。如果高地址比特的受解密部分匹配高地址比特的所存储的部分,则这充当存储器分配大小元数据尚未受破坏的验证。在608,可以关于比较是否指示匹配进行确定。如果高地址比特的受解密部分和高地址比特的所存储的部分不匹配,则在610,可能引发故障。
[0109]
如果在608确定高地址比特的受解密部分和高地址比特的所存储的部分匹配,则在612,可以关于存储器地址(即,在604解码的线性地址)是否处于对于变量分配的边界内进行确定。例如,可以执行检查以确定线性地址是否小于变量基址加上存储器分配大小。这是因为变量拥有从变量基址到变量基址加上变量的存储器分配大小(例如,《基址、基址+大小》)驻留的数据(例如,数据元素、数据结构等)。在变量并未对齐的一个示例中,作为编译器添加指令的结果,存储器分配的变量基址可以存储在寄存器中。在该示例中,可以修改编译器以发出代码,以在使用变量之前加载变量基址。因此,当指令尝试存取变量时,可以对密码式已编码指针进行解密并且解码,以获得线性地址和存储器分配大小。然而,如果变量是对齐的,则变量基址在指针解码期间无需传递给处理器。
[0110]
在执行存储器存取请求之前,可以在612执行线性地址是有效的验证。如果确定存储器地址不是有效的(例如,如果线性地址不小于变量基址+存储器分配大小),则在614,可能引发故障。否则,在616,当完整性检查和关于存储器分配的边界的检查皆成功时,读取或写入(例如,弹出/加载或推送/存储)请求可以完成。
[0111]
图7是示出以下示例过程700的更详细流程图:从包含存储器地址(或线性地址)的至少一部分和其他元数据的未编码指针710生成密码式已编码指针730(本文也称为“已编码指针”),并且将密码式已编码指针730绑定到由指针引用的数据的加密。根据至少一个实施例,数据的加密绑定到指针的内容。过程700的至少一些部分可以由计算设备100的硬件、固件和/或软件执行。在所示示例中,指针710(在任何密码功能得以执行之前)体现为64比特已编码线性地址,其包括存储器地址的4比特标签/版本部分701、5比特幂大小元数据702、23比特存储器分配大小704、9比特第一高地址比特705和明文部分706。明文部分706可以包括可变比特固定偏移部分707和可变比特不定偏移部分708。在一些实施例中,可以使存储器分配大小704小于固定偏移比特707和偏移比特708的组合,以配合指针内的下限字段。下限可以与由指针指定的二次幂对齐时隙的起始地址相加,以计算变量基址。存储器分配大小704和下限二者可以乘以由幂大小确定的2的某个幂,以使得可以对于大分配指定最大大小和限制。
[0112]
当第一次对已编码指针730进行密码式编码时,可以使用用于对指针730进行加密并且编码的指令(例如,encryptptr指令)。指令可以被配置为接受存储器分配的基址和存储器分配的准确大小(例如,存储器分配大小704)作为操作数。可以从这些操作数导出幂大小702。
[0113]
在该实施例中,已编码指针可能没有足够的空间以携带所有存储器地址比特。因此,当对已编码指针730进行解码以形成可以用于存储器存取的线性地址时,存储器地址的(对于栈存储器不改变的)高地址比特715可以存储在寄存器或其他存储器中,以与固定偏移比特707和偏移708组合。高地址比特715包括第一高地址比特705和第二高地址比特703。第一高地址比特705也存储在未编码指针710中并且受加密,以形成已编码指针730的受加密指针切片732的部分。加密为受加密指针切片732的部分的第一高地址比特705可以在存
储器存取操作期间用作完整性检查,以通过比较来自的受解密第一高地址比特与存储器中存储的对应第一高地址比特705验证受加密指针切片732的完整性。通过验证受加密指针切片732的完整性,也可以验证存储器分配大小704的完整性。
[0114]
通常,指针710可以用以生成具有与本文描述的其他密码式已编码指针(例如,410)相似的配置的密码式已编码指针。然而,指针710包括标签/版本部分701,其可以是随机的或确定性地不同的值。在其他实施例中,四个高比特可以是保留比特,其允许与遗留指针同时使用密码式已编码指针。例如,最高有效比特可以用以指示地址是位于管理员地址空间内(例如,“1”)还是位于用户模式地址空间内(例如,“0”)。下一最高有效比特可以设置为管理员比特的相反值以指示指针受密码式编码,或者可以设置为管理员比特的相同值以指示指针未受密码式编码。在其他实施例中,可以在没有专用保留比特的情况下实现遗留编码。相反,可以通过对幂大小元数据部分702中的特定值(例如,全1、全0)进行编码实现遗留编码。如果指针710包括标签/版本部分701,则也可以用特定值(例如,全1、全0)对这些比特进行编码,以允许同时使用遗留和传统编码。在又其他实施例中,例如,如果构思并未实现为与遗留程序兼容,则可以完全消除遗留编码。
[0115]
应注意,可以不对幂大小元数据部分702进行加密,因为它用以确定指针的不定和固定明文部分中的比特的数量,并且因此,地址细调(例如,固定偏移部分706)中使用的比特的数量。然而,标签/版本部分701并不用以确定地址细调的大小。因此,只要在地址细调中不使用标签/版本部分701,就可以替代地包括标签/版本部分701作为地址的受加密部分(即,密文732)的部分。在该替选实施例中,分组密码将具有对应更大的分组大小以配合标签/版本部分,或者密文中包括的地址比特将减少,并且对应数量的地址比特将包括于明文部分(即,706和708)中。附加地,应注意,虽然用包括标签/版本(或保留比特)部分701的指针710中所示的编码示出过程700,但是可以用具有不包括标签/版本(或保留比特)部分或者包括不同的元数据的幂大小元数据部分(例如,指针710)的其他指针编码执行过程700。在此场景中,可以简单地从地址细调消除标签/版本(或保留比特)部分。
[0116]
在三个阶段中标识过程700的操作:地址加密770a(阶段i)、指针编码770b(阶段ii)和数据加密770c(阶段iii)。在阶段i中,可以对未编码指针710的部分(本文也称为“指针切片”)进行加密。在该示例中,使用地址密钥718和地址细调716通过密码式算法(例如,可细调分组密码720)对未编码指针710中嵌入的存储器分配大小704和第一高地址比特705进行加密。地址细调716可以包括多个地址加密因子。在一个示例中,第一地址加密因子可以包括幂大小元数据部分702,并且第二地址加密因子可以包括可以用零填充的固定偏移部分706。应显然的是,其他上下文信息也可以在一个或多个实施例中用作附加地址加密因子,并且可以添加为地址细调716的部分或添加为用于密码式算法的单独输入。
[0117]
在一些实施例中,地址细调716可以还包括标签/版本部分701的比特。幂大小元数据部分702用以确定固定偏移部分706中的比特的数量和不定偏移部分708中的比特的数量,其等于用于地址细调716中的零填充的比特的数量。在至少一些实施例中,可变长度元数据的附加一个或多个项也可以用作用于可细调分组密码720的地址细调716的部分。例如,可变长度元数据可以包括如本文先前所描述的其他上下文信息或元数据(例如,许可、特权等级、类型、位置、所有权等)。在更进一步的实施例中,密式上下文标识符寄存器可以用作地址细调716的部分。密式上下文标识符寄存器可以包含与特定功能群组(例如,进程、
进程子集、虚拟机(vm)、vm子集等)关联的(例如,随机地或确定性地生成的)唯一值。分组密码720可以是本文所述的任何合适的解密算法(例如,32比特分组大小密码(例如,simon、speck、k密码或其他可变分组大小密码)的可细调版本,或者对于更大的地址,可以使用prince、xts-aes分组密码、lrw、aes-ctr模式等)。
[0118]
当已经通过对未编码指针710的所选择的部分(例如,存储器分配大小704和第一高地址比特705)进行加密生成密文部分(受加密指针切片)732时,于是可以在770b在阶段ii中形成已编码线性地址(或已编码指针)730。在至少一个实施例中,最高比特(例如,标签/版本部分701和幂大小部分702)可以设置为相同的比特值(例如,0或1)。此外,固定偏移部分706和不定偏移部分708的比特构成已编码指针730的低比特。通常,密码式已编码指针730具有与本文描述的其他密码式已编码指针(例如,310)相似的配置。然而,如前所述,已编码指针730可选地包括标签/版本部分701,其可以是随机的或确定性地不同的值。
[0119]
在至少一个实施例中,密码式已编码指针730可以用作用于待加密并存储在栈上的数据746的数据细调。数据746可以包括任何类型的数据(例如,数据元素、数据结构、数据组成、对象、数组、链表、整型、短整型、长整型、浮点值和可以存储并且由程序代码操纵的任何其他值)。
[0120]
由密码式算法(例如,密钥流生成器750)对于待推送到栈的数据746进行加密。在至少一个实施例中,密钥流生成器750可以按特定大小粒度性(任何合适的大小)实现为aes-ctr模式分组密码。在一个示例中,对密钥流生成器950的输入可以包括数据密钥和数据细调。数据细调916可以包括多个数据加密因子。
[0121]
在一个示例中,数据加密因子可以包括已编码指针730的至少一部分(并且可能地,全部),其引用待加密的数据746。在该实施例中,密码式已编码指针的内容用作初始化矢量(iv)或数据细调744,其中,不定偏移(例如,708)用作计数器值(ctr)。密钥流生成器750基于数据密钥742对数据细调744进行加密,以生成密钥流751。数据加密可以间接地绑定到修改后的不定偏移比特的值,因为这些比特可以并入用以生成受加密指针切片(密文)732的细调中。
[0122]
如果待加密的数据跨越一个或多个分组对齐的边界,则可以对于随后分组重新调用密钥流生成器750,其中,每次它被重新调用,数据细调744就增加达等于分组大小的量。所生成的密钥流751的后缀可能是不需要的,并因此被丢弃。可以然后对密钥流751和从处理器寄存器中的数据选择的输入数据分组(或缓存线)746执行逻辑功能752(例如,xor运算或其他合适的运算或其组合)。输入数据分组746的粒度性与从密钥流生成器750输出的密钥流751匹配,并且逻辑功能752产生加密的输出数据分组762。
[0123]
加密数据762可以基于密码式已编码指针730中所编码的线性地址写入(例如,存储、推送、拷贝、移动、转移等)到存储器。因此,在正生成密码式已编码指针的同时,已解码线性地址可以存储在寄存器中,例如,直到写入操作完成。可以随后通过以下操作从存储器检索所存储的受加密数据762:对密码式已编码指针730进行解码以获得已解码线性地址,并且然后使用已解码线性地址以加载/弹出/读取受加密数据762。可以然后使用在加密期间使用的相同数据密钥742和数据细调744对受加密数据762进行解密。
[0124]
当执行读取操作时,可以对已编码指针(而不是未编码指针710)和受加密数据(而不是未加密的数据746)执行图7所示的相同操作,以实现相反的结果。可以使用地址密钥
718和包括皆来自已编码指针730的固定偏移比特707和幂大小702的细调由可细调分组密码720对受加密指针切片732进行解密。所得受解密第一高地址比特可以与存储器中存储的第二高地址比特703、固定偏移比特707和偏移708组合,以形成已解码线性地址。已解码线性地址可以用以获取由线性地址引用的受加密数据。可以从缓存/存储器读取受加密数据,并且可以执行相同的操作。已编码指针730(或其部分)可以连同数据密钥742用作进入密钥流生成器750中的细调输入。密钥流生成器750可以产生密钥流输出751,并且来自处理器寄存器的受加密数据可以与用于已编码指针730的密钥流输出751和加载到寄存器中的所得受解密数据异或(或执行的其他适当的逻辑功能)。
[0125]
图8是示出根据至少一个实施例的用于将指令嵌入到所编译的代码中的编译器流程800的简化框图。如流程800所示,在一个或多个实施例中,可以增强编译器820以传递栈中存储的变量基址。在编译器流程800中,软件编程代码810可以提供给编译器820。用于产生编程代码的编程语言可以是基于特定需要和实现方式的任何合适的编程语言(包括例如,c++、rust、swift等)。编译器820先验地获知程序代码810中分配的变量基址及其关联函数(例如,函数b代码812)。编译器820可以确定在程序代码810或其函数中存取变量数据(例如,对象x)的地方,并且可以在代码中的另一指令存取对象x之前发出代码822以加载对象x的变量基址。
[0126]
关于函数b代码812和当所编译的代码执行时可以在830执行的操作示出示例。例如,如果函数代码b 812将对象x声明为整数和在算术运算中使用对象x的随后代码,则编译器820可以恰在算术指令之前将加载指令(例如,822)发出到所编译的代码812中,以将对象x的变量基址加载到寄存器中。当函数b代码812执行时,声明(例如,用于对象x的)变量的指令导致创建密码式已编码指针832,其可以用以存取变量基址处的对象x。随后,恰在使用对象x的另一指令之前,由编译器820添加的加载指令可以将对象x的变量基址加载到寄存器834中。存取对象x的随后指令可以使用寄存器834中存储的变量基址,以对用于对象x的边界执行检查,以确保密码式已编码指针中所编码的线性地址是有效的(例如,512)。
[0127]
在其他实施例中,由编译器820发出的代码可以包括存储指令,其用于将变量基址存储到存储器而不是寄存器、或存储器层次结构中的其他存储器。
[0128]
本文所公开的指针编码的一个或多个实施例可以在栈和堆二者存储器分配中提供精细粒度式保护。例如,可以在堆和/或栈中分配包含多个数据元素的数据结构。数组、链表和包含子字段的组成结构是可以包含单独存储器存取可能是期望的所针对的许多数据元素的数据结构的少数非限定性示例。在给定的数据结构内,可以定义多种类型的数据。例如,字符数组内的单独数据元素可以包括整数,后接字符,后接浮点数,等。在一些场景中,可以期望存取并且保护作为原语数据类型(例如,字符、整型、短整型、长整型、浮点型、双精度型等)的单独数据元素。当前的密码式指针编码可以使用本文中描述至少一些并且参照图3a-图3b更广泛地描述的各种指针编码将指针绑定到数据结构。然而,在一些场景和实现方式中,可能期望使用指向单独数据元素的密码式已编码指针对那些单独数据元素进行精细粒度式存取和保护。
[0129]
使用基于数据类型的编码的一个或多个实施例可以使用指向栈或堆所分配的存储器中的数据结构内的变量的密码式已编码指针赋能精细粒度式存取和保护。可以借助用以存取数据的数据存取指令,以确定指向数据的指针和/或数据自身如何得以加密并且解
密。当不同的数据类型在存取数据的指令中是隐式的时,可以实现该目的。例如,用于原语数据类型的一些指令对于不同的数据类型具有差异,并且这些差异可以用以推断被存取或存储的数据元素的数据类型。例如,x86 64和ia-32架构的移动指令(例如,mov)和算术指令(例如,add、sub等)隐式地指示数据类型。具体而言,add指令的操作码可以取决于正被存取的数据的类型(例如,短整型、整型和长整型)而不同,其中,按大小区分数据的类型。也可以由指令编码中的操作数大小前缀修改由操作码指定的默认大小。其他架构也可以用指令编码指定隐式数据大小。可以使用addw(add word)指令添加2字节短整型变量,同时可以使用addw(add word)指令添加整型变量,并且使用addl(add long)指令添加长整型变量。因此,当以需要将对象移出或移入存储器的方式存取对象时,可以标识正用以执行操作的特定指令,并且基于该特定指令的操作码,可以推断正存取的数据元素的数据类型。所推断的数据类型可以然后用于对指针进行解密/加密和/或用于对所存取的数据进行解密/加密。各种不同的指令集架构(isa)取决于正存取的数据的数据类型使用不同的操作码,可以借助其中的任何一个以实现本文公开的基于数据类型的编码。
[0130]
在另一实施例中,前缀可以添加到一些指令,并且前缀可以包含比可以从指令自身导出的信息更精确的数据类型信息。此外,在一些场景中也可以使用前缀,以超控指针加密/解密和/或数据加密/解密。因此,可以超越从指向数据的已编码指针导出的密钥和信息通过本文所公开的一个或多个实施例扩展导出信息以执行指针加密和解密和/或执行数据加密和解密所来自的源。一个或多个实施例将用于细调的新源添加到指针加密和解密和/或数据加密和解密,其中,源包括从实际上正存取数据的指令导出的信息。
[0131]
应注意,基于数据类型的指针编码也可以赋能对驻留在堆或栈存储器中的任何对象的安全存取和保护。如前所述,如本文所使用的那样,术语“对象”旨在包括但不一定限于数据结构(例如,数组、记录、映射、联合、链表等)、数据组成、数据元素(其可以包括原语或数据结构或组成等)、数据结构或组成内的数据元素、原语(例如,布尔、字符、浮点数、定点数、整数、指针、句柄、枚举类型等)。
[0132]
图9a是示出以下操作的示例过程900a的更详细流程图:从包含存储器地址的至少一部分(即,线性地址)和其他元数据的未编码指针910生成密码式已编码指针930(本文也称为“已编码指针”),并且将密码式已编码指针930的内容绑定到由指针引用的数据的加密。已编码指针930的实施例可以用以引用包括堆和栈二者的任何可用存储器中存储的数据。过程900a的至少一些部分可以由计算设备100的硬件、固件和/或软件(例如,由执行地址编码/加密逻辑152、加密存储逻辑156、地址密码术单元104、302、密码式计算引擎108的处理器102)执行。在所示示例中,指针910体现为64比特已编码线性地址,包括幻数/其他值902、高地址比特904、其他元数据906、固定偏移比特907和不定偏移p908。
[0133]
通常,当数据类型绑定到已编码指针时,在一些实施例中可以不使用幂元数据(例如,702)或其他大小元数据(例如,704)。将正引用的对象的数据类型绑定到引用该对象的已编码指针可以赋能检测对用不正确的指令存取数据的恶意尝试和当错误指令用于错误变量时的疏忽编程错误二者。从已编码指针中移除幂(或其他大小)元数据释放可以对其他类型的元数据进行编码的一些比特。例如,其他元数据906可以添加到未编码指针910。其他元数据的一个示例是许可,其(当已编码指针引用数据时)对于数据指针可以是有用的,以指示归因于用于执行对所引用数据的特定存取(例如,读取与写入存取)的执行代码的许
可。虽然许可元数据可以提供一些有用的益处,特别是对于代码指针,但是它不是用于对附加元数据进行编码的仅有选择,并且应显然的是,可以对任何其他类型的常量元数据(例如,唯一标识符)进行编码。
[0134]
在一些实施例中,即使当数据类型以密码方式绑定到已编码指针时,如下文将进一步讨论的那样,在已编码指针中仍然包括大小元数据(例如,幂大小元数据或存储器分配大小)可能仍然是有益的。具体而言,与包含不同类型的多个变量的数据结构关联的大小可以有利地包括于已编码指针中,并且绑定到指针加密和解密和/或数据加密和解密。
[0135]
在指针中也对存储器地址比特进行编码。在该示例中,可以包括高地址比特904、固定偏移比特907和不定偏移908。在该示例中,高地址比特904和固定偏移比特907由其他元数据906分离。应显然的是,其他布置和配置是可能的。例如,可以交换高地址比特904和其他元数据906的放置。附加高地址比特可以存储在寄存器或其他存储器中。在至少一些实施例中,也可以提供魔数/其他值902以,在不同的编码类型(例如,栈指针编码、堆指针编码、遗留指针等)之间进行区分。在其他编码中,魔数/其他值902可以保存不同的元数据或信息。一个示例是标签/版本号。
[0136]
在三个阶段中标识过程900a的操作:地址加密(阶段i 970a)、指针编码(阶段ii 970b)和数据加密(阶段iii 970c)。在阶段i中,可以对未编码指针910的部分(本文也称为“指针切片”)进行加密。待加密的未编码指针910的部分可以包括包含存储器地址比特中的至少一些的常量比特(即,并不随着使用已编码指针而改变的比特)的任何合适的组合。在该示例中,待加密的指针切片包括高地址比特904和其他元数据906(例如,许可、唯一标识符、数据结构的大小或其他上下文信息)。可以使用地址密钥918和地址细调916通过密码式算法(例如,可细调分组密码920)对该指针切片进行加密。地址细调916可以包括多个地址加密因子。
[0137]
在一个示例中,第一地址加密因子可以是用于数据类型912的数字标识符,数据类型912是与待在已编码指针930中编码的存储器地址处存储的数据关联的数据类型。这可以用以防止不同类型的不同数据元素由不正确地赋类型的指令(例如,尝试存取整型的短整型指令,尝试存取浮点数的字符指令等)存取。例如,由高地址比特904、固定偏移比特907和偏移908形成的存储器地址(或线性地址)对应于特定存储器位置,并且该存储器位置处存储的数据定义为特定数据类型。当第一次对已编码指针930进行编码时,数据类型912可以经由encryptptr指令传递到处理器,以指示用于由该指针引用的数据的数据类型。随后,随着在数据存取期间对已编码指针进行解密并且重新加密,可以从使用已编码指针930以存取该存储器位置处的数据的数据存取指令导出数据类型912。在一些实例中,可以从数据存取指令的操作码推断数据类型。在其他实例中,数据类型可以在前缀中提供给指令。
[0138]
可能的第二地址加密因子可以包括位移值914。位移可以出自在特定架构(例如,x86架构)中构造存储器地址的方式。存储器地址可以由操作数的比例索引基(sib)形式组成。寄存器充当基址,并且另一寄存器充当索引。寄存器可以组合于其可以用于存取数据结构(例如,数组)的单个存储器地址中,其中,你有指向数组开头的基址寄存器和指定数组内索引的索引寄存器。这可以取决于数组元素的大小而按因子(例如,1、2、4、8等)缩放。对于具有多个字段的数据结构,位移可以表示结构内的特定字段的偏移。一些存储器操作数可以对于这些存储器操作数分量(例如,0的位移或0的索引)中的一个或多个使用隐式
值。为了计算得以存取的最终存储器地址,如果结构处于数组中,则可以将位移与初始基址寄存器和缩放的索引相加。因此,位移值是指令编码的另一属性,因为它得以作为值而编码到指令代码流中(而不是在寄存器或存储器中)。位移值对于编码可以是有用的,因为它可以防止旨在存取结构内的第二字段的指令被误用以存取结构内的第三字段。
[0139]
第三地址加密因子可以是固定偏移比特907,其可以用零填充。应显然的是,其他上下文信息也可以在一个或多个实施例中用作附加地址加密因子,并且可以添加为地址细调916的部分或添加为用于密码式算法的单独输入。
[0140]
可以通过具有包括地址密钥918和地址细调916的输入的密码式算法(例如,可细调分组密码)实现指针切片(例如,904和906)的加密。在一个实施例中,密码式算法可以包括实现任何合适的加密算法的分组密码920(例如,32比特分组大小密码的可细调版本(例如,simon、speck、k密码或其他可变分组大小密码),或对于更大的地址,可以使用prince、xts-aes分组密码、lrw、aes-ctr模式等)。
[0141]
当已经通过对未编码指针910的所选择的部分(例如,高地址比特904、其他元数据906)进行加密生成密文部分(受加密指针切片)932时,于是可以在阶段ii 970b中形成已编码线性地址(或已编码指针)930。在至少一个实施例中,最高比特(例如,魔数/其他值902)可以设置为相同的比特值(例如,0或1)。此外,固定偏移907和不定偏移908的比特构成已编码指针930的低比特。
[0142]
在至少一个实施例中,密码式已编码指针930可以用作用于待加密并且存储在堆或栈存储器中的数据960的数据细调。数据960可以包括任何类型的数据(例如,数据元素、数据结构、数据组成、对象、数组、链表、整型、短整型、长整型、浮点值和可以存储并且由程序代码操纵的任何其他值)。
[0143]
通过密码式算法(例如,密钥流生成器950)对于待存储的数据960进行加密。在至少一个实施例中,密钥流生成器950可以按特定大小粒度性(任何合适的大小)实现为aes-ctr模式分组密码。在一个示例中,对密钥流生成器950的输入可以包括数据密钥和数据细调。数据细调916可以包括多个数据加密因子。
[0144]
在一个示例中,第一数据加密因子可以包括数据类型(例如,数据类型912),并且第二数据加密因子可以包括位移值(例如,914),先前在本文中参照用于地址细调916的地址加密因子描述了二者。此外,对于数据加密(和解密),第三数据加密因子可以包括引用待加密的数据960的已编码指针930的至少一部分(并且可能地,全部)。这些数据加密因子(例如,912、914和930)可以组合(例如,串接)到数据细调944中作为用于密钥流生成器950的单个细调输入(例如,可细调分组密码)。在其他实现方式中,数据加密因子可以提供为进入密钥流生成器中的两个或更多个细调输入。
[0145]
在一个实施例中,密码式已编码指针930的内容和附加数据加密因子(例如,912、914)用作用于密钥流生成器950的初始化矢量(iv)或数据细调944的部分,其中,不定偏移908用作用于分组密码的计数器值(ctr)。密钥流生成器950基于数据密钥942对数据细调944进行加密,以生成密钥流951。数据细调944的值可以调整为全等于0(以密钥流生成器950的分组大小取模),然后用作对密钥流生成器的输入。数据细调944的值可以具有设置为0的一些合适数量的最低有效比特以满足该要求,并且密钥流951的前缀可以被丢弃以考虑该调整。可以通过从数据细调944的未调整的值减去数据细调944的调整后值计算要丢弃的
密钥流951的字节的数量。这种调整可以修改指向小于分组大小的对象的指针中的固定偏移比特907的值。然而,数据加密可以间接地绑定到修改后的固定偏移比特的值,因为这些比特可以并入用以生成密文932的地址细调中。
[0146]
如果待加密的数据跨越一个或多个分组对齐的边界,则可以对于随后分组重新调用密钥流生成器950,其中,每次它被重新调用,数据细调944就增加达等于分组大小的量。所生成的密钥流951的后缀可能是不需要的,并因此被丢弃。可以然后对密钥流951和从处理器寄存器中的数据选择的输入数据分组(或缓存线)946执行逻辑功能952(例如,xor运算或其他合适的运算或其组合)。输入数据分组946的粒度性与从密钥流生成器950输出的密钥流951匹配,并且逻辑功能952产生加密的输出数据分组962。
[0147]
加密数据962可以基于密码式已编码指针930中所编码的线性地址写入(例如,存储、推送、拷贝、移动、转移等)到存储器。因此,在正生成密码式已编码指针的同时,已解码线性地址可以存储在寄存器中,例如,直到写入操作完成。
[0148]
应注意,在一些实现方式中,数据类型912和位移值914可以用作用于地址细调916的地址加密因子和用于数据细调944的数据加密因子二者。在其他实现方式中,数据类型912和位移值914可以用在地址细调916或数据细调944中。在更进一步的实现方式中,数据类型912或位移值914用在地址细调916和/或数据细调944中。通常,来自数据存取指令编码的该附加信息的任何组合可以用作第二输入源,以绑定已编码指针930和它引用的加密数据962之一或二者的加密。
[0149]
图9b是示出获得由密码式已编码指针930引用的数据的示例过程900b的另一详细流程图,其中,参照图9a描述指针和数据的加密。根据至少一个实施例,数据绑定到已编码指针930的内容和来自数据存取指令的某附加信息。过程900b的至少一些部分可以由计算设备100的硬件、固件和/或软件(例如,由执行地址解码/解密逻辑154、解密存储逻辑158、地址密码术单元104、302,密码式计算引擎108的处理器102)执行。
[0150]
在三个阶段中标识过程900b的操作:地址解密(阶段i 980a)、地址形成(阶段ii 980b)和数据解密(阶段iii 980c)。在阶段i 980a中,对嵌入指针930中的线性地址进行解密。具体而言,使用用以对图9a的地址加密970a中的未加密指针切片(例如,904和906)进行加密的相同地址密钥918和地址细调916,使用密码式算法(例如,可细调分组密码920)对已编码指针930的受加密指针切片932进行解密。
[0151]
当密钥流生成器950已经对已编码指针930的受加密指针切片进行解密时,输出包括高地址比特904和其他元数据906。在阶段ii 980b中,受解密高地址比特904可以用以形成已解码线性地址990。在至少一个实施例中,已解码线性地址990的最高比特(例如,符号扩展901)可以设置为相同的比特值(例如,0或1)。此外,固定偏移比特907和不定偏移比特908可以构成已解码线性地址990的低比特。
[0152]
在一些实施例中,处理器可以检查(例如,具有高地址比特904和其他元数据906的)受解密指针切片是否具有作为是否不正确地对受解密高地址比特904进行解密的指示的预期值。例如,在一些分页模式下,要求某数量的高地址比特全部具有相同的值(即,全0或全1)。如果受解密指针切片中的对应比特具有不同的值,则这指示不正确地对受解密高地址比特904进行解密。在此情况下,一些实施例可能生成故障。在此情况下,当使用已解码线性地址990时,一些其他实施例可以依赖于现有的关于生成故障的正规性检查。即使高比
特确实全都具有相同的值,这也不能最终指示正确地对受解密高地址比特(例如,高地址比特904)进行解密。一些实施例可以对于用于当前操作中待存取的最小和最大地址二者的预期比特值执行上述检查,以使得如果存取的任何部分越界,则将很可能生成故障。其他实施例可能仅需要存取的特定部分(例如,第一字节)处于指针的边界内,并且因此仅对用于存取的该部分指针关于预期比特值执行上述检查。其他实施例可以依赖于数据密码术检查用于写入操作的最小和最大地址二者,但是仅检查用于读取的单个指针值,从而很可能地防止部分越界读取返回正确的明文。
[0153]
已解码线性地址990用以寻找待在阶段iii 980c中解密的受加密数据的存储器位置。受加密数据可以由用以对它进行加密的相同密码式算法(例如,密钥流生成器950)解密。此外,相同的数据密钥942和相同的数据细调944可以用作对密钥流生成器950的输入,以执行解密。具体而言,在至少一个实施例中,两个源提供待包括为用于数据解密的细调的输入。一个源包括引用待解密的数据的已编码指针。另一源包括数据存取指令编码流,其可以指示关于数据存取的各种信息。该信息可以包括但不限于正存取(从存储器读取或向存储器写入)的数据的数据类型和特定指令中的位移值。
[0154]
如前所述,密钥流生成器950可以按特定大小粒度性(任何合适的大小)实现为aes-ctr模式分组密码。在该实施例中,密码式已编码指针930的至少一部分内容用作初始化矢量(iv)或数据细调944,其中,不定偏移(例如,908)用作计数器值(ctr)。密钥流951的生成可以在不等待受加密指针切片932被解密的情况下开始。
[0155]
密钥流生成器950基于数据密钥942对数据细调944进行加密,以生成密钥流951。在至少一些场景中,数据细调944的值可以调整为全等于0(以密钥流生成器950的分组大小取模),然后用作对密钥流生成器的输入,如前所述。该调整可以修改指向小于分组大小的对象的指针中的固定偏移比特907的值。然而,数据解密可以间接地绑定到修改后的固定偏移比特907的值,因为这些比特可以并入用以生成受加密指针切片(密文)932的地址细调中。
[0156]
如果待解密的数据跨越一个或多个分组对齐的边界,则可以对于随后分组重新调用密钥流生成器950,其中,每次它被重新调用,数据细调944就增加达等于分组大小的量。所生成的密钥流951的后缀可能是不需要的,并因此被丢弃。然后对密钥流951和从已解码线性地址990所引用的存储器位置选择的受解密输入数据分组(或缓存线)960执行逻辑功能952(例如,xor操作或其他合适的操作或其组合)。受加密输入数据分组960的粒度性与密钥流生成器950输出的密钥流951匹配,并且逻辑函数952产生受解密输出数据分组964。
[0157]
关于数据存取,当存取特定数据类型的变量时,将用数据类型信息对其进行解密。例如,对于具有字符数据类型的变量,使用字符数据类型进行解密。如果具有第一数据类型的第一变量超限到具有第二(不同)数据类型的第二变量的存储器分配中,则不能存取第二变量,因为将对第二变量应该使用第二数据类型得以存储的内容执行解密,但是内容包括具有第一数据类型的数据。因此,可以防止缓冲区超限。
[0158]
这在数据结构内是特别有用的。例如,生成指向单个堆分配的密码式已编码指针可以自由地在该分配内的任何地方漫游。然而,这样可能导致对象内上溢,其中,多个子部分、多个字段处于该结构内。在示例场景中,如果子部分之一是易受攻击的字符串变量,其具有盖写某相邻变量数据的上溢。使用具有绑定到密码式已编码指针的数据加密的基于数
据类型的指针编码可以缓解这些潜在问题。因此,提供层次保护,其中,对于外部分配提供来自指针的边界,并且然后用基于数据类型的编码关于特定变量类型进行绑定。
[0159]
在进一步的实施例中,可以实现分层类型化。在该实施例中,用于外部数据结构(例如,堆分配、栈中的数据组成)的类型化可以包含于指向那些数据结构的指针中。也可以对于整个数据结构内的特定字段强制数据类型化信息。
[0160]
在更进一步的实施例中,仍然可以在指向数据结构的指针中对与大小有关的信息进行编码。例如,栈中的整个结构的大小可以包括于已编码指针中,而仍然从正存取内部字段的操作码推断数据类型(例如,推断数据结构中的第一数据元素是整数,推断同一数据结构中的第二数据元素是字符,等)。已编码指针可以包含对正存取的数据进行解密所需的信息的某个子集(例如,数据结构的大小)。考虑示例场景。可以用指示用于数据结构的128比特的大小元数据对指向具有一个64比特浮点数和一个64比特整数的数据结构的指针进行编码。指令存取整数数据元素作为整数,并且因此整数操作码得以使用。可以使用已编码指针中所编码的大小信息和从用于数据结构的数据存取指令推断的数据类型二者对已编码指针进行解密。线性基址可以由受解密指针比特和可能地其他信息形成,并且这可以用以存取数据。
[0161]
在一个或多个实施例中,也可以对于数据结构(或特定数据元素)实现完整性检查。因此,如果并未用正确的细调(例如,数据类型)存取数据,则除了数据并未适当地受解密之外,完整性检查也可以用以通过密码式方式执行用于数据的存取控制。当先前关于数据元素计算的存储器中的完整性值与基于正存取数据值的指令计算的新完整性值不匹配时,这可以用于安全攻击缓解以及调试。例如,如果程序员当它实际上是浮点数时认为它是整数并且完整性检查失败,则可以在调试期间确证数据元素作为数据类型(例如,比如,作为整数或字符)得以存取。因此,当使用基于数据类型的编码时,程序员可以从这些完整性检查受益。
[0162]
转向图10和图11,流程图1000和1100示出与程序中的数据存取指令关联的示例过程。图10的流程图1000示出与涉及向存储器写入(例如,存储、推送、保存等)数据的数据存取有关的过程。过程可以包括可以由计算设备100的硬件、固件和/或软件(例如,由执行地址编码/加密逻辑152、加密存储逻辑156、地址密码术单元104、302、密码式计算引擎108的处理器102)执行的一个或多个操作。为了易于描述,参照(例如,通过推断或通过前缀)获得待用作用于指针加密和解密和用于数据加密和解密的细调(或细调的部分)的数据类型和位移值示出并且描述图10和图11。然而,应显然的是,图10和图11的一般概念适用于可以是可从数据存取指令推断、导出或以其他方式获得的、待用作用于指针加密和解密和/或用于数据加密和解密的细调的其他数据加密因子。
[0163]
在1002,在程序中执行用于将对象写入存储器的数据存取指令。通常,如果数据存取指令包括存储器操作数,则它正存取存储器中的数据,数据类型信息可以是可从指令推断的。对将对象写入存储器的数据存取请求可以包括存储、推送、写入、移动、转移、拷贝或以其他方式使数据被保存在计算设备(例如,102)的存储器(例如,120)中的任何指令。
[0164]
在1004,关于用于数据存取的变量基址的指针是否得以编码(即,密码式编码,其中,至少一部分存储器地址受加密)进行确定。变量基址可以是例如字符数组的基(或开始)地址,在多字节数据类型(例如,短整型、整型等)的情况下的第一字节的地址。
[0165]
如果指针未受编码,则在1006,可以关于前缀检查指令。添加到数据存取指令的前缀可以包含更精确的数据类型信息或指示处置基于指针的加密和解密的特定方式的其他信息。例如,在一些场景中,基于数据类型的编码可能不是对特定对象进行编码的期望方式。在这些情况下,前缀可以用以超控基于类型的编码,并且在这些情况下,不使用基于类型的编码。即,数据类型不用在指针加密的地址细调中,和/或不用在数据加密的数据细调中。在前缀的情况下,编译器可以生成可执行代码,以使得跳过基于数据类型的编码。可以定义多个前缀,以分离地在基于类型的编码和基于位移的编码中的一个或多个及其组合之间进行选择。
[0166]
如果前缀指示基于数据类型的编码不应受超控(例如,它应被用在指针编码中),或者如果指令没有前缀,则在1010,可以检查指令,并且可以从指令的操作码推断与待写入的对象关联的数据类型。操作码可以例如基于操作码用以存取的对象的特定大小指示数据类型,并且可以推断由指令中指针引用的对象具有该数据类型。在其他场景中,如果指令具有前缀并且前缀包含该信息,则可以从前缀获得数据类型。
[0167]
在1012,可以对指针中的比特的切片进行加密,以生成受加密指针切片932。在一个示例中,比特的切片可以包括高地址比特904和其他元数据906。如果数据类型正用在加密中,则可以从指针消除幂元数据(例如,如图4和图7所示),为可能是期望的其他元数据(例如,比如,许可元数据)留出空间。许可元数据可以指示与已编码指针关联的许可(例如,它可以存取什么数据,允许对它存取的数据做什么,等)。在至少一些实现方式中,该其他元数据(例如,许可)可以包括于受加密的指针比特的切片中。可以通过具有包括地址密钥和地址细调的输入的密码式算法(例如,可细调分组密码)实现指针比特的加密。在至少一个实施例中,地址细调可以包括可以由编译器提供的数据类型。地址细调可以还包括线性地址的固定偏移部分。当在存储器存取期间对已编码指针进行解码并且解密时,可以从使用已编码指针的指令推断数据类型。
[0168]
在1014,可以用可能期望并非受加密的指针比特的部分的的任何附加信息对指针进行编码。在1016,可以在执行写入操作之前对于对象进行加密。可以通过具有包括数据密钥和数据细调的输入的密码式算法(例如,可细调分组密码)实现对象的加密。在至少一个实施例中,数据细调可以包括所推断的数据类型、位移值和已编码指针的指针绑定比特。在至少一些实施例中,完整已编码指针可以用作数据细调的部分。如果使用前缀,则如果前缀指示在数据加密中将要超控使用基于数据类型的编码,那么数据细调可以不包括数据类型和位移值。
[0169]
再次参照1004,如果变量基址的指针已经如在1004确定的那样被编码,则可以在1016如前所述使用已经编码的指针对于对象进行加密。再次参照1004,如果指针如在1004确定的那样尚未被编码,但是在1106前缀确定为超控对于指针使用基于数据类型的编码,则在1008,可以在不使用数据类型作为地址细调的部分以对指针中的比特的切片(例如,高地址比特904、其他元数据906)进行加密的情况下对指针进行编码。一旦在不使用数据类型的情况下对指针进行编码,就可以在1016对于对象进行加密,如前所述。
[0170]
在1018,可以执行写入操作,以将在1016生成的受加密数据写入到由已编码指针引用的存储器地址(例如,线性地址)。
[0171]
图11示出与涉及从存储器向寄存器读取(例如,加载、弹出、获取、移动等)数据的
数据存取有关的过程。过程可以包括可以由计算设备100的硬件、固件和/或软件(例如,由执行地址解码/解密逻辑154、解密存储逻辑158、地址密码术单元104、302、密码式计算引擎108的处理器102)执行的一个或多个操作。
[0172]
在1102,在程序中执行用于从存储器读取对象的数据存取指令。通常,如果用于读取数据的数据存取指令包括存储器操作数,则它正存取存储器中的数据,数据类型信息可以是可从指令推断的。对将对象读取到存储器的数据存取请求可以包括加载、读取、弹出、移动转移、拷贝或以其他方式使处于存储器例如,120)或缓存(如果它在缓存(例如,170)中受加密)中的数据保存在计算设备(例如,102)的处理器中(例如,寄存器110或其他处理器存储器中)的任何指令。
[0173]
在1104,关于用于数据存取的变量基址的指针是否得以编码(即,密码式编码,其中,至少一部分存储器地址受加密)进行确定。变量基址可以是例如字符数组的基(或开始)地址,在多字节数据类型(例如,短整型、整型等)的情况下的第一字节的地址。如果并未对指针进行编码,则可以在1120执行读取操作。
[0174]
然而,如果对指针进行编码,则在1106,可以关于前缀检查指令。添加到数据存取指令的前缀可以包含更精确的数据类型信息或指示处置基于指针的加密和解密的特定方式的其他信息。例如,在一些场景中,基于数据类型的编码可能不是对特定对象进行编码的期望方式。在这些情况下,前缀可以用以超控基于类型的编码,并且在这些情况下,不使用基于类型的编码。即,数据类型不用在指针加密的地址细调中,和/或不用在数据加密的数据细调中。可以定义多个前缀,以分离地在基于类型的编码和基于位移的编码中的一个或多个及其组合之间进行选择。
[0175]
如果前缀指示基于数据类型的编码不应受超控(例如,它应被用在指针编码中),或者如果指令没有前缀,则在1110,可以检查指令,并且可以从指令的操作码推断与待读取的对象关联的数据类型。操作码可以例如基于操作码用以存取的对象的特定大小指示数据类型,并且可以推断由指令中指针引用的对象具有该数据类型。在其他情况下,如果指令具有前缀,并且如果前缀包含该信息,则可以从前缀获得数据类型。
[0176]
为了执行用于读取对象的数据存取指令,对已编码指针进行解码以获得线性地址,其可以用以(例如,转译为物理地址)从存储器读取数据。为了对已编码指针进行解码,在1112,可以对指针中的比特的切片进行解密,以生成指针比特的未加密切片。在一个示例中,指针比特的未加密切片可以包括高地址比特904和其他元数据906,并且可以受加密,以生成受加密指针切片932。可以通过具有包括地址密钥和地址细调的输入的密码式算法(例如,可细调分组密码)实现指针比特的解密。在至少一个实施例中,地址细调可以包括所推断的数据类型。地址细调可以还包括线性地址的固定偏移部分。
[0177]
在1114,可以通过使用受解密高地址比特和固定偏移比特形成用于对象的线性基址。例如,如果附加地址比特(例如,最高有效地址比特)存储在寄存器中,则它们也可以添加到受解密高地址比特和固定偏移比特。此外,例如,可以添加不定偏移比特,以导出可以处于更大的数据结构内的正获取的特定对象的地址。
[0178]
在1116,可以执行读取操作以在由已编码指针引用的存储器地址(例如,线性地址)处从存储器读取受加密数据(对象)。在1118,可以对于对象进行解密。可以通过具有包括数据密钥和数据细调的输入的密码式算法(例如,可细调分组密码)实现对象的解密。在
至少一个实施例中,数据细调可以包括所推断的数据类型、位移值和已编码指针的指针绑定比特。在至少一些实施例中,完整已编码指针可以用作数据细调的部分。如果使用前缀,则如果前缀指示在数据加密中将要超控使用基于数据类型的编码,那么数据细调可以不包括数据类型和位移值。
[0179]
再次参照1108,如果指针如在1106确定的那样尚未被编码,但是在1106前缀确定为超控对于指针使用基于数据类型的编码,则在1108,可以在不使用数据类型作为地址细调的部分以对指针中的受加密比特的切片(例如,高地址比特904、其他元数据906)进行解密的情况下对指针进行解码。因此,在1108,可以在不使用类型元数据的情况下对受加密指针比特进行解密。然后在1114,可以形成线性基址,并且流程可以继续在1116执行读操作,以从存储器读取数据,并且然后在1118对数据进行解密,如前所述。
[0180]
对于当前未被配置为(例如,基于操作码)在数据类型之间进行区分的指令集架构中的指令,可以实现扩展,其扩展从那些指令操作码推断数据类型的能力。例如,高度优化的代码可以对于没有隐式数据类型信息的存储器读取和写入操作使用单指令/多数据(simd)指令。具体而言,数据类型信息可能不可从64和ia-32架构中的sse指令和avx指令推断。在特定示例中,以下sse指令没有隐式数据类型信息:
[0181]
数据转移指令:mova*s-movaps、movhsp等。
[0182]
封装算术指令:addpss、subps等。
[0183]
逻辑、比较、转换指令
[0184]
在基于数据类型的指针编码的一个或多个实施例中,可以对于上述指令(和其他指令)创建扩展,以赋能使用扩展推断正存取的数据元素的数据类型。可以允许编译器发出数据类型依赖指令,这些优化可以实现于微代码中。可以添加到指令集架构的特定扩展示例包括但不一定限于:
[0185]
movaps xmm1、xmm2/m123-用于移动整数;
[0186]
movapsb xmm、xmm2/m123-用于移动字节;和
[0187]
movapsw xmm,xmm2/m128-用于移动字
[0188]
可以通过各种方式实现赋能数据类型推断。在一些场景中,可以如上所述创建扩展(例如,新指令)。在其他场景中,可以对于现有指令定义前缀。在其他实施例中,可以修改现有指令,以使用得以直接编码到指令自身中的立即操作数(例如,数字)。可以配置添加到指令的前缀或其他东西,以使得指令的行为不改变,但是数据加密和解密可以基于对指令的添加中所指示的数据类型而改变。例如,编译器可以添加向编译器表示字符正由64比特指令移动的数字(例如,前缀或操作数)。因此,添加可以实例化密码式操作,以基于其数据类型对数据元素进行加密或解密。例如,如果使用前缀值,则前缀值和指向数据元素的密码式已编码指针皆(例如,作为分离的细调或作为组合的细调)用以确定数据如何正得以在特定指令操作码上加密并且解密。
[0189]
可以对于在库函数中执行的存储器(mem*)和字符串(str*)操作实现其他扩展。一些字符串(例如,rep stosb)指令可以用于更快的拷贝。例如,stosb、stosw、stosd可分别用于8比特(字节)、16比特(字)和32比特(双字)。因此,可以实现扩展,以赋能对于64比特(四字)和用于其他数据类型(例如,浮点、双精度等数据类型)的不同指令的所优化的快速字符串拷贝。
[0190]
典型地,存储器移动(例如,存储器分组拷贝(例如,movq指令))是独立于类型的。一些函数(例如,memset、memmove等)也是独立于类型的。然而,如果使用字符串操作,则当存在对数据的任何改变时,仍然需要区分数据类型。因此,可以增强cpu流水线,以实现独立于类型的操作。例如,memset可以用以将存储器清零。可以在指针中添加标记,并且可以将存储器内容重置为通用常量。这种类型绑定是选择性超控。在没有指示符的情况下,处理器可以类型化,以将密码术绑定到如本文先前描述的类型。然而,在标记的情况下,它告诉处理器不要基于数据类型进行解密/加密,因为这将导致正确性错误。
[0191]
以下的图12-图16提供一些可以在如本文所描述的实施例的上下文中使用的示例计算设备、计算环境、硬件、软件或流程。
[0192]
图12是示出根据至少一个实施例的示例密码式计算环境1200的框图。在所示示例中,密码式寻址层1210扩展跨越示例计算矢量中央处理单元(cpu)1202、图形处理单元(gpu)1204、人工智能(ai)1206和现场可编程门阵列(fpga)1208。例如,cpu 1202和gpu 1204可以对于存储器1212中存储的数据共享相同的虚拟地址转译,并且密码式地址可以构建在该所共享的虚拟存储器上。它们可以对于给定的执行流程共享相同的进程密钥,并遵照相同的密码式算法计算相同的细调,以对密码式已编码地址进行解密并且对由这些已编码地址引用的数据进行解密。
[0193]
得以组合,本文所描述的能力可以赋能密码式计算。可以从缓存的第一层级通过缓存的最后层级并进入系统存储器中在存储器层次结构的每一层级对存储器1212进行加密。将密码式地址编码绑定到数据加密可以允许极端精细粒度对象边界和存取控制,赋能下至甚至用于功能即服务的单独功能及其对象的精细粒度安全容器。对调用栈上的返回地址(取决于它们的位置)进行密码式编码也可以在不需要影子栈元数据的情况下赋能控制流程完整性。因此,仅取决于密码式寻址和各个密码式数据绑定,可以通过密码式方式执行任何数据存取控制策略和控制流程。
[0194]
图13-图14是可以根据本文所公开的实施例使用的示例性计算机架构的框图。通常,可以使用本领域中已知的用于处理器和计算系统的任何计算机架构设计。在一个示例中,本领域已知的用于膝上型计算机、台式机、手持式pc、个人数字助理、平板计算机、工程工作站、服务器、网络设备、服务器、电器、网络集线器、路由器、交换机、嵌入式处理器、数字信号处理器(dsp)、图形设备、视频游戏设备、机顶盒、微控制器、智能电话、移动设备、可穿戴电子设备、便携式媒体播放器、手持设备和各种其他电子设备的系统设计和配置也适合于本文描述的计算系统的实施例。通常,用于本文所公开的实施例的合适计算机架构可以包括但不限于图13-图15所示的配置。
[0195]
图13是根据实施例的处理器的示例说明。处理器1300是可以结合本文示出并且描述的实现方式(例如,处理器102)使用的一种类型的硬件设备的示例。处理器1300可以是任何类型的处理器(例如,微处理器、嵌入式处理器、数字信号处理器(dsp)、网络处理器、多核处理器、单核处理器或其他用于执行代码的设备)。虽然在图13中仅示出一个处理器1300,但是处理元件可以替代地包括图13中所示的处理器1300中的多于一个。处理器1300可以是单线程内核,或者对于至少一个实施例,处理器1300可以是多线程的,因为它可以包括每内核多于一个的硬件线程上下文(或“逻辑处理器”)。
[0196]
图13还示出根据实施例的耦合到处理器1300的存储器1302。存储器1302可以是对
于本领域技术人员已知的或以其他方式可用的广泛各种存储器(包括存储器层次结构的各个层)中的任一种。这些存储器元件可以包括但不限于随机存取存储器(ram)、只读存储器(rom)、现场可编程门阵列(fpga)的逻辑块、可擦除可编程只读存储器(eprom)和电可擦除可编程只读存储器(eeprom)。
[0197]
处理器1300可以执行与本文详述的算法、过程或操作关联的任何类型的指令。通常,处理器1300可以将要素或物品(例如,数据)从一种状态或事物变换为另一状态或事物。
[0198]
可以作为待由处理器1300执行的一个或多个指令的代码1304,可以存储在存储器1302中,或者可以存储在软件、硬件、固件或其任何合适的组合中,或者在适当的情况下并基于特定需求存储在任何其他内部或外部组件、设备、要素或对象中。在一个示例中,处理器1300可以遵照由代码1304指示的指令的程序序列。每条指令进入前端逻辑1306,并且由一个或多个解码器1308处理。解码器可以生成微操作(例如,呈预定义格式的固定宽度微操作)作为其输出,或者可以生成反映原始代码指令的其他指令、微指令或控制信号。前端逻辑1306还包括寄存器重命名逻辑1310和调度逻辑1312,它们通常分配资源并且将对应于指令的操作排队以用于执行。
[0199]
处理器1300可以还包括具有执行单元1316a、1316b、1316n等的集合的执行逻辑1314。一些实施例可以包括专用于特定功能或功能集合的数个执行单元。其他实施例可以仅包括一个执行单元或可以执行特定功能的一个执行单元。执行逻辑1314执行由代码指令指定的操作。
[0200]
在完成由代码指令指定的操作的执行之后,后端逻辑1318可以退离代码1304的指令。在一个实施例中,处理器1300允许指令的无序执行,但是要求有序退离。退离逻辑1320可以采取各种已知形式(例如,重新排序缓冲区等)。以此方式,至少鉴于由解码器生成的输出、由寄存器重命名逻辑1310利用的硬件寄存器和表以及由执行逻辑1314修改的任何寄存器(未示出),在代码1304的执行期间变换处理器1300。
[0201]
虽然未在图13中示出,但是处理元件可以包括具有处理器1300的芯片上的其他元件。例如,处理元件可以包括存储器控制逻辑连同处理器1300。处理元件可以包括i/o控制逻辑,和/或可以包括与存储器控制逻辑集成的i/o控制逻辑。处理元件可以还包括一个或多个缓存。在一些实施例中,非易失性存储器(例如,闪存或熔丝)也可以包括于具有处理器1300的芯片上。
[0202]
图14a是示出根据本公开的一个或多个实施例的示例性有序流水线和示例性寄存器重命名、无序发放/执行流水线二者的框图。图14b是示出根据本公开的一个或多个实施例的处理器中待包括的有序架构内核和示例性寄存器重命名、无序发放/执行架构内核的示例性实施例的框图。图14a-图14b中的实线框示出有序流水线和有序内核,而虚线框的可选添加示出寄存器重命名、无序发放/执行流水线和内核。考虑到有序方面是无序方面的子集,将描述无序方面。
[0203]
在图14a中,处理器流水线1400包括获取级1402、长度解码级1404、解码级1406、分配级1408、重命名级1410、调度(也称为分派或发放)级1412、寄存器读取/存储器读取级1414、执行级1416、回写/存储器写入级1418、异常处理级1422和提交级1424。
[0204]
图14b示出处理器内核1490,其包括耦合到执行引擎单元1450的前端单元1430,并且二者耦合到存储器单元1470。处理器内核1490和存储器单元1470是可以结合本文示出并
且描述的实现方式(例如,处理器102、存储器120)使用的硬件的类型的示例。内核1490可以是精简指令集计算(risc)内核、复杂指令集计算(cisc)内核、超长指令字(vliw)内核或混合或替代内核类型。作为又一选项,内核1490可以是专用内核(例如,网络或通信内核、压缩引擎、协处理器内核、通用计算图形处理单元(gpgpu)内核、图形内核等)。此外,处理器内核1490及其组件表示可以用以实现逻辑处理器及其各个组件的示例架构。
[0205]
前端单元1430包括分支预测单元1432,其耦合到指令缓存单元1434,指令缓存单元1434耦合到指令转译后备缓冲区(tlb)单元1436,指令转译后备缓冲区(tlb)单元1436耦合到指令获取单元1438,指令获取单元1438耦合到解码单元1440。解码单元1440(或解码器)可以对指令进行解码,并生成解码自、或以其他方式反映、或导出自原始指令的一个或多个微操作、微代码入口点、微指令、其他指令或其他控制信号作为输出。可以使用各种不同的机制实现解码单元1440。合适的机制的示例包括但不限于查找表、硬件实现方式、可编程逻辑阵列(pla)、微码只读存储器(rom)等。在一个实施例中,内核1490包括微码rom或存储用于(例如,解码单元1440中,或以其他方式,前端单元1430内的)特定宏指令的微代码的其他介质。解码单元1440耦合到执行引擎单元1450中的重命名/分配器单元1452。
[0206]
执行引擎单元1450包括重命名/分配器单元1452,其耦合到退离单元1454和一个或多个调度器单元1456的集合。调度器单元1456表示任何数量的不同调度器,包括保留站、中央指令窗口等。调度器单元1456耦合到物理寄存器文件单元1458。物理寄存器文件单元1458中的每一个表示一个或多个物理寄存器文件,其中的不同寄存器文件存储一种或多种不同的数据类型(例如,标量整数、标量浮点、封装整数、封装浮点、矢量整数、矢量浮点、状态(例如,作为待执行的下一指令的地址的指令指针)等)。在一个实施例中,物理寄存器文件单元1458包括矢量寄存器单元、写入掩码寄存器单元和标量寄存器单元。这些寄存器单元可以提供架构矢量寄存器、矢量掩码寄存器和通用寄存器(gpr)。在本文描述的至少一些实施例中,寄存器单元1458是可以结合本文示出并且描述的实现方式(例如,寄存器110)使用的硬件的类型的示例。物理寄存器文件单元1458与退离单元1454重叠,以示出可以(例如,使用重排序缓冲区和退离寄存器文件;使用未来文件、历史缓冲区和退离寄存器文件;使用寄存器映射和寄存器池;等)实现寄存器重命名和无序执行的各种方式。退离单元1454和物理寄存器文件单元1458耦合到执行集群1460。执行集群1460包括一个或多个执行单元1462的集合和一个或多个存储器存取单元1464的集合。执行单元1462可以且对各种类型的数据(例如,标量浮点、封装整数、封装浮点、矢量整数、矢量浮点)执行各种操作(例如,移位、加法、减法、乘法)。虽然一些实施例可以包括专用于特定功能或功能集合的数个执行单元,但是其他实施例可仅包括一个执行单元或全部执行所有功能的多个执行单元。执行单元1462可以还包括地址生成单元,以计算由内核用以存取主存储器(例如,存储器单元1470)和缺页处理程序(pmh)的地址。
[0207]
调度器单元1456、物理寄存器文件单元1458和执行集群1460示出为可能地是多个,因为特定实施例对于特定类型的数据/操作创建分离的流水线(例如,标量整数流水线、标量浮点/封装整数/封装浮点/矢量整数/矢量浮点流水线和/或存储器存取流水线,其均具有它们自己的调度程序单元、物理寄存器文件单元和/或执行集群——并且在分离的存储器存取流水线的情况下,实现仅该流水线的执行集群具有存储器存取单元1464的特定实施例)。还应理解,在使用分离的流水线的情况下,这些流水线中的一个或多个可以是无序
发放/执行,而其余是有序的。
[0208]
存储器存取单元1464的集合耦合到存储器单元1470,其包括tlb单元1472,tlb单元1472耦合到数据缓存单元1474,数据缓存单元1474耦合到层级2(l2)缓存单元1476。在一个示例性实施例中,存储器存取单元1464可以包括加载单元、存储地址单元和存储数据单元,其中的每一个耦合到存储器单元1470中的数据tlb单元1472。指令缓存单元1434进一步耦合到存储器单元1470中的层级2(l2)缓存单元1476。l2缓存单元1476耦合到一个或多个其他层级的缓存,并最终耦合到主存储器。此外,如果在数据tlb单元1472中并未找到匹配,则缺页处理程序也可以包括于内核1490中,以在页表中查找地址映射。
[0209]
通过示例的方式,示例性寄存器重命名、无序发放/执行内核架构可以如下实现流水线1400:1)指令获取单元1438执行获取和长度解码级1402和1404;2)解码单元1440执行解码级1406;3)重命名/分配器单元1452执行分配级1408和重命名级1410;4)调度器单元1456执行调度级1412;5)物理寄存器文件单元1458和存储器单元1470执行寄存器读取/存储器读取级1414;执行集群1460对执行级1416进行执行;6)存储器单元1470和物理寄存器文件单元1458执行回写/存储器写入级1418;7)在异常处置级1422中可能涉及各种单元;以及8)退离单元1454和物理寄存器文件单元1458执行提交级1424。
[0210]
内核1490可以支持一个或多个指令集(例如,x86指令集(带有已经添加有新版本的一些扩展);加利福尼亚州桑尼维尔mips technologies的mips指令集;加利福尼亚州桑尼维尔arm holdings的arm指令集(带有可选附加扩展(例如,neon)),包括本文描述的指令。在一个实施例中,内核1490包括用于支持封装数据指令集扩展(例如,avx1、avx2)的逻辑,由此允许使用封装数据执行由许多多媒体应用使用的操作。
[0211]
应理解,内核可以支持多线程(执行两个或更多个并行的操作或线程集合),并且可以通过包括以下方式的多种方式这样做:时间切片式多线程、同时多线程(其中,单个物理内核提供用于物理内核正同时多线程化的线程中的每一个的逻辑内核)、或其组合(例如,时间切片式获取和解码以及此后的同时多线程化(例如,在超线程技术中))。因此,在至少一些实施例中,可以支持多线程式飞地。
[0212]
虽然在无序执行的上下文中描述寄存器重命名,但是应理解,寄存器重命名可以用在有序架构中。虽然处理器的所示实施例还包括分离的指令和数据缓存单元1434/1474和共享的l2缓存单元1476,但是替选实施例可以具有用于指令和数据二者的单个内部缓存(例如,比如层级1(l1)内部缓存、或多个层级的内部缓存)。在一些实施例中,系统可以包括内部缓存和处于内核和/或处理器外部的外部缓存的组合。替代地,所有缓存可以处于内核和/或处理器的外部。
[0213]
图15示出根据实施例的点对点(ptp)配置中所布置的计算系统1500。具体而言,图15示出处理器、存储器和输入/输出设备由数个点对点接口互连的系统。通常,可以通过与计算系统1500相同或相似的方式配置本文描述的计算系统或计算设备中的一个或多个。
[0214]
处理器1570和1580可以实现为单核处理器1574a和1584a或多核处理器1574a-1574b和1584a-1584b。处理器1570和1580可以均包括由它们相应一个或多个内核使用的缓存1571和1581。共享缓存(未示出)可以包括于任一处理器中或这两个处理器之外,但经由p-p互连与处理器连接,以使得如果处理器置于低功耗模式下,则处理器之一或二者的本地缓存信息可以存储在共享缓存中。应注意,本文描述的一个或多个实施例可以实现于计算
系统(例如,计算系统1500)中。此外,处理器1570和1580是可以结合本文示出并且描述的实现方式(例如,处理器102)使用的硬件的类型的示例。
[0215]
处理器1570和1580也可以均包括集成存储器控制器逻辑(imc)1572和1582,以与存储器元件1532和1534进行通信,其可以是本地附接到相应处理器的主存储器的部分。在替选实施例中,存储器控制器逻辑1572和1582可以是与处理器1570和1580分离的分立式逻辑。存储器元件1532和/或1534可以存储由处理器1570和1580在实现本文概述的操作和功能中使用的各种数据。
[0216]
处理器1570和1580可以是任何类型的处理器(例如,结合其他附图讨论的处理器)。处理器1570和1580可以分别使用点对点接口电路1578和1588经由点对点(ptp)接口1550交换数据。处理器1570和1580可以均使用点对点接口电路1576、1586、1594和1598经由单独点对点接口1552和1554与输入/输出(i/o)子系统1590交换数据。i/o子系统1590也可以使用可以是ptp接口电路的接口电路1592经由高性能图形接口1539与高性能图形电路1538交换数据。在一个实施例中,高性能图形电路1538是专用处理器(例如,比如高吞吐量mic处理器、网络或通信处理器、压缩引擎、图形处理器、gpgpu、嵌入式处理器等)。i/o子系统1590还可与显示器1533进行通信,以用于显示人类用户可浏览的数据。在替选实施例中,图15所示的任何或所有ptp链路可以实现为多点总线而非ptp链路。
[0217]
i/o子系统1590可以经由接口电路1596与总线1510进行通信。总线1510可以具有通过它进行通信的一个或多个设备(例如,总线桥1518、i/o设备1514和一个或更多其他处理器1515)。经由总线1520,总线桥1518可以与其他设备(例如,用户接口1522(例如,键盘、鼠标、触摸屏或其他输入设备)、通信设备1526(例如,调制解调器、网络接口设备或可以通过计算机网络1560进行通信的其他类型的通信设备)、音频i/o设备1524和/或存储单元1528)进行通信。存储单元1528可以存储可以由处理器1570和/或1580执行的数据和代码1530。在替选实施例中,可以用一个或多个ptp链路实现总线架构的任何部分。
[0218]
程序代码(例如,代码1530)可以应用于输入指令,以执行本文描述的功能并生成输出信息。输出信息可以通过已知方式应用于一个或多个输出设备。出于本技术的目的,处理系统可以是计算系统1500的部分,并且包括具有处理器(例如,比如数字信号处理器(dsp)、微控制器、专用集成电路(asic)或微处理器)的任何系统。
[0219]
可以通过高级过程或面向对象的编程语言实现程序代码(例如,1530),以与处理系统进行通信。如果需要,则也可以通过汇编语言或机器语言实现程序代码。事实上,本文描述的机制在范围方面不限于任何特定编程语言。在任何情况下,语言可以是编译型或解释型语言。
[0220]
在一些情况下,指令转换器可以用以将指令从源指令集转换为目标指令集。例如,指令转换器可以将指令转译(例如,使用静态二进制转译、动态二进制转译(包括动态编译))、变体、仿真或以其他方式转换为待由内核处理的一个或多个其他指令。指令转换器可以实现于软件、硬件、固件或其组合中。指令转换器可以处于处理器上、处理器外、或部分在处理器上且部分在处理器外。
[0221]
图16是根据本公开的实施例的对比使用软件指令转换器以将源指令集中的二进制指令转换为目标指令集中的二进制指令的框图。在所示实施例中,指令转换器是软件指令转换器,但是可选地,指令转换器可以实现于软件、固件、硬件或其各种组合中。图16示出
可以使用x86编译器1604编译高级语言1602中的程序,以生成可以由带有至少一个x86指令集内核1616的处理器在本机执行的x86二进制代码1606。带有至少一个x86指令集内核的处理器1616表示可以通过以下操作执行与英特尔处理器实质上相同的结果的任何处理器:兼容地执行或以其他方式处理(1)英特尔x86指令集内核的指令集的实质部分、或(2)目标在于在带有至少一个x86指令集内核的英特尔处理器上运行的的目标代码版本,以实现与带有至少一个x86指令集内核的英特尔处理器实质上相同的结果。x86编译器1604表示可操作为生成可以在具有或没有附加链接处理的情况下在带有至少一个x86指令集内核1616的处理器上执行的x86二进制代码1606(例如,目标代码)的编译器。相似地,图16示出可以使用替代指令集编译器1608编译高级语言1602中的程序,以生成可以由没有至少一个x86指令集内核1614的处理器(例如,具有执行加利福尼亚州桑尼维尔mips technologies的mips指令集和/或执行加利福尼亚州桑尼维尔arm holdings的arm指令集的内核的处理器)在本机执行的替代指令集二进制代码1610。指令转换器1612用以将x86二进制代码1606转换为可以由没有x86指令集内核1614处理器在本机执行的代码。该转换后的代码不太可能与替代指令集二进制代码1610相同,因为有此能力的指令转换器是难以制造的;然而,转换后的代码将完成普通操作,并由来自替代指令集的指令组成。因此,指令转换器1612表示通过仿真、仿拟或任何其他过程允许没有x86指令集处理器或内核的处理器或其他电子设备执行x86二进制代码1606的软件、固件、硬件或其组合。
[0222]
可以通过当由机器读取时使机器制造逻辑以执行本文描述的技术中的一个或多个的表示处理器内的各种逻辑的机器可读介质上存储的代表性指令实现至少一个实施例的一个或多个方面。称为“ip内核”的这些表示法可以存储在有形机器可读介质上,并提供给各种客户或制造设施,以加载到实际制作逻辑或处理器的制造机器中。
[0223]
这些机器可读存储介质可以包括但不限于由机器或设备制造或形成的物品的非瞬时、有形布置,包括存储介质(例如,硬盘、任何其他类型的盘(包括软盘、光盘、压缩盘只读存储器(cd-rom)、可重写压缩盘(cd-rw)和磁光盘)、半导体器件(例如,只读存储器(rom)、随机存取存储器(ram),例如动态随机存取存储器(dram)、静态随机存取存储器(sram)、可擦除可编程只读存储器(eprom)、闪存、电可擦除可编程只读存储器(eeprom)、相变存储器(pcm)、磁卡或光卡)或适合于存储电子指令的任何其他类型的介质)。
[0224]
因此,本公开的实施例还包括包含指令或包含设计数据(例如,定义本文描述的结构、电路、装置、处理器和/或系统特征的硬件描述语言(hdl))的非瞬时有形机器可读介质。这些实施例也可以称为程序产品。
[0225]
图15中描绘的计算系统是可以利用以实现本文讨论的各种实施例的计算系统的实施例的示意图。应理解,可以在片上系统(soc)架构中或在能够实现本文提供的示例和实现方式的功能和特征的任何其他合适的配置中组合图15中描绘的系统的各种组件。
[0226]
虽然已经鉴于特定实现方式和通常关联的方法描述本公开,但是这些实现方式和方法的更改和排列对于本领域技术人员将是显而易见的。例如,本文描述的动作可以通过与所描述的顺序不同的顺序得以执行,并且仍然实现期望的结果。作为一个示例,附图中描绘的过程不一定需要所示的特定顺序或依次顺序以实现期望的结果。在特定实现方式中,多任务化和并行处理可以是有利的。其他变型处于所附权利要求的范围内。
[0227]
本文提出的架构仅通过示例的方式得以提供,并且旨在成为非排他性且非限定性
的。此外,所公开的各个部分旨在仅作为逻辑划分,而不一定表示物理上分离的硬件和/或软件组件。特定计算系统可以在单个物理存储设备中提供存储元件,而在其他情况下,存储元件可以在功能上分布在许多物理设备上。在虚拟机管理器或管理程序的情况下,可以通过在虚拟化层上运行的软件或固件的形式提供功能的全部或部分,以提供所公开的逻辑功能。
[0228]
注意,在本文提供的示例的情况下,可以鉴于单个计算系统描述交互。然而,仅为了清楚性和示例的目的,已经进行该操作。在特定情况下,通过仅引用单个计算系统描述给定的流程集合的功能中的一个或多个可能是更容易的。此外,用于深度学习和恶意软件检测的系统是易于扩展的,并且可以实现得跨越大数量的组件(例如,多个计算系统)以及更复杂/精密的布置和配置。因此,所提供的示例不应限制潜在地应用于无数其他架构的计算系统的范围或禁止广泛教导。
[0229]
如本文所使用的那样,除非明确地声明为相反,否则短语
“……
中的至少一个”的使用指代所命名的项、要素、条件或活动的任何组合。例如,“x、y和z中的至少一个”旨在意指以下中的任一项:1)至少一个x,但非y也非z;2)至少一个y,但非x也非z;3)至少一个z,但非x也非y;4)至少一个x和至少一个y,但非z;5)至少一个x和至少一个z,但非y;6)至少一个y和至少一个z,但非x;或7)至少一个x、至少一个y和至少一个z。
[0230]
附加地,除非明确地声明为相反,否则术语“第一”、“第二”、“第三”等旨在区分它们修饰的特定名词(例如,要素、条件、模块、活动、操作、权利要求要素等),而非旨在指示所修饰的名词的任何类型的顺序、等级、重要性、时间顺序或层次结构。例如,“第一x”和“第二x”旨在指定不一定为两个要素的任何顺序、等级、重要性、时间顺序或层次结构所限制的两个分离的x要素。
[0231]
说明书中对“一个实施例”、“实施例”、“一些实施例”等的引用指示所描述的实施例可以包括特定特征、结构或特性,但是每一实施例可以包括或可以不一定包括该特定特征、结构或特性。此外,这些短语不一定指代同一实施例。
[0232]
虽然本说明书包含许多具体实现方式细节,但是它们不应解释为对任何实施例的范围或可能要求保护的内容的范围的限制,而是特定于特定实施例的特征的描述。本说明书中在分离的实施例的上下文中描述的特定特征也可以通过组合实现于单个实施例中。相反,在单个实施例的上下文中描述的各种特征也可以分离地或以任何合适的子组合实现于多个实施例中。此外,虽然特征可以在以上描述为以特定组合起作用,并且甚至最初要求保护如是,但是在一些情况下可以从组合中删除来自要求保护的组合的一个或多个特征,并且所要求保护的组合可以直指子组合或子组合的变型。
[0233]
相似地,上述实施例中的各种系统组件和模块的分离不应理解为在所有实施例中要求这种分离。应理解,所描述的程序组件、模块和系统通常可以一起集成在单个软件产品中或封装到多个软件产品中。
[0234]
因此,已经描述主题的特定实施例。其他实施例处于本公开的范围内。本领域技术人员可以确证大量其他改变、替换、变型、更改和修改,并且本公开旨在涵盖落入所附权利要求的范围内的所有这些改变、替换、变型、更改和修改。
[0235]
其他注意事项和示例
[0236]
示例aa1提供:一种处理器,包括:寄存器,其用于存储指向栈存储器中的变量的已
编码指针,所述已编码指针包括:受加密部分;和存储器地址的固定明文部分,其对应于所述变量;电路,其用于:响应于与变量关联的存储器存取请求,对所述已编码指针的所述受加密部分进行解密,以获得所述存储器地址的第一高地址比特和用于变量的存储器分配大小;对所述已编码指针进行解码,以获得所述存储器地址;至少部分地基于所述存储器分配大小验证所述存储器地址是有效的;以及响应于确定所述存储器地址是有效的,允许所述存储器存取请求。
[0237]
示例aa2包括:如示例aa1所述的主题,并且所述电路进一步用于:接收对所述变量的存储器分配请求;确定用于所述栈存储器的所述存储器分配大小;至少部分地基于栈指针获得用于所述变量的所述存储器地址;将所述存储器地址的所述第一高地址比特存储在存储器位置中;以及基于地址密钥和地址细调对所述存储器分配大小和所述存储器地址的所述第一高地址比特进行加密。
[0238]
示例aa3包括:如示例aa1-aa2中任一项所述的主题,并且所述电路进一步用于:所述电路进一步用于:将第二高地址比特与所述第一高地址比特存储在存储器位置中,其中,所述第一高地址比特和所述第二高地址比特对于所述栈存储器是固定的。
[0239]
示例aa4包括:如示例aa3所述的主题,并且验证所述存储器地址是有效的包括:确定从对所述已编码指针的所述受加密部分进行解密获得的所述第一高地址比特与所述存储器位置中存储的第一高地址比特匹配。
[0240]
示例aa5包括:如示例aa4所述的主题,并且所述已编码指针包括以2的幂指示的幂元数据、表示固定偏移的所述已编码指针中的第一数量的比特和表示不定偏移的所述已编码指针中的第二数量的比特。
[0241]
示例aa6包括:如示例aa1-aa5中任一项所述的主题,并且所述电路进一步用于:使用地址密钥和地址细调作为输入,用分组密码对所述已编码指针的所述受加密部分进行解密。
[0242]
示例aa7包括:如示例aa6所述的主题,并且所述已编码指针包括以2的幂指示的幂元数据、表示固定偏移的所述已编码指针中的第一数量的比特和表示不定偏移的所述已编码指针中的第二数量的比特。
[0243]
示例aa8包括:如示例aa7所述的主题,并且所述地址细调包括所述固定偏移和所述幂元数据。
[0244]
示例aa9包括:如示例aa1-aa8中任一项所述的主题,并且所述存储器地址用于部分地基于所述固定明文部分和所述第一高地址比特解码自所述已编码指针。
[0245]
示例aa10包括:如示例aa9所述的主题,并且所述电路进一步用于:基于解码自所述已编码指针的所述存储器地址,加载所述栈存储器的所述变量中存储的第一数据;以及基于至少部分地从所述已编码指针导出的第一数据密钥和数据细调对所述第一数据进行解密。
[0246]
示例aa11包括:如示例aa9所述的主题,并且所述电路进一步用于:基于第一数据密钥和至少部分地从所述已编码指针导出的数据细调对第一数据进行加密;以及使用解码自所述已编码指针的所述存储器地址,以将加密的第一数据存储在对应于所述存储器地址的所述变量中。
[0247]
示例am1提供:一种方法,包括:在寄存器中存储指向栈存储器中的变量的已编码
指针,其中,所述已编码指针包括受加密部分和对应于所述变量的存储器地址的固定明文部分;响应于与所述变量关联的存储器存取请求,对所述已编码指针的所述受加密部分进行解密,以获得所述存储器地址的第一高地址比特和用于变量的存储器分配大小;对所述已编码指针进行解码,以获得所述存储器地址;至少部分地基于所述存储器分配大小验证所述存储器地址是有效的;以及基于验证所述存储器地址是有效的,允许所述存储器存取请求。
[0248]
示例am2包括:如示例am1所述的主题,并且所述方法还包括:接收对所述变量的存储器分配请求;确定用于所述栈存储器的所述存储器分配大小;至少部分地基于栈指针获得用于所述变量的所述存储器地址;将所述存储器地址的所述第一高地址比特存储在存储器位置中;以及基于地址密钥和地址细调对所述存储器分配大小和所述存储器地址的所述第一高地址比特进行加密。
[0249]
示例am3包括:如示例am1-am2中任一项所述的主题,并且所述方法还包括:将第二高地址比特与所述第一高地址比特存储在存储器位置中,其中,所述第一高地址比特和所述第二高地址比特对于所述栈存储器是固定的。
[0250]
示例am4包括:如示例am3所述的主题,并且验证所述存储器地址是有效的包括:确定从对所述已编码指针的所述受加密部分进行解密获得的所述第一高地址比特与所述存储器位置中存储的第一高地址比特匹配。
[0251]
示例am5包括:如示例am4所述的主题,并且验证所述存储器地址是有效的还包括:确定所述存储器地址是否小于所述存储器分配大小和所述变量的变量基址之和。
[0252]
示例am6包括:如示例am1-am5中任一项所述的主题,并且使用地址密钥和地址细调作为输入,用分组密码对所述已编码指针的所述受加密部分进行解密。
[0253]
示例am7包括:如示例am6所述的主题,并且所述已编码指针包括以2的幂指示的幂元数据、表示固定偏移的所述已编码指针中的第一数量的比特和表示不定偏移的所述已编码指针中的第二数量的比特。
[0254]
示例am8包括:如示例am7所述的主题,并且所述地址细调包括所述固定偏移和所述幂元数据。
[0255]
示例am9包括:如示例am1-am8中任一项所述的主题,并且所述存储器地址用于部分地基于所述固定明文部分和所述第一高地址比特解码自所述已编码指针。
[0256]
示例am10包括:如示例am9所述的主题,并且所述方法还包括:基于解码自所述已编码指针的所述存储器地址,加载所述栈存储器的所述变量中存储的第一数据;以及基于至少部分地从所述已编码指针导出的第一数据密钥和数据细调对所述第一数据进行解密。
[0257]
示例am11包括:如示例am9所述的主题,并且所述方法还包括:基于第一数据密钥和至少部分地从所述已编码指针导出的数据细调对第一数据进行加密;以及使用解码自所述已编码指针的所述存储器地址,以将加密的第一数据存储在对应于所述存储器地址的所述变量中。
[0258]
示例ba1提供:一种处理器,包括:寄存器,其用于存储指向存储器中的存储器位置的已编码指针,并且所述已编码指针用于包括受加密部分;电路,其用于:基于第一数据存取指令确定第一数据加密因子;对所述已编码指针进行解码,以获得所述存储器位置的存储器地址;使用所述存储器地址以存取受加密第一数据元素;以及使用具有第一输入的密
码式算法对所述受加密第一数据元素进行解密,以生成受解密第一数据元素,所述第一输入包括基于所述第一数据存取指令的所述第一数据加密因子和来自所述已编码指针的第二数据加密因子。
[0259]
示例ba2包括:如示例ba1所述的主题,并且所述已编码指针还包括第一元数据。
[0260]
示例ba3包括:如示例ba2所述的主题,并且所述第一元数据包括许可。
[0261]
示例ba4包括:如示例ba2所述的主题,并且所述第一元数据是数据结构的存储器分配大小。
[0262]
示例ba5包括:如示例ba4所述的主题,并且所述存储器地址对应于所述数据结构的基址。
[0263]
示例ba6包括:如示例ba4-ba5中任一项所述的主题,并且所述第一数据加密因子包括从所述第一数据存取指令推断的所述受加密第一数据元素的第一数据类型,并且所述数据结构包含具有所述第一数据类型的所述受加密第一数据元素和具有第二数据类型的受加密第二数据元素。
[0264]
示例ba7包括:如示例ba2-ba6中任一项所述的主题,并且所述第一元数据是所述受加密第一数据元素的存储器分配大小,并且所述存储器地址对应于所述受加密第一数据元素的第一字节。
[0265]
示例ba8包括:如示例ba1-ba7中任一项所述的主题,并且所述电路进一步:响应于第二数据存取指令,对第二已编码指针进行解码以获得第二存储器位置的第二存储器地址;使用所述第二存储器地址以存取受加密第二数据元素;以及基于所述第二数据存取指令确定第三数据加密因子;以及使用具有第二输入的所述密码式算法对所述受加密第二数据元素进行解密,所述第二输入包括基于所述第二数据存取指令的所述第三数据加密因子和来自所述第二已编码指针的第四数据加密因子。
[0266]
示例ba9包括:如示例ba1-ba8中任一项所述的主题,并且所述第一数据加密因子和所述第二数据加密因子包括于数据细调中作为用于所述密码式算法的第一输入之一,以对所述受加密第一数据元素进行解密。
[0267]
示例ba10包括:如示例ba1-ba9中任一项所述的主题,并且所述第一数据加密因子包括从所述第一数据存取指令导出的第一数据类型。
[0268]
示例ba11包括:如示例ba10所述的主题,并且从所述第一数据存取指令导出所述第一数据类型用于基于所述第一数据存取指令的操作码推断所述第一数据类型。
[0269]
示例ba12包括:如示例ba10所述的主题,并且用于对所述受加密第一数据元素进行解密的用于所述密码式算法的所述第一数据加密因子还包括从所述第一数据存取指令导出的位移值。
[0270]
示例ba13包括:如示例ba1-ba12中任一项所述的主题,并且所述电路进一步用于:确定所述第一数据存取指令包括前缀;以及基于所述前缀中包括的信息确定所述第一数据加密因子。
[0271]
示例ba14包括:如示例ba1-ba13中任一项所述的主题,并且所述存储器位置处于堆存储器或栈存储器中。
[0272]
示例ba15包括:如示例ba1-ba14中任一项所述的主题,并且对所述已编码指针进行解码包括:使用具有第三输入的第二密码式算法对所述已编码指针的所述受加密部分进
行解密,所述第三输入包括与所述第一数据存取指令关联的所述第一数据加密因子。
[0273]
示例ba16包括:如示例ba1-ba15中任一项所述的主题,并且所述电路进一步用于:响应于确定所述受解密第一数据元素不是所述密码式算法的有效结果,阻挡所述第一数据存取指令。
[0274]
示例ba17包括:如示例ba1-ba16中任一项所述的主题,并且所述第一数据存取指令与用于所述第一加密数据元素的读取操作关联。
[0275]
示例bm1提供:一种方法,包括:在寄存器中存储指向存储器中的存储器位置的已编码指针,并且所述已编码指针用于包括受加密部分;基于第一数据存取指令确定第一数据加密因子;对所述已编码指针进行解码,以获得所述存储器位置的存储器地址;使用所述存储器地址以存取受加密第一数据元素;以及使用具有第一输入的密码式算法对所述受加密第一数据元素进行解密,以生成受解密第一数据元素,所述第一输入包括基于所述第一数据存取指令的所述第一数据加密因子和来自所述已编码指针的第二数据加密因子。
[0276]
示例bm2包括:如示例bm1所述的主题,并且所述已编码指针还包括第一元数据。
[0277]
示例bm3包括:如示例bm2所述的主题,并且所述第一元数据包括许可。
[0278]
示例bm4包括:如示例bm2所述的主题,并且所述第一元数据是数据结构的存储器分配大小。
[0279]
示例bm5包括:如示例bm4所述的主题,并且所述存储器地址对应于所述数据结构的基址。
[0280]
示例bm6包括:如示例bm4-bm5中任一项所述的主题,并且所述第一数据加密因子包括从所述第一数据存取指令推断的所述受加密第一数据元素的第一数据类型,并且所述数据结构包含具有所述第一数据类型的所述受加密第一数据元素和具有第二数据类型的受加密第二数据元素。
[0281]
示例bm7包括:如示例bm2-bm6中任一项所述的主题,并且所述第一元数据是所述受加密第一数据元素的存储器分配大小,并且所述存储器地址对应于所述受加密第一数据元素的第一字节。
[0282]
示例bm8包括:如示例bm1-bm7中任一项所述的主题,并且所述方法还包括:响应于第二数据存取指令,对第二已编码指针进行解码以获得第二存储器位置的第二存储器地址;使用所述第二存储器地址以存取受加密第二数据元素;以及基于所述第二数据存取指令确定第三数据加密因子;以及使用具有第二输入的所述密码式算法对所述受加密第二数据元素进行解密,所述第二输入包括基于所述第二数据存取指令的所述第三数据加密因子和来自所述第二已编码指针的第四数据加密因子。
[0283]
示例bm9包括:如示例bm1-bm8中任一项所述的主题,并且所述第一数据加密因子和所述第二数据加密因子包括于数据细调中作为用于所述密码式算法的第一输入之一,以对所述受加密第一数据元素进行解密。
[0284]
示例bm10包括:如示例bm1-bm9中任一项所述的主题,并且所述第一数据加密因子包括从所述第一数据存取指令导出的第一数据类型。
[0285]
示例bm11包括:如示例bm10所述的主题,并且从所述第一数据存取指令导出所述第一数据类型用于基于所述第一数据存取指令的操作码推断所述第一数据类型。
[0286]
示例bm12包括:如示例bm10所述的主题,并且用于对所述受加密第一数据元素进
行解密的用于所述密码式算法的所述第一数据加密因子还包括从所述第一数据存取指令导出的位移值。
[0287]
示例bm13包括:如示例bm1-bm12中任一项所述的主题,并且所述方法还包括:确定所述第一数据存取指令包括前缀;以及基于所述前缀中包括的信息确定所述第一数据加密因子。
[0288]
示例bm14包括:如示例bm1-bm13中任一项所述的主题,并且所述存储器位置处于堆存储器或栈存储器中。
[0289]
示例bm15包括:如示例bm1-bm14中任一项所述的主题,并且对所述已编码指针进行解码包括:使用具有第三输入的第二密码式算法对所述已编码指针的所述受加密部分进行解密,所述第三输入包括与所述第一数据存取指令关联的所述第一数据加密因子。
[0290]
示例bm16包括:如示例bm1-bm15中任一项所述的主题,并且所述方法还包括:响应于确定所述受解密第一数据元素不是所述密码式算法的有效结果,阻挡所述第一数据存取指令。
[0291]
示例bm17包括:如示例bm1-bm16中任一项所述的主题,并且所述第一数据存取指令与用于所述第一加密数据元素的读取操作关联。
[0292]
示例ba1提供:一种处理器,包括:寄存器,其用于存储指向存储器中的存储器位置的已编码指针,并且所述已编码指针用于包括受加密部分;电路,其用于:基于第一数据存取指令确定第一数据加密因子;对所述已编码指针进行解码,以获得所述存储器位置的存储器地址;使用所述存储器地址以存取受加密第一数据元素;以及使用具有第一输入的密码式算法对所述受加密第一数据元素进行解密,以生成受解密第一数据元素,所述第一输入包括基于所述第一数据存取指令的所述第一数据加密因子和来自所述已编码指针的第二数据加密因子。
[0293]
示例ba2包括:如示例ba1所述的主题,并且所述已编码指针还包括第一元数据。
[0294]
示例ba3包括:如示例ba2所述的主题,并且所述第一元数据包括许可。
[0295]
示例ba4包括:如示例ba2所述的主题,并且所述第一元数据是数据结构的存储器分配大小。
[0296]
示例ba5包括:如示例ba4所述的主题,并且所述存储器地址对应于所述数据结构的基址。
[0297]
示例ba6包括:如示例ba4-ba5中任一项所述的主题,并且所述第一数据加密因子包括从所述第一数据存取指令推断的所述受加密第一数据元素的第一数据类型,并且所述数据结构包含具有所述第一数据类型的所述受加密第一数据元素和具有第二数据类型的受加密第二数据元素。
[0298]
示例ba7包括:如示例ba2-ba6中任一项所述的主题,并且所述第一元数据是所述受加密第一数据元素的存储器分配大小,并且所述存储器地址对应于所述受加密第一数据元素的第一字节。
[0299]
示例ba8包括:如示例ba1-ba7中任一项所述的主题,并且所述电路进一步:响应于第二数据存取指令,对第二已编码指针进行解码以获得第二存储器位置的第二存储器地址;使用所述第二存储器地址以存取受加密第二数据元素;以及基于所述第二数据存取指令确定第三数据加密因子;以及使用具有第二输入的所述密码式算法对所述受加密第二数
据元素进行解密,所述第二输入包括基于所述第二数据存取指令的所述第三数据加密因子和来自所述第二已编码指针的第四数据加密因子。
[0300]
示例ba9包括:如示例ba1-ba8中任一项所述的主题,并且所述第一数据加密因子和所述第二数据加密因子包括于数据细调中作为用于所述密码式算法的第一输入之一,以对所述受加密第一数据元素进行解密。
[0301]
示例ba10包括:如示例ba1-ba9中任一项所述的主题,并且所述第一数据加密因子包括从所述第一数据存取指令导出的第一数据类型。
[0302]
示例ba11包括:如示例ba10所述的主题,并且从所述第一数据存取指令导出所述第一数据类型用于基于所述第一数据存取指令的操作码推断所述第一数据类型。
[0303]
示例ba12包括:如示例ba10所述的主题,并且用于对所述受加密第一数据元素进行解密的用于所述密码式算法的所述第一数据加密因子还包括从所述第一数据存取指令导出的位移值。
[0304]
示例ba13包括:如示例ba1-ba12中任一项所述的主题,并且所述电路进一步用于:确定所述第一数据存取指令包括前缀;以及基于所述前缀中包括的信息确定所述第一数据加密因子。
[0305]
示例ba14包括:如示例ba1-ba13中任一项所述的主题,并且所述存储器位置处于堆存储器或栈存储器中。
[0306]
示例ba15包括:如示例ba1-ba14中任一项所述的主题,并且对所述已编码指针进行解码包括:使用具有第三输入的第二密码式算法对所述已编码指针的所述受加密部分进行解密,所述第三输入包括与所述第一数据存取指令关联的所述第一数据加密因子。
[0307]
示例ba16包括:如示例ba1-ba15中任一项所述的主题,并且所述电路进一步用于:响应于确定所述受解密第一数据元素不是所述密码式算法的有效结果,阻挡所述第一数据存取指令。
[0308]
示例ba17包括:如示例ba1-ba16中任一项所述的主题,并且所述第一数据存取指令与用于所述第一加密数据元素的读取操作关联。
[0309]
示例bm1提供:一种方法,包括:在寄存器中存储指向存储器中的存储器位置的已编码指针,并且所述已编码指针用于包括受加密部分;基于第一数据存取指令确定第一数据加密因子;对所述已编码指针进行解码,以获得所述存储器位置的存储器地址;使用所述存储器地址以存取受加密第一数据元素;以及使用具有第一输入的密码式算法对所述受加密第一数据元素进行解密,以生成受解密第一数据元素,所述第一输入包括基于所述第一数据存取指令的所述第一数据加密因子和来自所述已编码指针的第二数据加密因子。
[0310]
示例bm2包括:如示例bm1所述的主题,并且所述已编码指针还包括第一元数据。
[0311]
示例bm3包括:如示例bm2所述的主题,并且所述第一元数据包括许可。
[0312]
示例bm4包括:如示例bm2所述的主题,并且所述第一元数据是数据结构的存储器分配大小。
[0313]
示例bm5包括:如示例bm4所述的主题,并且所述存储器地址对应于所述数据结构的基址。
[0314]
示例bm6包括:如示例bm4-bm5中任一项所述的主题,并且所述第一数据加密因子包括从所述第一数据存取指令推断的所述受加密第一数据元素的第一数据类型,并且所述
数据结构包含具有所述第一数据类型的所述受加密第一数据元素和具有第二数据类型的受加密第二数据元素。
[0315]
示例bm7包括:如示例bm2-bm6中任一项所述的主题,并且所述第一元数据是所述受加密第一数据元素的存储器分配大小,并且所述存储器地址对应于所述受加密第一数据元素的第一字节。
[0316]
示例bm8包括:如示例bm1-bm7中任一项所述的主题,并且所述方法还包括:响应于第二数据存取指令,对第二已编码指针进行解码以获得第二存储器位置的第二存储器地址;使用所述第二存储器地址以存取受加密第二数据元素;以及基于所述第二数据存取指令确定第三数据加密因子;以及使用具有第二输入的所述密码式算法对所述受加密第二数据元素进行解密,所述第二输入包括基于所述第二数据存取指令的所述第三数据加密因子和来自所述第二已编码指针的第四数据加密因子。
[0317]
示例bm9包括:如示例bm1-bm8中任一项所述的主题,并且所述第一数据加密因子和所述第二数据加密因子包括于数据细调中作为用于所述密码式算法的第一输入之一,以对所述受加密第一数据元素进行解密。
[0318]
示例bm10包括:如示例bm1-bm9中任一项所述的主题,并且所述第一数据加密因子包括从所述第一数据存取指令导出的第一数据类型。
[0319]
示例bm11包括:如示例bm10所述的主题,并且从所述第一数据存取指令导出所述第一数据类型用于基于所述第一数据存取指令的操作码推断所述第一数据类型。
[0320]
示例bm12包括:如示例bm10所述的主题,并且用于对所述受加密第一数据元素进行解密的用于所述密码式算法的所述第一数据加密因子还包括从所述第一数据存取指令导出的位移值。
[0321]
示例bm13包括:如示例bm1-bm12中任一项所述的主题,并且所述方法还包括:确定所述第一数据存取指令包括前缀;以及基于所述前缀中包括的信息确定所述第一数据加密因子。
[0322]
示例bm14包括:如示例bm1-bm13中任一项所述的主题,并且所述存储器位置处于堆存储器或栈存储器中。
[0323]
示例bm15包括:如示例bm1-bm14中任一项所述的主题,并且对所述已编码指针进行解码包括:使用具有第三输入的第二密码式算法对所述已编码指针的所述受加密部分进行解密,所述第三输入包括与所述第一数据存取指令关联的所述第一数据加密因子。
[0324]
示例bm16包括:如示例bm1-bm15中任一项所述的主题,并且所述方法还包括:响应于确定所述受解密第一数据元素不是所述密码式算法的有效结果,阻挡所述第一数据存取指令。
[0325]
示例bm17包括:如示例bm1-bm16中任一项所述的主题,并且所述第一数据存取指令与用于所述第一加密数据元素的读取操作关联。
[0326]
示例g1包括:一种装置,其包括用于执行如示例bm1-bm17中任一项所述的方法的一个或多个要素的部件。
[0327]
示例g2包括:如g1所述的主题,并且所述用于执行所述方法的部件包括至少一个处理器和至少一个存储器元件。
[0328]
示例g3包括:如示例g1-g2中任一项所述的主题,并且所述装置是计算系统、片上
系统或多芯片封装器件或管芯之一。
[0329]
示例g3包括:一种或多种非瞬时计算机可读介质,其包括指令,所述指令使电子设备在由所述电子设备的一个或多个处理器执行所述指令时执行如示例bm1-bm17中任一项所述的方法的一个或多个要素。
[0330]
示例g1包括:一种装置,其包括用于执行如示例am1-am11或bm1-bm17中任一项所述的方法的一个或多个要素的部件。
[0331]
示例g2包括:如g1所述的主题,并且所述用于执行所述方法的部件包括至少一个处理器和至少一个存储器元件。
[0332]
示例g3包括:如示例g1-g2中任一项所述的主题,并且所述装置是计算系统、片上系统或多芯片封装器件或管芯之一。
[0333]
示例g3包括:一种或多种非瞬时计算机可读介质,其包括指令,所述指令使电子设备在由所述电子设备的一个或多个处理器执行所述指令时执行如示例am1-am11或bm1-bm17中任一项所述的方法的一个或多个要素。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1