首页 / 专利库 / 动物学 / 访问 / 可缓存的但不可通过推测指令访问的内存类型

可缓存的但不可通过推测指令访问的内存类型

阅读:733发布:2023-03-07

专利汇可以提供可缓存的但不可通过推测指令访问的内存类型专利检索,专利查询,专利分析的服务。并且一种改进的架构方法,用于基于推测执行处理处理器缓存攻击,其定义了一种新的内存类型,其既是可缓存的又是不可推测 访问 的。推测执行不能够访问和暴露不可推测地访问的内存 位置 。这样的机制能够防止特定的敏感数据通过推测执行而被暴露。必须以性能为代价来保护的数据可以被特别标记。如果处理器被告知秘密被存储在内存的哪个位置并被阻止在那些内存位置上推测,则处理器将确保试图访问那些内存位置的 进程 在读取和缓存它们之前有访问那些位置的特权。这种对策可以有效对抗使用推测访问来泄露来自处理器缓存的秘密的攻击。,下面是可缓存的但不可通过推测指令访问的内存类型专利的具体信息内容。

1.一种访问内存的方法,其特征在于:
确定内存位置是否被标记为可缓存的但不可推测地访问的;以及
如果所述确定确定了所述内存位置被标记为可缓存的但不可推测地访问的,则允许所述内存位置内容被缓存,但不允许推测执行访问所述内存位置。
2.根据权利要求1所述的方法,其特征还在于,所述确定是基于虚拟内存页表。
3.根据上述任一权利要求所述的方法,其特征还在于,所述确定是基于内存类型。
4.根据上述任一权利要求所述的方法,其特征还在于,所述确定是基于所述内存位置是在内存的特定区域中。
5.根据上述任一权利要求所述的方法,其特征还在于,所述确定是基于所述内存位置是在内存的预定义的固定区域中。
6.根据上述任一权利要求所述的方法,其特征还在于,所述确定是基于页表中存储的信息。
7.根据上述任一权利要求所述的方法,其特征还在于,所述确定是基于翻译后备缓冲器中存储的信息。
8.根据上述任一权利要求所述的方法,其特征还在于,所述确定是基于指令格式。
9.根据上述任一权利要求所述的方法,其特征还在于,不允许访问包括拒绝对所述内存位置的推测加载访问。
10.根据上述任一权利要求所述的方法,其特征还在于,不允许访问包括拒绝能够导致写入内存线的推测访问。
11.一种处理器,其特征在于:
内存管理系统,其确定内存位置是否被标记为是可被缓存的但不可推测地访问的,并允许缓存被这样标记的内存位置;以及
推测执行硬件,配置为如果确定所述内存位置为可被缓存的但不可推测地访问的,则不允许推测访问来访问所述内存位置。
12.根据上述权利要求11所述的处理器,其特征还在于,所述内存管理系统使用虚拟内存页表来确定内存位置是否被标记为可被缓存的但不可推测地访问的。
13.根据上述权利要求11-12任一项所述的处理器,其特征还在于,所述内存管理系统基于内存类型来确定。
14.根据上述权利要求11-13任一项所述的处理器,其特征还在于,所述内存管理系统基于位于预定的内存范围内的所述内存位置来确定。
15.一种页表存储,其特征在于:
至少一个位存储,指定内存位置是否被标记为可缓存的但不可推测地访问的,从而允许缓存被这样标记的内存位置。
16.一种内存访问安排,其特征在于:
内存位置;以及
标记,用于指示所述内存位置是可缓存的且可推测地访问的,
其中,响应于所述标记,当处理器在推测执行模式下操作时,阻止试图访问所述内存位置的所述处理器推测地访问与所述内存位置相关联的数据。
17.一种处理器实现的阻止对数据的推测访问的方法,其特征在于:
发出指令,所述指令包括对地址的内存访问;
确定所述处理器正在推测地执行所述指令;
识别所述地址的内存类型,其中所述内存类型是可缓存的但不可推测的;以及响应于所述识别,阻止所述推测地执行指令在所述地址访问内存,和/或访问与所述地址相关联的数据。
18.根据权利要求17所述的方法,其特征还在于:所述识别所述地址的内存类型包括从页表和/或翻译后备缓冲器读取编码的内存类型值。
19.根据上述权利要求17-18任一项所述的方法,其特征还在于:所述确定包括确定所述内存指令是其预测尚未被验证的分支后的预测路径的一部分。
20.根据上述权利要求17-19任一项所述的方法,其特征还在于:所述确定包括确定所述内存指令是推测执行路径的一部分。
21.根据上述权利要求17-10任一项所述的方法,其特征还在于:所述内存指令是内存加载指令。
22.根据上述权利要求17-21任一项所述的方法,其特征还在于:存储在所述内存位置的指令的格式指示所述内存类型。
23.根据上述权利要求17-22任一项所述的方法,其特征还在于:至少部分使用来自页表的信息执行所述识别。
24.一种处理器,其特征在于:
管线化的执行电路,其推测地执行指令;以及
页表
所述处理器,其特征还在于:
所述页表指示内存位置是否被标记为可缓存的但不可推测地访问的;以及所述处理器包括内存访问硬件,其响应于所述页表指示所述内存位置被标记为可缓存的但不可推测地访问的,允许缓存所述内存位置的内容,但不允许任何所述推测地执行的指令访问所述内容。

