用于在数据处理器的不同操作域之间切换的安全机制的制作方法_4

文档序号:8435869阅读:来源:国知局
,在程序代码内编码有文字的 情况下,即使仅有单个指令长度,也必须注意防护指令的编码未因疏忽而在程序代码区段 中被存储为文字。
[0105] 为避免发生此情况,可检查所存储的所有文字以检查这些文字不具有防护指令编 码。或者,内存可经分段以便仅内存中的特定区段经允许以含有该防护指令。可禁止这些 区段存储数据文字,或者存储在此区段中的任何数据文字可被检查。
[0106] 图5示意性地示出以此方式经分段的数据存储器30。因此,存在保留区段、安全性 较低的区段34及安全区段32,该安全区段32具有可存储防护指令的单个区段35。此区段 可被标示为具有内存保护单元40内的配置寄存器中的此特定属性。由此,如若防护指令经 识别为存储在数据存储器中的其他处,则此情况将产生安全违规指示。
[0107] 以此方式将内存分段允许将文字存储在内存中的其他处,而无需检查这些文字并 未因疏忽而具有防护指令编码。系统可被配置,使得在区段35中存储仅执行码,以便不在 该区段中存储文字。当编译代码时,可移除文字库,但此举对代码的大小及处理速度确实具 有显著影响。然而,如若码中仅有一小部分以此方式被编译,则对性能及代码大小的整体影 响极小。应注意,区段35的大小及位置可依据当前正在执行的代码而在初始化时被设定, 或者可由处理电路来设定。
[0108] 用以限制存储在此区段中的代码的类型的另一可能方法为在此区段中存储可自 安全性较低的函数中调用的任何代码。防护指令在域间移动时使用,尽管在一些实施例中, 防护指令可用以在安全性较高的域与安全性较低的域二者之间移动,但在从较低的安全性 移动至较高的安全性时则防护指令显然更为重要,且在一些情况下,防护指令仅用于这些 情况中。在这些情况下,惟可自安全性较低的函数中调用的代码是可能含有防护指令的代 码,因此,对在区段35中存储此代码进行限制确保如若在其他处发现防护指令则为故障, 因为此故障必定为疏忽编码。
[0109] 尽管数据文字中对防护指令的仿真显然是难以避免的问题,但指令的疏忽编码则 应更易于解决。然而,在一些情况下,特别是在指令具有不同长度的情况下,则这本身便可 造成一些问题。
[0110] 例如,图6示出一指令流的实例,该指令流具有两种指令长度,即32位指令及16 位指令。存在处理电路所需要的地址对准点,指令的起始必须位于这些地址对准点处,且这 些对准点每16位出现一次,16位与此情况下的最小指令长度对应。每一指令的起始于确定 该指令的功能的操作或操作码,随后存在其他部分,在此实例中,目的地寄存器得以辨识, 并且提供数据值或立即值。
[0111] 通过故意分支至指令中间来尝试寻找有用的代码序列是执行返回导向程序攻击 时的常用技术。因此,不仅务必不能有指令仿真防护指令,亦务必不能有失准编码因意外而 仿真防护指令。在此情况下,仅有两种指令长度,且为了避免对防护指令的任何疏忽仿真, 使防护指令具有最大长度并具有两个相互对称的部分,每一部分具有相同值。以此方式,每 一部分不得具有操作码或任何其他指令的操作码的起始段,因为即使失准时,后一部分亦 将与下一指令的起始重迭,由此将与下一指令的操作码重迭。由此,藉由在具有相同值的部 分编码防护指令,则仅避免将此值用于操作码中,因此,专用于防护指令所需的编码空间量 得以缩减。
[0112] 用户可能设想,如若具有更多指令长度,且这些指令长度未必是彼此的直接倍数, 则地址对准点可能变得更为频繁且出现在指令内不同的可能位置处。在此种情况下,如若 防护指令起始于指令内,则该防护指令务必与下一指令重迭。以此方式,重迭部分将位于操 作码的至少一部分上,及假若此部分与任何其他操作码或其他操作码的起始相比为无效, 则该防护指令便无法由指令集中的任何指令仿真,即使在分支不以指令开始为目标时亦如 此。
[0113] 图7示意性地示出正在被执行的程序流。初始时,存储在公共内存中的代码在公 共处理域中被执行,并在此执行期间,前一链接寄存器值保存至堆栈,然后,分支指令得以 执行,且此执行导致处理电路分支至存储在私用内存中的代码内并在链接寄存器中存储新 分支返回地址。在此实例中,自私用内存中提取的指令为防护指令,且该指令在处理电路仍 在公共域中操作时被提取。因此,域标志指示公共域,而MPU则侦测出已检索指令被存储在 私用内存中,尽管处理电路正在公共域中执行。MPU向处理电路指示已提取安全性较高的区 域中的指令,该区域的安全等级高于当前域的安全等级。
[0114] 此情况触发处理电路检查已提取的指令为防护指令,并在验证出该指令为防护指 令时,藉由将域标志设定为指示私用域以切换处理域,使得存储在私用内存中的后续指令 可得以执行。然后,后续代码得以执行,该代码起始于确保函数调用有效的安全检查例程; 然后,私用函数得以执行。
[0115] 以此方式,允许避免安全检查例程半路分支到私用函数的指令部分不可能发生 的。原因在于响应于自安全等级高于当前操作域的安全等级的内存区域中提取的指令而发 生的指令检查将指示所提取指令并非防护指令,并且将产生安全违规指示。
[0116] 图8示出了根据本发明实施例的方法的步骤的流程图。初始时,指令被提取并确 定从其提取该指令的内存区域是否与处理电路的当前处理域对应。这通过查看图2所示的 域标志44而进行。
[0117] 如若其有对应域,则执行该指令并提取下一指令。如若其与不同域对应,则确定该 指令是否为防护指令。如若该指令并非防护指令,则已发生安全违规,并使安全违规指示有 效。如若该指令为防护指令,则处理域经切换至与存储该防护指令的数据存储器的区域对 应的处理域,在此情况下,处理电路亦在提取下一指令之前执行该防护指令。以此方式,域 切换仅在发现防护指令时发生。
[0118] 应注意,尽管本文详细描述极为一般的在不同域之间切换需要防护指令的方法, 但在例如关于图7所公开的实施例的一些实施例中,仅在当从安全性较低的域切换至安全 性较高的域,且初始评估为存储该指令的数据存储器的区域的安全等级高于处理域的安全 等级时才需要防护指令,且仅在这为肯定时才检查该指令以验证其是否为防护指令,否则 简单地执行该指令。
[0119] 下文中列出一特定实施例的一些其他详情。
[0120] 注意:一些寄存器在公共状态与私用状态之间形成组,以下命名规约用以界定应 存取寄存器的哪一版本:_
[0121] ?〈寄存器名称>_未指定特定版本,使用与当前状态有关的版本。此表示法亦用 于未形成组的寄存器
[0122] ?〈寄存器名称>_P_使用寄存器的私用版本
[0123] ?〈寄存器名称>_NP_使用寄存器的非私用/公共版本
[0124] 私用状态
[0125] 向核心(及更大的系统)添加新私用状态,该状态与已有的线程/处理程序模式 为正交关系,如图9所示。当系统在公共状态之一下执行时,试图存取标示为私用的资源将 导致故障。
[0126] 处理器在该四个状态中的哪一状态下执行由已有的线程/处理程序逻辑及对软 件为非直接可见的新架构标志的组合界定。在伪码中,此标志由称作CurrentState的变量 所表示,此标志界定如下:-
[0127] enumeration PrivacyState{PrivacyState_Public, PrivacyState_Private}; PrivacyState CurrentState ;
[0128] 地址空间保护
[0129] 假定可标示为私用的所有内存及其他内存映像外围设备在芯片上,因此,无 需加密以保护它们。对地址空间的任何存取包括新属性P-Attr,该新属性用以将事 务(transaction)标示为公共或私有。P-Attr的传送是实现界定的(implementation defined)〇
[0130] 标示为私用的所有地址范围的起始及结束地址需要对准至32字节边界。
[0131] 资产保护扩展要求:_
[0132] ?标示为私用的地址空间区域必须仅可由将P-Attr设定为私用的事务存取。对将 P-Attr设定为公共的私用地址的任何存取必定导致错误,该错误被报告至产生该请求的组 件。
[0133] ?处理器能够确定地址的私密状态,此状态确定由以下选项之一完成:
[0134] ?PAU
[0135] 资产保护扩展亦界定新P-Req属性,该新属性界定核心要求数据事务被执行时所 处于的私密状态,除非另外指定的P-Req与核心的私密状态相同。
[0136] MPU扩展
[0137] 资产保护扩展以下面的方式扩展MPU功能:_
[0138] *MPU配置寄存器分组为私密;MPU内存属性标示及特权检查使用与当前执行私密 状态的处理器对应的配置寄存器。
[0139] ?私密属性标示单元(privacyattributionunit;PAU)-此新块负责将内存区域 属性标示为公共或私用。
[0140] 私密属性标示单元
[0141] 私密属性标示单元(PAU)执行以下功能:_
[0142] ?对事务的早期筛检。此举能使私密违规被较早发现(亦即在执行内存存取之前) 及以有意义的方式进行报告,而非作为BusFault报告。
[0143] ?提供关于可从中提取指令的私密域的信息。
[0144]PAU配置界定多个内存区域,区域数目是实现界定的,并可藉由读取PAU_TYPE. PREGI0N字段而发现。这些区域被命名为PAU_REGI0Nn,其中,n为从0至PAU_TYPE. PREGI0N-1的数字。与这些区域有关的配置字段无法被直接存取,但可经由窗口寄存器间接 存取,如下表所示:-
当前第4页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1