本发明属于处理器芯片微体系结构设计领域,涉及一种依据指令流信息,动态地识别一条指令是否可能泄漏隐私数据的方法。
背景技术:
长期以来,现在商业高性能处理器的设计往往关注于性能,而忽略了安全细节。2018年以来,“幽灵”漏洞以及“熔断”漏洞等相关变种的出现,揭示了基本的性能优化措施中存在着严重的安全问题。
为提升处理器的安全性,可以在体系结构与微体系结构两个层次进行防御。在体系结构层面,可以对不同的程序进行隔离,保证攻击者无法访问到受害者的程序或共用相同的硬件资源。这不仅会提升调度机制的复杂度,也会导致硬件资源使用率降低。在微体系结构层面,可以通过在各功能单元中引入不同程序或特权级的标记,或者通过对各硬件资源进行隔离或者备份。但这两种方法都会引入较大的硬件开销,甚至会影响时序,降低最大工作频率。
实际上,“幽灵”漏洞以及“熔断”漏洞等相关变种的攻击具备共同点:存在一条触发推测执行的指令以及通过在错误推测执行中对微体系结构状态造成改变。在错误推测执行路径上对微体系结构的改变在处理错误推测过程中并不会被恢复,从而使得攻击者有机会在微体系结构中的痕迹中推出敏感信息。例如,对于“幽灵”漏洞变种1,触发推测执行的指令为分支指令,在错误推测执行路径上的访存操作会影响缓存内容,攻击者利用缓存侧信道可以获得敏感信息。类似地,结合其他类型的变种,可以通过为触发推测执行的指令与后续的可能触发敏感信息泄露的操作之间建立安全依赖关系。
技术实现要素:
为了避免安全机制在体系结构层面引入的复杂度,克服在微体系结构较大的面积开销,放松对硬件时序的约束,本发明依据安全依赖的定义,提出一种处理器芯片安全依赖的动态识别及维护方法,在微体系结构中动态地识别、标记和记录安全依赖关系。本方法在程序执行过程中,动态地检测触发指令与可能存在信息泄露的超前推测执行指令之间的依赖关系。本方法对于软件透明,无需编译器、操作系统的更新,也无需程序员插入代码。这一依赖关系逻辑简单,实现复杂度低,还可以扩展到其他攻击的防御,进一步提升处理器的安全性。
本发明采用的技术方案如下:
一种处理器芯片安全依赖的动态识别及维护方法,包括以下步骤:
1)在保持程序执行序的阶段,动态地识别存在安全依赖关系的指令。
安全依赖关系是指在程序执行序中,当前一条指令尚未被解析,即还未确定该指令是否会由于发生错误而重新执行时,后续指令被超前执行,但超前执行的指令对微体系结构的改变可能被其他攻击程序感知到,进而产生信息泄露,即称这两条指令之间存在安全依赖关系。例如在分支指令还未确定跳转方向前,后续的访存指令若被超前执行,可能产生缓存侧信道泄露;又如未完成权限检查的读操作获得的数据,被后续的访存操作使用时,也可能产生缓存侧信道泄露。在这两种情况中,后续的访存指令与前面的分支指令或未完成权限检查的读操作存在安全依赖关系,本方法所指的安全依赖关系当然不仅仅限于这两种情况。
以上述两种情况为例,可以在发射阶段检测在未被解析的分支指令后的访存指令,即为该访存指令添加可疑推测标识;或者在访存单元中,当发现传递未完成权限检查的数据时,对获得传递的数据的访存操作也添加安全依赖标记,本方法当然不仅仅限于这两种情况。
2)存储安全依赖关系,可以通过掩码向量表或者方形矩阵等方式来存储安全依赖关系。
3)对存在安全依赖的指令及时地添加安全依赖标识,供指令实际执行时检查,并进行针对性的防御。安全依赖标识除伴随指令引入单独的安全依赖存储模块,维护每条指令最新的安全依赖关系,保证安全依赖关系的信息具有实时性。
安全依赖标识信息将随着指令一起或通过单独的表来维护安全依赖关系,供后续流水线对安全依赖标识进行检查。当发现存在安全依赖关系时,执行针对性的防御措施,防止发生信息泄露。然后初始化相关指令的依赖关系,在后续流水线处理过程中,当被依赖的指令完成解析,需及时地广播,以解除后续指令的安全依赖关系,允许相关指令正常执行。
与现有处理器结构相比,本发明的有益效果是:通过为触发推测执行机制的指令与后续可能引发信息泄露的指令建立安全依赖关系,处理器可以在后端准确地识别存在安全隐患的指令,及时地做出防御措施,防止信息泄露,增强了处理器的安全性。
附图说明
图1为以在三级发射阶段采用矩阵方式进行安全依赖关系判断的示意图。
具体实施方式
在主流的商业高性能处理器中,为保证程序执行的正确性,流水线中都存在顺序执行的阶段。为解决数据依赖与控制依赖,处理器中有多种记录、统计依赖关系的方式。通常情况下,在发射阶段、访存阶段以及提交阶段,都会保持原程序的序。这几个阶段都在译码阶段后,各指令类型都已知晓。
基于这些前提,本发明提出了一种处理器芯片安全依赖的动态识别及维护方法,所采用的技术方案主要包含以下内容:
一)安全依赖识别
在处理器流水线译码阶段之后,能获悉指令相关信息,且仍保持程序执行序的阶段,依据安全依赖关系,识别分析可能触发推测执行的指令,在这些指令之后,相关的访存指令以及计算操作都有可能存在着安全问题。因此,可以在保持程序执行序的阶段判断指令类型,依据指令队列中的序,确定当前指令前是否存在可能触发推测执行的指令,继而判断当前指令是否安全依赖于之前的指令。例如,在发射阶段检测一条访存指令依赖于之前未被解析的分支指令;在访存请求处理阶段检测一条被传递的访存指令依赖于之前未完成权限检查的访存操作。本方法包括但不限于这两种场景。在判断出存在安全依赖关系后,需要为每条指令附加安全依赖标识信息,该信息或者同指令信息一起,或者通过单独的表记录以供给后续的执行单元直接查询。安全依赖标识信息通常情况下采用1位信息即可标识是否存在安全依赖,但为了更细粒度的区分不同安全依赖,还可以采用多位信息标识多种安全依赖关系。
本发明目的是识别安全依赖关系,但不受限于存在安全依赖关系的指令,还包括存在安全依赖关系的访存操作;并且识别阶段处于可以保证程序执行序的阶段即可,可以在一个阶段或不同阶段,不局限于某固定阶段。
二)安全依赖存储
类似于控制依赖和数据依赖的维护,可以通过掩码向量表或者方形矩阵等方式来存储安全依赖关系。例如:1)可以为每条指令增加掩码向量,向量的位宽与处理器允许同时处理的最大指令数相关。例如,该向量位宽可以与rob中的指令数相当,每一位表示当前指令是否与该位的索引对应指令之间是否存在依赖关系。2)依据发射队列的信息进行安全依赖关系的判定时,方形矩阵的宽度与发射队列的深度相同,每一个元素代表当前位置的横坐标指令与纵坐标指令之间是否存在安全依赖关系。为了更细粒度的区分不同安全依赖,每个元素可以采用多位信息表示多种安全依赖关系。安全依赖的标识可以在派发新的指令进入发射队列时,判断该指令与之前所有有效指令之间是否存在安全依赖关系,若存在依赖关系,则将掩码向量表或者方形矩阵中对应的元素设置为有效。本方法中不限于这两种实现方式,也可以通过采用混合的方法降低硬件开销。
三)安全依赖信息维护
当流水线中发现被依赖的指令完成解析或者权限检查等操作之后,需要将信息广播并及时更新存储依赖关系的表,例如掩码向量表或者方形矩阵等。处理器依据这些信息判断是否重新执行相关操作,解除相关安全依赖关系。
现列举一出实施例,来应用本发明的处理器芯片安全依赖的动态识别及维护方法,如图1所示,主要包括以下步骤:
1)可以但不限于在流水级的发射阶段对安全依赖关系进行识别,例如幽灵漏洞中分支指令以及后续访存指令间以及对读操作与后续的访存指令之间的安全依赖关系。
2)可以但不限于通过方形矩阵的方式进行安全依赖关系的存储。在有新的指令进入发射队列时,检测与之前的指令是否存在安全依赖关系。对于1)中提到的依赖关系,可以采用下述方式来更新。
matrix[x,y]=(issueq[x].opcode==memory)
&(issueq[y].opcode==memoryorbranch)
&issueq[y].valid
&!issueq[y].issued
3)在判断出存在安全依赖关系后,将依赖信息携带至指令信息中,供给后续流水线使用。在发射队列中,与指令信息一起,存在安全依赖标记位。
以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求书所述为准。
1.一种处理器芯片安全依赖的动态识别及维护方法,其特征在于,包括以下步骤:
在保持程序执行序的阶段,动态识别存在安全依赖关系的指令;
存储安全依赖关系;
对存在安全依赖的指令添加标识,安全依赖标识信息随指令一起传递或者通过单独的表记录,当后续流水线中发现被依赖的指令完成解析或者权限检查操作之后,将该信息进行广播,处理器根据该信息判断是否重新执行相关操作,解除相关安全依赖关系。
2.如权利要求1所述的方法,其特征在于,在程序执行序中,当前一条指令尚未被解析,后续指令被超前执行,超前执行的指令对微体系结构的改变导致信息泄露,则该两条指令之间存在安全依赖关系。
3.如权利要求2所述的方法,其特征在于,在分支指令还未确定跳转方向前,后续的访存指令若被超前执行而产生缓存侧信道泄露;或者未完成权限检查的读操作获得的数据被后续的访存操作使用而产生缓存侧信道泄露;则后续的访存指令与前面的分支指令或未完成权限检查的读操作存在安全依赖关系。
4.如权利要求1所述的方法,其特征在于,动态地识别存在安全依赖关系的指令的方法为:在保持程序执行序的阶段,判断指令类型,依据指令队列中的序,确定当前指令前是否存在可能触发推测执行的指令,继而判断当前指令是否安全依赖于之前的指令。
5.如权利要求4所述的方法,其特征在于,判断当前指令是否安全依赖于之前的指令包括:在发射阶段检测一条访存指令是否依赖于之前未被解析的分支指令,在访存请求处理阶段检测一条被传递的访存指令是否依赖于之前未完成权限检查的访存操作。
6.如权利要求1所述的方法,其特征在于,通过掩码向量表或/和方形矩阵来存储安全依赖关系。
7.如权利要求6所述的方法,其特征在于,通过掩码向量表来存储安全依赖关系的方法为:为每条指令增加掩码向量,向量的每一位表示当前指令是否与该位的索引对应指令之间是否存在安全依赖关系;
通过方形矩阵来存储安全依赖关系的方法为:依据发射队列的信息进行安全依赖关系的判定时,方形矩阵的宽度与发射队列的深度相同,每一个元素代表当前位置的横坐标指令与纵坐标指令之间是否存在安全依赖关系。
8.如权利要求6或7所述的方法,其特征在于,安全依赖标识在派发新的指令进入发射队列时,判断该指令与之前所有有效指令之间是否存在安全依赖关系,若存在依赖关系,则将掩码向量表或者方形矩阵中对应的元素设置为有效。
9.如权利要求1所述的方法,其特征在于,对存在安全依赖的指令添加标识后,该标识随着指令信息一同传递给后端,或者不一同传递,而是通过单独的表记录安全依赖信息。
10.如权利要求1所述的方法,其特征在于,安全依赖标识信息或者采用1位信息标识是否存在安全依赖,或者采用多位信息来标识多种安全依赖关系。
技术总结