说明书全文

可缓存的但不可通过推测指令访问的内存类型

[0001] 相关申请的交叉引用
[0002] 要求2017年6月28日递交的、62/526,236号美国临时申请(律师诉讼代理号NVID-P-BV-17-0129-US0)的优先权的权益,其通过引用合并于此。
[0003] 关于联邦政府赞助的研究或发展的声明
[0004] 无

技术领域

[0005] 本文的技术涉及计算机安全,并且更具体地涉及具有改进的安全性的CPU设计。更具体地,本文的示例非限制性技术涉及支持推测性的、不可访问的内存类型的处理器,这种内存类型可以缓存,但不能被推测指令或推测执行访问。

背景技术

[0006] 现代的高性能CPU利用推测执行路径来提高指令吞吐量。推测执行的一种形式是分支推测。分支推测使处理器能够在获知真实的分支路径之前开始执行指令。当遭遇分支代码,例如“if x,do foo;else do bar”时,CPU试图预测x将是什么,并在获知x之前开始执行foo或bar。如果CPU预测正确,执行随着额外的性能优势继续。如果CPU预测错误,则丢弃推测执行的结果。
[0007] 类似地,一些CPU从事于数值推测以使用预测的值生成预测得到的或计算得到的值。
[0008] CPU加载(load)也可以推测地执行。例如,如果foo被推测地执行,并且foo需要加载,则将随着foo分支的推测执行一同执行加载。然而,这种推测性的加载可能导致安全隐患。
[0009] 恶意代码可能会试图开发CPU推测加载以获得对内存中位置的访问,其否则可能会在架构上不允许。例如,代码可以有条件地从不允许的内存位置请求加载。推测加载将引起CPU在确定内存是否允许之前就从这个不允许的内存位置加载数据。在一般情况下,这个推测的加载(和不允许的内存访问)将不可被底层代码访问,因为当检测到不允许的内存访问时,推测的加载将被返转并被使之不可访问。但不幸的是,这可能不是故事的结局。
[0010] 恶意代码可能是非常狡猾的。即使在检测到不允许的内存访问时,推测的加载将被返转并被使之不可访问,对于攻击者来说,也可能通过增加依赖于第一推测加载的值的第二推测加载来确定来自不允许的内存位置的推测加载的值。例如,如果第一推测加载的值是0则代码块可以从内存位置A请求加载,如果第一推测加载的值是1则代码块可以向内存位置B请求加载。甚至是在不允许的内存访问被检测到和返转之后,仍然可能确定内存位置A或B中的哪一个被加载,因为它们将保持在处理器的L1缓存中。因此,基于响应的定时,任何对于内存位置A或B的随后的请求将暴露那些内存位置是否存在于L1缓存中。如果暴露的是内存位置A存在于L1缓存中,则不允许的内存位置上的值必须已经是0。如果内存位置B存在于L1缓存中,则不允许的内存位置上的值必须已经是1。以这种方式,可能确定(推断)存储在任意的内存位置上的值,即使在访问是架构上地不允许的时。
[0011] 对于关于这些攻击的更多的信息以及它们是如何开发使用缓存内存和推测执行的现代计算机处理器的,参照例如下面的技术文献,其通过引用合并于此,犹如明确地阐述:
[0012] Lipp等人,“灾难(Meltdown)”arXiv:180l.01207[cs.CR](2018),发布于https://meltdownattack.com/
[0013] Kocher等人,“幽灵攻击:利用推测执行(Spectre Attacks:Exploiting Speculative Execution)”arXiv:180l.01203[cs.CR](2018),发布于https://meltdownattack.com/
[0014] Yarom等人,“冲洗+重载:高分辨率、低噪声的L3缓存旁路攻击(Flush+Reload:a High Resolution,Low Noise L3Cache Side-Channel Attack),”USENIX安全座谈会(2014)。
[0015] 在这些上下文中,术语“旁路(side channel)”是惯用术语,用于描述能够获得关于在处理器的架构规范之外的处理器的信息的方法。存在着很多种旁路,包括性能计数器。其它例子包括处理器根据执行不同的指令制造不同的声音。旁路空间因此包括在如处理器的架构师所定义的处理器的逻辑架构规范和处理器的设计师所指定的处理器的实际实现之间的许多不同。就像窃贼通过建筑师从未设计过的爬行空间闯入建筑物一样,攻击者出于邪恶的目的,以处理器架构师和设计师从未考虑或预见到的方式,开发处理器旁路的多个方面,已经变得很常见。
[0016] 例如,现代的处理器通常具有性能度量计数器,其追踪特定内存负载执行需要多长时间。如上所述,如果攻击者可以获悉到数据加载需要多长时间,他有时可以使用这一信息来获悉数据的内容。通过确定缓存内存中是否存在未命中以使攻击者直接插入(intuit)数据自身的内容也是可能的。这类攻击可以例如利用共享的、包容的最后一级缓存。攻击者可以频繁地冲击作为攻击目标的内存位置。通过测量重载数据所需的时间,攻击者可以确定数据是否在此期间被另外的进程加载到缓存中。这被称为“缓存攻击”的一种类型。
[0017] 更详细地,图1示出了一种示例简化场景,其中内存10存储了秘密12。图1示出了攻击者控制的推测执行(即,如果秘密值为0,则访问一个内存位置,而如果秘密值是1,则访问另一个不同的内存位置)。图1因此进一步示出了如果推测执行是0,则第一缓存线14被写入到缓存内存18,而如果推测执行是1,则第二缓存线16被写入到缓存内存。接着攻击者可以使用旁路来检测哪个缓存线(第一缓存线14或第二缓存线16)存在。根据这一检测的结果,攻击者可以推断出秘密12是0还是1。旁路攻击因此使攻击者能够检测到哪个缓存线存在,而无需实际上读取任一缓存线(读取任一缓存线将生成异议,因为内存访问将是享有特权的),并获悉秘密的值,而无需实际上从(处理器架构通常成功地禁止)的内存读取秘密值。
[0018] 作为处理器的硬件推测的结果的意外的数据观察的一般问题是非常难以解决的。正确地推测处理器正要访问哪个数据是一项非常大的性能来源,具有在不考虑定时攻击的情况下开发的各种各样的方法。试图枚举由于秘密数据而导致硬件推测并执行某些可观察到的计时效果的所有情况是一个棘手的问题。试图消除所有可能的旁路也是棘手的。
[0019] 之前尝试的解决方案已经使用了显式的软件屏障,例如ARM的ISB/DSB和x86的LFENCE。不幸的是,这遇到了三个问题,即它们在性能上很昂贵,软件通常不知道将它们放在哪里,而且它们的使用往往是特定于架构的,当实现以不同的方式实现与推测有关的障碍时,会使人头痛。
[0020] 通常还会使用物理地址、虚拟地址、ASID(地址空间标识符)、VMID(虚拟机ID)、异常级别(EL)或特权级别以某种方式散列的组合来形成最终的分支推测器索引和标记。这样的散列不能避免不匹配的ASID、VMID、EL之间的由于散列函数中的混叠造成的串音,充分了解的攻击者可以利用它们。注意,一些类型的虚拟地址混叠可能包含这种类型的串扰的退化情况,因此,如上所述的攻击不可能包含在具有虚拟索引/标记分支推测器的实现中。要求所有位都用作分支推测器标记的部分是模片区繁重的,因为它为每个分支推测器结构中的每个条目添加了额外的标记存储位。
[0021] 为了保护当前的实现,可以使用ARMv8架构Device-nGnRnE或Intel UC内存来存储程序员希望从这些类型的攻击中隐藏的秘密。特别是,存储在Device-nGnRnE内存(nGnRnE=非聚集、非重排序、不易写入确认)中的秘密数据很可能完全不受现有处理器上这种基本攻击的所有变体的影响。推测入或推测性地移除对于这些Device-nGnRnE内存的访问是违法的,因此其将很难建立以上述方式泄漏Device-nGnRnE数据的兼容的实现。附图说明
[0022] 下面将结合附图,读取示例性非限制说明性的实施例的详细描述,附图中:
[0023] 图1示出了基于推测执行的示例性非限制性的旁路攻击;
[0024] 图2示出了根据一些实施例的示例性系统块图;
[0025] 图3示出了根据一些实施例的示例性流程图
[0026] 图4示出了根据一些实施例的示例性指令执行流;以及
[0027] 图5示出了根据一些实施例的示例性内存类型认定。
[0028] 较佳实施例的详细描述
[0029] 示例非限制性的实现提供了一种改进的体系方法,通过定义一种既可缓存,又不能通过推测访问的新的内存类型来解决这种性质的攻击。示例非限制性的实施例提供避免某些敏感数据通过推测执行而被暴露的机制。例如,非限制性的实施例允许对必须以性能为代价被保护的数据被专标记。在特定的系统中,如果告诉处理器内存中存储秘密的位置,并且禁止推测那些内存位置,那么处理器将确保试图访问这些内存位置的进程在读取和缓存这些位置之前有权访问这些位置。
[0030] 作为一种架构改进,示例非限制实施例提供了一种内存类型,其既可缓存,又可被推测指令访问,其将有助于以不受此类攻击的方式存储敏感数据。而使用这种内存类型的性能损失仍然是相当高的(但不是高达使用设备内存或相对于如果数据不被允许存储在缓存中),它会给程序员保护敏感数据的选择,以一种推测将不会将其暴露给意外攻击的新的形式。
[0031] 将许可检查从执行管线分离可以有明显的性能优势。举个例子,几乎所有形式的数值推测都会以某种方式执行这种分离。数值推测器的结果通常可以在所需的权限检查结果之前被解析,假设权限检查将返回允许访问,那么让处理器继续处理推测值是有益的。从性能的度来看,有意地排除对所有内存操作的这种优化是沉重的负担。
[0032] 这样的实现可以在不需要对当前处理器设计进行重大修改的情况下提供。许多处理器中已经有了可缓存内存类型和不可缓存内存类型的概念。在这种安排中,处理器可以被允许推测不可缓存的内存类型,但不允许将此类内存的内容存储在缓存内存中(处理器需要使用一些其他机制保持跟踪推测执行)。因此,一种潜在的内存类型是不可缓存的:它不能被存储在缓存内存中,而是必须在核心102每次想访问它时从内存104中检索。例如,实时输入数据(例如来自摄像机的数据)通常不可缓存,而是需要每次都直接被读取,因为它的变化非常快。
[0033] 一些处理器也有规定某些内存既不能被推测也不能被缓存的机制。因此,大多数现代处理器已经具有处理既不能被缓存也不能被推测地访问的指令的机制。例如,存储在外部设备中的FIFO缓冲区中的位置通常不应该被冗余或强制地读取。因此,许多现代处理器中已经存在这样的机制:其将拒绝推测地执行某些类型的指令,但也不缓存那些相同的指令。
[0034] 本文中的示例非限制实施例指定可以被缓存但不能被推测的内存类型。虽然可以存在其他类型的缓存攻击,其在某些情况下可能会由于特权访问而泄漏存储在缓存中的值,但是非限制性的实施例不受利用推测执行的灾难(Meltdown)和幽灵(Spectre)等攻击的影响。非限制实施例提供了进一步的优势,其即使无法被推测的特定内存类型也可以被缓存,从而受益于缓存可能提供的更低的内存访问延迟。
[0035] 示例非限制性处理器架构
[0036] 图2示出了用于处理器100的示例非限制架构。在所示的示例中,处理器100有多个核心,如核心102(0)、核心102(1)等等。当运行在其中一个核心102上的软件需要存储在DRAM内存104中的数据时,它启动(来自内存的)“负载”命令。
[0037] 缓存内存
[0038] 核心102使用了一种内存架构,包括所谓的“缓存内存”,以加快来自内存的加载速度。正如本领域技术人员所理解的那样,传统的“缓存内存”已经在高速计算机架构中使用了多年。缓存内存背后的基本思想是将一个小的低延迟内存放在高速处理器附近,通常在相同的片上。核心102通过缓存内存系统向主系统内存104发出数据请求。缓存内存系统从主存中检索请求的数据,并将检索到的数据存储在核心可以快速访问的小的本地内存中。
[0039] 典型的缓存内侧系统检索、存储和维护执行进程需要运行的数据。检索到典型的缓存内存是由从主内存104调用该数据的进程发起的。但是,缓存内存系统并不是简单地将检索到的数据返回给进程,还在使用数据的进程附近的本地缓存内存中维护数据的副本。如果进程再一次需要同样的数据(其通常可能由于被称为“局部执行”的现象),缓存内存系统可以快速提供该数据,而无需不得不再次从主内存104检索该数据。当执行进程不再需要数据时(例如,因为它已经前进到进程的另一部分),可以从缓存内存系统中删除数据,以为进程现在需要的其他数据腾出空间。
[0040] 家庭厨师将熟悉缓存的概念,因为典型的家庭箱构成了一种食物缓存。在你当地的食品超市的冷藏区有很多不同的成分,但是每次你需要任何冷藏材料的时候都要去商店是非常耗时的。相反,家庭厨师偶尔会从超市带回未来几天可能需要的特定食材,并把它们储存在家庭冰箱里。家用冰箱离槽和炉子只有几步之遥,所以它所含的食材很容易让厨师快速获取。厨师需要定期补充家庭冰箱的内容。并且厨师有时可能需要跑到商店去拿家里冰箱里没有的特殊食材。
[0041] 缓存内存的典型优势是减少了延迟—从内存检索数据所需的时间。进程从本地缓存中获取数据通常要比从系统内存中检索数据快得多。由于许多进程倾向于反复重用相同的数据(“引用的局部性”),因此维护本地临时数据副本非常有效,与从共享的主系统内存中检索数据相比,进程可以更快地访问该数据副本。
[0042] 图2中所示的特定的非限制示例有三个级别的缓存内存:
[0043] ·1级(L1)
[0044] ·2级(L2)
[0045] ·3级(L3)。
[0046] 这个例子中的L3缓存内存106是最接近内存104的缓存内存级别,在这种情况下是由核心102共享的。每个核心102可以使用自己的L2缓存内存108来访问L3缓存106。在所示的例子中,每个核心102也有自己专用的L1缓存,这个L1缓存被分成L1数据缓存110和L1代码缓存L12。
[0047] 如果核心102要查找的数据驻留在L2缓存108中,那么L2缓存将数据交付给L1缓存110,以便核心102访问。如果请求的数据不是驻留在L2缓存108中,L2缓存将从L3缓存106请求它。如果所需的数据存在于L3缓存106中,L3缓存将其传递给L2缓存108,L2缓存108将其传递给L1缓存110,然后将其传递给核心102。如果L3缓存106中不存在所需的数据,则从内存104请求数据。
[0048] 从图2图表的顶部到底部的每个渐进内存级别都与越来越长的延迟相关。从L1缓存110、112中检索数据是非常快的。从L2缓存108检索数据需要长一点的时间。从L3缓存106检索数据需要更长的时间。从内存104检索数据通常需要更更长的时间(例如,从内存104检索数据花的时间要比从L1缓存110检索数据长40倍或更多)。
[0049] 虚拟内存系统
[0050] 运行在核心102上的代码通常使用“虚拟内存”访问以从内存开始加载。众所周知,虚拟内存用于隔离运行在核心02上的应用程序,使其不必处理存储在物理内存104中的数据和代码的物理地址。虚拟内存将物理内存划分为块,并允许将这些块分配给运行在核心102上的不同进程。操作系统为物理内存中的每个块分配一个虚拟内存地址。虚拟寻址将分配的虚拟内存地址转换为内存中某处(各处)的实际/物理存储位置。
[0051] 虚拟内存提供了很大的灵活性。例如,从应用程序的角度来看,应用程序正在访问的内存位置可能是连续存储的(全部在一起),而实际上,相应的物理内存位置广泛分布在物理内存104的物理地址空间中。虚拟寻址还允许不同的进程(例如)拥有各自私有虚拟地址空间的相同视图,同时以安全的方式共享公共物理地址空间。例如,内核内存地址空间通常被映射到运行在核心102上的几个进程中的每个进程的虚拟地址空间是很常见的。
[0052] 操作系统维护页表114以将虚拟地址映射到物理地址。图2示出了页表114怎样被放置在处理器和内存管理单元(MMU)的架构中的简化的概念图。页表114提供了由虚拟内存系统维护的数据结构,用于存储由应用程序使用的虚拟地址与由物理内存104使用的物理地址之间的映射。虚拟地址由访问进程(例如,来自运行在核心102上的软件的内存加载请求)使用,而物理地址由物理(硬件)内存104使用。在所示的例子中,页表114存储了在由核心102使用的虚拟内存地址和内存104的物理内存地址之间转换的页面。众所周知,可以通过使用存储最近的虚拟内存到物理内存的转换的翻译后备缓冲区(TLB)内存缓存来减少对页表114条目的访问延迟。
[0053] 通常,Ll缓存110使用其虚拟地址存储从内存104中检索到的数据和代码。一种类型的示例L1缓存110、112是所谓的“VIPT”或虚拟索引的、物理标记的缓存。如果核心102请求的数据尚未驻留在Ll缓存110、112(即,因为之前核心检索过相同的数据),所以页表114用于将核心102请求的负载的虚拟地址转换为由内存104使用的物理地址。注意,即使Ll数据缓存和L1代码缓存的110、112是实际上标记的,访问仍然必须使用来自页表114的信息而翻译的物理地址来被验证。加载请求获取由硬件(内存管理单元)翻译的它们的虚拟地址,其访问内存中的页表来执行虚拟->物理地址转换。L2缓存108和L3缓存106都是物理上(而不是虚拟上)索引的、物理标记的缓存,并且因此使用与内存104使用的相同的物理地址。
[0054] 内存保护和特权内存访问
[0055] 处理器100的内存管理系统被设计为使得运行在核心102上的应用程序不能访问内存104中的每个内存位置。例如,通过为每个软件进程提供它自己的页表,可能将它的进程的虚拟地址映射到惟一的物理地址。这将阻止程序访问彼此的数据。
[0056] 通常,物理地址空间的一部分也专门预留给操作系统内核。在大多数现代处理器中,都实现了允许运行在核心102上的特权软件访问内存104中的数据和指令,而较少特权的软件则被拒绝这种访问的特权访问方案。例如,核心102上执行的操作系统的内核通常能够访问存储在内存104中的任何数据或代码。另一方面,运行在核心102上的一般用户应用程序被拒绝访问被指定为特权访问区域的内存104的某些区域。特权访问方案通常通过在页表114中提供访问权限来实现。当运行在核心102上的软件从内存104请求负载时,内存管理单元使用页表114指定的访问权限来确定请求软件是否具有访问内存位置的适当特权级别和权限。如果请求软件被允许访问该内存位置,则系统100将从内存104中的关联内存位置检索请求的信息,并将其返回到运行在核心102上的请求软件。另一方面,如果核心上102运行的请求软件是不允许访问内存位置的,则内存管理单元将基于页表114指定的访问权限检测它,并拒绝访问那个特定的内存位置,引起错误。例如,这样的内存访问方案可以防止用户应用程序覆盖敏感的操作系统代码和数据,并且还可以保护存储在内存104中的敏感数据的秘密性和安全性。
[0057] 因此在一个例子中的核心102有了特权软件的概念。在一种安排中,用户特权是最低的特权级别,内核特权是下一个最高的特权级别。很容易看出这对于写访问是如何工作的:只有更高的特权级别才允许对指定在更高特权级别的内存位置进行写操作。因此,具有用户特权的运行在核心102上的进程将被禁止写入指定为需要内核特权的内存位置。
[0058] 读访问工作稍有不同:如果具有用户特权的运行在核心102上的进程试图读取指定为需要内核特权的内存位置,则操作系统(内核)禁止内存负载向用户进程返回值,而是生成错误。这就是核心102在架构上被设计为如何工作的,但事实证明核心102的实现并不完全是这样工作的。
[0059] 推测执行
[0060] 处理器设计人员已经下了很大的功夫使处理器操作的各个方面尽可能快地工作。图2所示的架构减少了内存访问延迟。另一种称为“推测执行”的独立技术提高了核心102执行软件的有效速度。
[0061] 理解推测执行的一种方法是通过下面的类比。假设您是一名汽车技师,被要求检查客户的汽车。你把车放到电梯上,仔细检查车子,确定前刹车片已经磨损,并且需要更换。你告诉办公室打电话给客户,估算一下成本,并征得客户同意更换刹车。根据您的经验,客户可能会授权进行这种特殊的修复,所以您决定要把车停在升降机上,订购更换刹车片,取下前轮,并用压缩空气清洗零件。如果客户拒绝这项工作,您将需要重新安装轮胎,并将替换的刹车片复位。但是,如果客户批准了这项工作,那么您已经在修复方面取得了进展,并且能够更有效地完成它。
[0062] 推测执行的工作原理与此类似。图3显示了一个示例代码片段,包括指令k、k+1、k+2;分支指令;用于分支的一条路径的指令m、m+1;用于分支的另一条路径上的指令的指令p、p+1。指令k、k+1、k+2是所谓的内联指令,其由核心102按顺序执行。假设在执行这些内联指令之后,核心遇到分支指令152,其根据测试结果有条件地执行指令m、m+1或指令p、p+1。例如,如果测试结果为真,核心102将执行指令m、m+1,…。反之如果测试结果为假,则执行指令p,p+1,…。现在假设分支152需要测试的值不是立即可用的。也许需要从内存104中检索它。
可选地,它也可以是需要用户输入的用户值。或者它可能是一个需要大量的时间来计算的计算结果,使用例如数学协同处理器。不论为了什么原因,核心102不能立即评估分支测试
152的结果,而是必须等到这些结果可用为止。
[0063] 核心102并非尖叫到停止并等待分支152决策的结果,而是开始沿着两条可能的路径之一执行。这种执行称为推测性的,因为无法预先知道哪条路径是正确的。因此,核心102不只是等待,而是执行指令m、m+1、m+2,依此类推—通常基于指示进程最可能采用哪条路径的统计数据和过去的历史记录。核心102因此在一条可能被证明是错误的路径上取得了进展,其结果可能不得不被抛弃。一旦知道分支152任务的结果,核心102要么继续执行它开始推测执行的路径,要么放弃这些结果并开始执行有效的路径。
[0064] 推测执行的一个有趣的方面是,它是由处理器的推测执行硬件执行的,而不是由应用程序本身执行的。因此,推测执行可以受益于处理器的推测执行硬件,其可以访问任何内存位置,而不考虑特权级别。这并不总是正确的(这取决于实现方式,而不这样做的实现方式仍然存在问题)。也许更重要的是,这种推测并不在软件的控制之下,并且能够产生软件无法预期的结果。例如,如果(foo<1){加载阵列load array[foo]};软件将预期永远不会越界加载;但在推测的道路上,它可能会走向任何地方。这就导致了问题,因为特权软件(拥有访问秘密的权限)可以在不知情的情况下访问自己的秘密,并通过在依赖于秘密的值的推测路径上创建缓存线而将其泄漏给其他人,即使权限一直在被检查。事实上,这个方法(以及任何其他基于推测路径上的秘密创建缓存线/内存访问的方法)仍然能够泄漏这个秘密,这使得问题变得如此隐蔽。
[0065] 因此,在不同的情境下,推测执行请求的值将从内存中检索并存储在Ll缓存110和112中,而不考虑应用程序的特权级别。随后,当分支测试152结果已知时,页表114指定的访问权限确定应用程序是否允许检索指令和数据(其已经作为推测执行的结果存储在L1缓存
110、112中)。如果应用程序确实具有访问权限,则执行继续。另一方面,如果应用程序被拒绝访问现在存储在L1缓存110、112中的特权数据或指令,处理器将生成异常,并且检索到的信息的安全性受到保护,因为它从未离开L1缓存。至少处理器架构师是这样设计处理器的。
这个假设充分基于处理器的架构,但是它没有考虑处理器实际实现的特定方式的微架构特征。就像带有无记录爬虫空间的优雅建筑一样,攻击者也有可能使用微架构状态通过旁路攻击来泄漏缓存内存中的信息。
[0066] 更详细地说,核心102通常有多个可以并行执行的专用管线化的执行单元。有了多个专用的执行单元,许多执行操作可以一次执行。此外,由于执行单元中的依赖关系和瓶颈,操作不需要按照它们最初被呈现的顺序执行。当一个操作完成执行时,结果被添加到缓冲区中,从而解决与其他操作的依赖关系。不需要的推测执行的结果可以从缓冲区中刷新,并且永远不会存储在寄存器中。如果指令执行由于未经授权的特权内存访问而产生中断或故障,则尤其如此。然而,第二指令也可以推测地执行,并以一种可以检测到的方式更改核心102的微架构状态也是可能的。
[0067] 基于推测执行的缓存攻击能够绕过特权内存保护
[0068] 在一种攻击中,运行在核心102上的攻击进程安排核心从内存104读取攻击进程本身没有读取权限的数据。但是攻击者希望核心102能够在核心102生成特权异常之前推测地读取特权数据。正如上面所讨论的,核心102最终将拒绝将特权数据返回给攻击进程,而是生成异常。然而,攻击进程同时会导致核心102执行第二次推测访问,并且根据第二次访问的位置,推断出核心102在第一次推测访问中从内存中推测读取的数据必须是什么。核心102因此阻止攻击进程直接访问特权数据,但攻击者可以使用旁路泄漏从缓存中导出数据一定是什么。如果攻击者能够导出数据一定是什么,其几乎等同于读取数据。这种攻击似乎是间接和复杂的,但实际上是有效和强大的。可以使用这些缓存攻击从特权内存中泄露各种各样的高度敏感数据,包括例如安全密钥、密码等。
[0069] 许多或大多数现代处理器推测访问数据以获得更高的性能。从根本上说,要控制所有形式的推测,以确保它们都没有插入任何东西到缓存内存中从而使其可见,这是一个艰巨的挑战。
[0070] 本非限制实施例采用一种不同的方法将内存标记为非推测但可缓存[0071] 一个非限制实现标记了核心102不允许推测的内存类型。图4示出了存储在系统100中的示例指令流70。退役指令72已被执行。最老的非退役指令74是核心102正在执行的指令。指令流70中的后续指令可能是核心102可以推测地执行的指令。这些后续指令可以被执行,也可以不被执行(例如,由于分支指令,例如“if”),因此可能会也可能不会成为退役指令。
[0072] 现在假设指令流70包括访问秘密的加载指令76。如果加载指令76既可缓存又可推测,通常会发生什么:一旦核心102确定有可能指令流(包括加载指令)的一部分将被执行,则核心102将推测地发起从内存的加载,访问秘密并将其存储在缓存中。一旦秘密存储在缓存中,则核心102可能会推测地执行进一步的指令78,其将对秘密执行诸如数学等操作。随后的加载80可以推测地执行以影响缓存内存中的两个不同的缓存线,正如上面所讨论的,取决于这个秘密是0还是1。这一操作很容易受到旁路攻击,例如Meltdown或者Spectre。在这一上下文中,可执行内存通常是指可以包含推测指令的内存,而威胁是存储在其他某处的指令是否可以访问内存中的特定秘密位置。
[0073] 相反,在示例非限制实施例中,加载指令76将不会被推测地执行。相反,当核心102的推测执行单元准备推测地执行加载指令76时,它决定不能执行该操作,因为秘密的加载是不可推测的。因此,它不会执行加载。因此,数学操作78也不会被推测地执行,也不会测试且不会写入80到不同的缓存线。相反,核心102等待,因为它不被允许推测地执行这些指令,因为这个负载已经被标记为不适合推测地执行。
[0074] 核心102可以开始推测地执行其他指令,不需要或取决于加载指令76的结果,而不只是等待。实际上,尝试的内存访问由于各种原因而失败并不罕见,并且核心102包括传统的机制,可以在不崩溃或中断正常操作的情况下优雅地处理此类内存访问失败。例如,在正常情况下,核心102可以试图执行从内存104加载(例如,由于缓存缺失或因为内存是共享的,并且其自身暂时不可用),核心可能需要等待值在缓存中变得可用。传统的核心102已经具有了可用于处理此类不可用场景的机制。核心102具有了新的状态:“我只是等待成为不可推测的。”核心102是继续并执行其他独立的负载,还是继续等待成为不可推测的,这取决于处理器。
[0075] 同时,最老的非退役指令74在指令流中向上移动。如果分支(或其他)指令将执行指向加载指令76之外,则该指令将永远不会被执行,并且该秘密也永远不会被缓存。然而,一旦加载指令76成为当前最老的非退役指令,核心102就会尝试以非推测性的方式执行加载指令。在传统情况下,核心102将检查以确保应用程序的特权级别是足以访问加载指令所编址的内存位置的。如果特权级别不够,那么核心102将不访问内存位置,而是生成异常。如果特权级别足够,核心102将执行加载指令76,这将(照常)导致秘密被缓存到缓存内存中,并提供给核心102以执行(假设由于之前非推测执行的负载,秘密还没有驻留在缓存中)。加载不能预先推测地执行的这一事实将导致一些额外的延迟,但这是一项值得的权衡,以确保秘密不会通过旁路从缓存中泄露。秘密最终缓存在缓存内存中的这一事实没有问题,因为缓存是作为非推测性地执行指令的结果发生的,其被授权访问秘密。在许多非限制实现中,处理器能够比这更具有侵略性。例如,由于推测性地执行指令,处理器可以缓存内存位置,但是直到原始负载被非推测性地执行,才允许缓存的数据变得可用,用于之后的推测性地执行指令。把秘密藏在缓存中是可以的,但是在依赖的数学中使用秘密是不可以的,而且绝对不能使用秘密创建依赖于秘密值的缓存线。如果流中进一步的指令没有尝试访问存储在缓存中的秘密的授权,它们不会被推测执行(因为这个秘密被标记为不受推测执行)并且事实上,永远不会被执行,因为他们没有访问秘密的授权。
[0076] 支持新内存类型的内存架构
[0077] 图5示出了如何设置示例不可推测但仍然可缓存的内存类型的示例非限制框图。图5示出了在页表114中包括页表项(page table entry,PTE)114(x)的典型页表层级。PTE 
114将包括内存类型字段,其被编码为指示核心102的推测执行单元:没有推测执行,但其不会阻止内存管理系统缓存缓存内存中的值。这允许虚拟寻址方案将特定的内存位置或内存位置块标记为非推测性的但可缓存的。其他安排可以将物理地址本身标记为这种特定的内存类型。因此,虚拟地址、物理地址或两者都能够被这样表示、识别、标记或以其他方式指定。一种方式可以这样标记单个内存位置、一系列内存位置、内存位置块、页面或者内存位置的其他细分、单个内存地址、一系列内存地址、内存地址块、页面或内存地址的其他细分,或甚至物理或虚拟内存设备或其部分。这些标记可以是硬编码的、由硬件和/或软件(如寄存器内容)定义的、和/或可编程的。
[0078] 另一个可选的实施例是一种特殊的指令格式,其表示指令访问的内存位置是能够被缓存的,但不能通过指令的推测执行被访问。例如,在内存加载操作码或指令格式的其他地方的附加位值可以指示“非推测性”,但不限制缓存结果。如果使用这种机制,则可能需要进一步限制,即只能使用该非推测性指令类型访问存储在内存中的秘密。
[0079] 受示例非限制实施例保护的数据可以是任何类型的敏感信息,如私钥、密码、行帐户信息、照片或其他图像、或任何其他信息。系统100可以为用户设备、共享设备、网络路由器、嵌入式处理器、自主车辆计算机、人工智能神经网络或任何其他类型的计算设备提供处理。
[0080] 尽管本发明已经关于目前被认为是最实用和首选的实施例进行了描述,可以理解的是本发明不限于所披露的实施例,而与此相反,意图覆盖在所附权利要求的精神和范围内所包括的各种修改和等同安排。
相关专利内容
标题 发布/更新时间 阅读量
账户访问 2020-05-11 207
域访问系统 2020-05-13 881
访问控制 2020-05-12 170
多字线访问和访问器 2020-05-12 217
访问控制 2020-05-11 1054
装置访问 2020-05-11 78
有条件访问 2020-05-13 797
访问口 2020-05-11 294
访问口 2020-05-11 271
数据访问系统 2020-05-13 73
高效检索全球专利

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

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

申请试用

分析报告

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

申请试用

QQ群二维码
意见反馈