首页> 中国专利> 使用安全域与次安全域的数据处理装置和方法

使用安全域与次安全域的数据处理装置和方法

摘要

本发明涉及使用安全域与次安全域的数据处理装置和方法。一种数据处理装置(2)具有处理电路(4),所述处理电路(4)具有安全操作域和次安全操作域。当在安全域中操作时,所述处理电路(4)能访问当在次安全域中操作时不可访问的数据。响应于控制流改变指令,处理切换到目标地址处的程序指令。执行域选择以确定所述处理电路(4)将在其中针对所述目标地址处的指令进行操作的所选择域。可以执行域检查以检查哪个域被允许作为所述域选择所确定的所选择域。如果所述域选择中的所选择域不是允许选择域,则触发域检查错误。

著录项

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-01-05

    授权

    授权

  • 2015-03-11

    实质审查的生效 IPC(主分类):G06F21/62 申请日:20130131

    实质审查的生效

  • 2013-09-18

    公开

    公开

说明书

技术领域

本发明涉及数据处理领域。更具体而言,本发明涉及使用安全域与次 安全域(less secure domain)的数据处理装置和方法。

背景技术

数据处理装置可以能在安全域与次安全域中操作。当在安全域中操作 时,能访问在次安全域中操作时不可访问的数据。这提供了一种将潜在敏 感的数据和代码与未获授权人士或进程的访问相隔离的方式。

英国剑桥(Cambridge UK)的提供了一种保持数据和代码安 全的方式,在其Trustzone构架中,存在安全状态和非安全状态,并使用 异常指令在这些状态之间转移,异常处理程序保护安全侧的安全。虽然该 方法提供了高度安全性,但需要大量的软件异常处理程序形式的软件干预 来更改安全状态,这既降低了系统的性能,又增加了开发用于安全软件的 外部应用程序接口API所需的工作量,因为所有调用都必须通过异常处理 程序进行代理。

对于诸如微控制器的小系统而言,可能更重要的是实现安全级与系统 性能之间的折衷,并因此将与实现安全域相关联的开销保持在相当低的水 平。

发明内容

根据一个方面,本发明提供了一种数据处理装置,所述装置包括:

处理电路,用于响应于程序指令执行数据处理操作,所述处理电路具 有包含安全域和次安全域的多个操作域,其中当在所述安全域中操作时, 所述处理电路能访问当在所述次安全域中操作时不可访问的数据;

其中响应于控制流改变指令的执行,所述处理电路被配置为切换为处 理所述控制流改变指令所指示的目标地址处的程序指令,并执行用于确定 所述处理电路将在其中针对所述目标地址处的程序指令进行操作的所选择 域的域选择;以及

至少如果在所述安全域中操作时所述控制流改变指令被执行,则所述 处理电路被配置为:

(i)执行域检查,以用于确定所述多个域中的哪个域被允许作为通过针 对所述目标地址处的程序指令进行的所述域选择而确定的所选择域,所述 域检查使用与所述域选择不同的技术;以及

(ii)如果在所述域选择中确定的所选择域不是在所述域检查中确定的 允许选择域,则触发域检查错误。

在该技术中,控制流改变指令可用于在多个域之间切换处理。这意味 着不必使用异常和相应的软件异常处理程序来控制域之间的更改,因此改 进了性能。然而,重要的是控制流改变指令不规避系统的安全保障。

在所述控制流改变指令之后,使用域选择技术来确定将在其中处理目 标地址的程序指令的所选择域。因此,取决于所使用的域选择技术,相同 的控制流改变指令可以用于切换为不同域中的处理。

该技术认识到,如果控制流改变指令的行为(程序员旨在通过该行为 切换为一个域中的程序指令的处理)被次安全域中的代码改变,以使得其 转而切换为在不同域中的程序指令的处理,就会发生安全风险。例如,次 安全域中的代码可能更改控制流改变指令的目标地址。举例而言,可能存 在将在安全域中被执行的控制流改变指令,其旨在引起到次安全域中的指 令的切换。然而,控制流改变指令的目标地址可被次安全域中的代码设置 为指向将在安全域中处理的程序指令,从而使得现在控制流改变指令可能 转而切换到安全域中的处理。这会允许黑客使用次安全域中的代码来触发 从安全域到安全代码的不受控转移,因为通常安全到安全的切换不会被监 督,这是由于安全的处理被预期为受信任的。这会造成安全漏洞。

为了解决这个问题,处理电路可以至少在处于安全域中时在控制流改 变指令被执行时,执行域检查。域检查确定多个域中的哪个域被允许作为 通过针对目标地址处的程序指令进行的域选择而确定的所选择域。域检查 不影响系统将在其中针对目标地址处的指令进行操作的实际域,因为这是 通过域选择来确定的。然而,域检查允许系统确认控制流改变指令已引起 了预期的域转移。如果在域选择中所确定的域不是在域检查中确定的允许 选择域,则可以触发域检查错误。以此方式,如果次安全代码使控制流改 变指令以非预期方式起作用,则可触发错误以防备对安全数据的未获授权 的访问。

控制流改变指令可以是引起被处理的指令中的非顺序转移的任何指 令。更常见地,控制流改变指令可以包括分支指令。然而,控制流改变指 令还可以包括其他种类的指令,例如装入指令,该装入指令向存储了程序 计数器的寄存器装入指示将要处理的下一个指令的值。

非必要的是,针对在处于次安全域中时被执行的控制流改变指令执行 域检查。这可能似乎是违反直觉的,因为人们通常期望的是,处于次安全 域中的指令应受到更严格的检查。然而,通常会存在一些其他的用于调节 从次安全域到安全域的转移的机制。另一方面,当处于安全域中时,上述 类型的攻击是最麻烦的,因为通常当系统已处于安全域中时,代码将被信 任并假定为正在正确地活动,因此这可能被黑客利用而使用次安全代码更 改处于安全域中的控制流改变指令的行为。因此,至少针对处于安全域中 时执行的控制流改变指令执行域检查。

然而,如果希望的话,也可以在当在次安全域中操作时执行控制流改 变指令时,执行域检查。除了防备安全漏洞,域检查还可用于检测由于粒 子撞击或其他种类的错误造成位值已更改状态从而使得指令现在不像预期 那样起作用的被破坏指令或目标地址。这在安全域与次安全域中都可以是 有用的。

除了控制流改变指令之外,还可以针对其他指令来执行域选择。例 如,在一些系统中,处理电路能够针对每个指令确定应在哪个域中处理该 指令。

域选择和域检查使用不同的技术来确定所选择域和(一个或多个)允 许域,以使得可以通过不同形式的域检查来确认域选择。例如,第一确定 可以用于域选择和域检查中的一者,而第二确定用于另一者。在一个实施 例中用于域选择的技术可以在另一个实施例中用于域检查,反之亦然。

在一个实施例中,可以有数据储存器,该储存器具有包含安全区域和 次安全区域(less secure region)的多个区域,安全区域用于存储当在安全 域中操作时处理电路可访问而当处于次安全域中时不可访问的数据。次安 全区域可以是当处于安全域中时和当处于次安全域中时都可访问的。

因此,第一确定可以包括至少取决于哪个区域与目标地址处的程序指 令的指令地址相对应来确定至少一个所选择域。一般而言,如果程序指令 的指令地址对应于次安全区域,次安全域则可以被选择为所选择域,而如 果指令地址对应于安全区域,安全域则可以被选择。该技术可以用于域选 择或者域检查。

哪个区域对应于指令地址可以不是第一确定的唯一标准。例如,对于 某些指令,第一指令还可以取决于目标地址处的程序指令的类型。而且, 在第一确定用于域检查的情况下,则多个域可被选择为允许选择域。

第二确定可以包括将目标域值所指示的多个域之一确定为所选择域 (或者在域检查的情况下,确定为若干允许选择域之一)。目标域值可由 处理器维护,以指示目标地址处的程序指令被期望在哪个域中进行处理。 这可以是域选择或者域检查的一部分。

因此,在一个示例中,可以基于与目标地址处的程序指令的指令地址 相对应的数据储存器的区域来执行域选择,并且可以基于目标域值来执行 域检查。在该情况下,目标域值提供用于确认控制流改变指令是否已切换 到正确区域中的程序指令的检查。在另一个示例中,目标域值可用于控制 目标地址处的程序指令将在其中被处理的实际域,并且然后域检查可以确 认目标地址是在数据储存器的正确区域中。

目标域值可以不同的方式表示。在一个示例中,可以在控制流改变指 令的编码中指定目标域值。例如,可以有对应于不同的目标域值的几个版 本的控制流改变指令,这些目标域值指示不同的安全域为所选择域。当编 写程序时,程序员可以选择使用哪个版本的控制流改变指令,以使得该改 变指令的控制流将使适当的域被选择为所选择域(在域选择的情况下)或 者允许域(在域检查的情况下)。

可替代地,可以在控制流改变指令所使用的目标地址的一部分中指定 目标域值。这种形式的目标域值对于识别存储了目标地址的寄存器的间接 控制流改变指令可以是有用的。

目标域值可以响应于目标域值设置指令而被设置。这允许了程序员通 过在下一个控制流改变指令之前包括将被执行的目标域值设置指令来控制 该控制流改变指令的预期转移。例如,如果处于次安全域中时设置了函数 指针,那么在安全域中使用该函数指针之前,可以执行目标域值设置指令 以设置该控制流改变指令的预期行为。

目标域值设置指令的一个示例是用于保护从次安全域到安全域的转移 的防护指令。通常重要的是,避免到安全函数的中间的不受控切换,因为 这有时会规避在安全函数中较早执行的安全检查。为了防止这样的切换, 系统可以要求在处理从次安全域切换到安全域的点处必须存在防护指令。 如果在处理电路在切换为在安全区域中处理目标地址处的程序指令之前, 在次安全域中操作所针对的控制流改变指令之后,目标地址的程序指令不 是防护指令,则可以触发错误。因此,防护指令应被用于标记安全代码的 受信任入口点。防护指令对于设置目标域值来说可以是有用的,因为当目 标地址被设置在次安全域中而用于安全域中时,必需存在安全域的入口, 因此将执行防护指令。通过使用防护指令来设置目标域值,则不必为此目 的执行进一步的指令。

具体而言,防护指令对于为随后的控制流改变指令将处理切换到的返 回地址设置目标域值而言可以是有用的。防护指令的存在通常意味着程序 员预料到存在着这样的风险:安全域中的函数本可以被次安全代码调用, 并且因此可能存在这样的随后的函数返回控制流改变指令,该指令触发处 理切换到由次安全域指定的返回地址处的程序指令。为了保护免于这种可 能,可以使用防护来为返回地址设置目标域值以设立该函数返回的预期转 移。

在一个示例中,如果在执行目标域值设置指令之前处理电路是在次安 全域中操作,则目标域值可被设置为指示次安全域。例如,如果目标域值 设置指令为防护指令,那么如果在切换到该防护指令之前系统处于次安全 域中,将期望的是,随后的函数返回应切换回次安全域。

数据储存器可以具有包含安全堆栈和次安全堆栈的多个堆栈,其中当 处于安全域中时安全堆栈是可访问的,而当处于次安全域中时安全堆栈是 不可访问的。次安全堆栈可以从安全域和次安全域被访问。

当使用控制流改变指令来调用一函数时,有时可能希望传递来自函数 调用之前执行的代码的函数自变量(数据值)供函数调用之后执行的代码 所用。堆栈可以用于传递函数自变量。如果函数调用使得从安全域转移到 次安全域,那么自变量将需要被放在次安全堆栈上,因为安全堆栈对于处 理电路来说将是不可访问的。另一方面,如果函数调用使得从次安全域转 移到安全域,那么自变量应被放在安全堆栈中,以防止次安全代码访问这 些数据值。因此,当在安全域中执行函数调用时,确定使用哪个堆栈将取 决于函数调用之后的操作域。和例如基于目标地址的其他技术相比,目标 域值能够提供函数调用被期望切换到哪个域的更快指示。因此,将目标域 值再利用来确定将哪个堆栈用于传递函数自变量使得能够更快切换到函 数,因此改进了处理性能。

目标域值的另一个用途是设置函数返回地址。通常,当调用函数时, 将执行第一控制流改变指令,当从函数返回时,将执行第二控制流改变指 令。第一控制流改变指令出现时,返回地址通常被存储在预定存储位置 (例如链接寄存器)以指示响应于第二控制流改变指令处理应返回到的位 置。当从安全域中的代码调用次安全域中的函数时出现的一个问题是,返 回地址可能是敏感的,因此可能希望防止次安全域获得对返回地址的访 问。

为了解决这个问题,响应于第一控制流改变指令(当在安全域中被执 行并引起向次安全域的转移时),伪返回地址可被存储到预定存储位置, 伪返回地址不是有效的指令地址。实际返回地址可被存储到当处于次安全 域中时不可访问的安全存储位置(例如安全堆栈或安全存储器区域)。当 执行第二控制流改变指令时,处理器检测到返回地址为伪返回地址,这然 后使得从安全存储位置取回实际返回地址。处理然后被切换到实际返回地 址以从函数返回。

因此,当从安全域调用函数时,有用的是能够确定将在安全域还是次 安全域中处理该函数以便确定应将实际返回地址还是伪返回地址存储到预 定存储位置。这可以使用目标域值来快速容易地做到。

目标域值可以各种方式表示。可以有用的是,使用控制流改变指令的 编码中的或控制流改变指令所使用的目标地址中的冗余数据字段。例如, 如果给定的功能性不被数据处理装置支持,则最初旨在用于该功能性的字 段就可能不是相关的,因此该字段可被再用于指示目标域值。这避免了增 加用于目标域值的附加位字段的需要。

例如,一些系统能够执行来自多个指令集的指令。在这样的系统中, 控制流改变指令或目标地址可以包含目标指令集字段,该字段指示目标地 址处的指令将来自第一指令集还是第二指令集。这允许处理器在执行控制 流改变指令时确定如何解码目标地址处的指令。其他系统可能只能执行这 些指令集之一,但仍可以执行为支持两个指令集的系统设计的指令。在该 情况下,该指令或目标地址的目标指令字段可变得冗余。因此,该字段可 被再用于指示目标域值。

目标指令集字段可以具有指示第一指令集的第一值和指示第二指令集 的第二值。在第一指令集为处理电路所支持的指令集并且第二指令集不被 处理电路支持的情况下,可以有用的是将目标指令集字段的值映射到目标 域值的值,这样使得第一值指示安全域为所选择域并且第二值指示次安全 域为所选择域。由于只有第一指令集被支持,因此这将意味着使用第一指 令集的指令编写的软件中现存的控制流改变指令将指定该目标指令集字段 的第一值。由于通常在安全域中执行的多数控制流改变指令旨在使得转移 到安全域中的其他位置,因此有用的是,将该值映射到指示安全域的目标 域值,以使得为了指示不同的目标域值,需要修改相对较少的指令或目标 地址。只有旨在切换到次安全域的、安全域中的控制流改变指令的目标域 值才会需要被改变(例如通过增加早期目标域值设置指令以指示次安全域 为所选择域)。因此,采用这种目标指令集字段到目标域值的映射使得能 够与传统代码后向兼容。

当使用这种目标域值的映射时,有用的是当在次安全域中执行控制流 改变指令时,省略执行域检查,以改进与传统代码的后向兼容。次安全域 中的多数控制流改变指令将引起向也在该次安全域中的另一个指令的转 移。然而,使用上述目标域值的映射,第一指令集的传统指令将指示目标 指令集字段中的第一值,这将指示安全域被期望为所选择域。因此,如果 也在次安全域中执行域检查,那么将需要修改与将在次安全域中执行的多 数控制流改变指令相关联的目标域值,以防止域检查错误。这将降低系统 与传统代码的后向兼容。由于在任何情况下域检查对于次安全域中的指令 来说都是不太重要的,因为可能已经提供了诸如防护指令之类的其他机制 用于控制从次安全域到安全域的转移,那么可以更有效的是当处于次安全 域中时省略域检查,以使得不需要修改之前编写的代码。

通常,域检查将确定单个域为用于程序指令的允许选择域。例如,在 安全代码中可能存在着理应切换回次安全域的控制流改变指令,因此只有 次安全域才能被选择为允许域。

然而,在其他情况下,可以有用的是确定多个域为用于同一程序指令 的允许选择域。例如,在安全域中可以存在着有时被用于切换到安全域而 有时被用于切换到次安全域的一些控制流改变指令。在该情况下,通过选 择多个允许域,那么无论指令切换到哪个域,都可以执行这个指令而不触 发域检查错误。在另一个示例中,由于当处于次安全域中时域检查错误并 非如此关键,因此对于次安全域中的控制流改变指令而言,两个域都可以 被设置为可允许域。

选择多个允许域对其有用的另一个指令是防护指令。例如,可以从安 全域或次安全域调用同一个程序函数,在该情况下防护指令通常会存在于 函数开始之处以指示从次安全域的允许入口点。如果从次安全域调用该函 数,则可能希望推迟从次安全域的切换直到确定是否存在防护指令,从而 使得如果无防护指令,则还没有切换到安全域。因此,防护指令可以取决 于从安全域还是次安全域调用函数而能够在任一个域中操作。为了防止在 该情况下出现域检查错误,可能方便的是无论防护指令处于存储器的哪个 区域或目标域值为何值,都将安全域和次安全域二者设置为防护指令的允 许域。

对于在安全域中执行的至少一个控制流改变指令,有时有用的是,在 切换为处理目标地址处的程序指令之前,从安全域中的操作切换为次安全 域中的操作。这意味着,在该切换之后,系统会看起来好像是来自次安全 域中的指令,因此将需要防护指令以避免错误。这对于切换到安全域中的 安全入口点可能不被信任的控制流改变指令而言是有用的,例如对于目标 域值指示次安全域为允许域的控制流改变指令(在该情况下有可能的是次 安全代码已为该控制流改变指令设置了目标地址)。

从另一个方面看,本发明提供了一种数据处理装置,所述装置包括:

处理装置,用于响应于程序指令执行数据处理操作,所述处理装置具 有包含安全域和次安全域的多个操作域,其中当在所述安全域中操作时, 所述处理装置能访问当在所述次安全域中操作时不可访问的数据;

其中响应于控制流改变指令的执行,所述处理装置被配置为切换为处 理所述控制流改变指令所指示的目标地址处的程序指令,并执行用于确定 所述处理装置将在其中针对所述目标地址处的程序指令进行操作的所选择 域的域选择;以及

至少如果在所述安全域中操作时所述控制流改变指令被执行,则所述 处理执行被配置为:

(i)执行域检查,以用于确定所述多个域中的哪个域被允许作为通过针 对所述目标地址处的程序指令进行的所述域选择而确定的所选择域,所述 域检查使用与所述域选择不同的技术;以及

(ii)如果在所述域选择中确定的所选择域不是在所述域检查中确定的 允许选择域,则触发域检查错误。

从又一个方面看,本发明提供了一种数据处理方法,该方法用于包括 用于响应于程序指令来执行数据处理操作的处理电路的装置,所述处理电 路具有包含安全域和次安全域的多个操作域,其中当在所述安全域中操作 时,所述处理电路能访问当在所述次安全域中操作时不可访问的数据;所 述方法包括:

响应于控制流改变指令的执行,切换为处理所述控制流改变指令所指 示的目标地址处的程序指令;

执行用于确定所述处理电路将在其中针对所述目标地址处的程序指令 进行操作的所选择域的域选择;以及

至少如果在所述安全域中操作时所述控制流改变指令被执行,则:

(i)执行域检查,以用于确定所述多个域中的哪个域被允许作为通过针 对所述目标地址处的程序指令进行的域选择而确定的所选择域,所述域检 查使用与所述域选择不同的技术;以及

(ii)如果在所述域选择中确定的所选择域不是在所述域检查中确定的 允许选择域,则触发域检查错误。

根据以下说明性实施例的详细说明并结合附图,本发明的以上和其他 目的、特征和优点将变得清楚。

附图说明

图1示例性地示出了数据处理装置;

图2示出了具有次安全区域和安全区域的存储地址空间;

图3A示出了程序代码的一个示例,其中次安全域中的指令为安全域 中的分支指令设置目标地址;

图3B示出了如果黑客修改图3A的次安全代码则会发生的安全问题;

图4A示出了使用控制流改变指令的指令编码的一部分来指示目标域 值的示例;

图4B示出了以控制流改变指令的目标地址的一部分来表示目标域值 的示例;

图5示出了包括域选择和域检查的数据处理方法;

图6示出了可用于域选择或域检查的第一确定的示例;

图7示出了可用于域选择或域检查的第二确定的示例;

图8示出了可以如何通过执行域检查以确认域选择来防止图3B所示 的安全问题的示例;

图9示出了使用域检查来防御试图使用函数指针来访问安全代码的次 安全代码的示例;

图10和图11分别示出了处理函数调用和函数返回的示例;

图12示出了选择安全堆栈和次安全堆栈中的哪一个来用于传递函数 自变量的示例;

图13示出了次安全代码控制安全代码切换为处理进一步的安全代码 可以是合法的情形的示例;

图14示出了可以如何安全地并且不触发错误地实现图13中的情形的 第一示例;并且

图15示出了可以如何安全地并且不触发错误地实现图13中的情形的 第二示例。

具体实施方式

图1示例性地示出了数据处理装置2,该装置包括处理电路4、数据 储存器(存储器)6和寄存器8。数据储存器可以包括至少一个缓存以及 主存储器。处理电路4包括处理流水线,该处理流水线包含用于从存储器 6取回指令的取回级10、用于解码所取回的指令的解码级12以及用于执 行解码指令的执行级14。应理解的是,该处理流水线可以包括其他类型的 级,例如寄存器重命名级或发布级。

寄存器8包括用于代表处理电路4存储数据的若干通用寄存器R0至 R12。虽然图1示出了13个通用寄存器R0至R12,但应理解的是也可以提 供其他数量的寄存器,并且可选地还可以提供用于存储浮点值的浮点寄存 器。寄存器8还包括一些专用寄存器,包括程序计数(PC)寄存器20、 链接寄存器(LR)22和堆栈指针寄存器24、26。程序计数寄存器20存储 指示将由处理电路4执行的下一个程序指令的指令地址的程序计数器。一 般而言,在执行指令之后,程序计数器将被更新以指示来自存储器的下一 个指令。然而,响应于控制流改变指令,程序计数器可被设为并非在顺序 上是在前一个值之后的值。链接寄存器22可被设置为存储当从函数或异 常返回时使用的返回值,以确定在函数或异常结束后应处理哪个程序指 令。堆栈指针寄存器24、26存储指示存储器6内的堆栈30、32的位置的 堆栈指针。例如,堆栈指针可以指示置于堆栈30、32上的术项的位置。

存储器6包括安全区域40和次安全区域50。如图2所示,地址存储 器6的存储地址空间可以被分成安全区域和次安全区域,其中一些范围的 存储地址对应于存储器的安全区域40,并且其他范围的存储地址对应于次 安全区域50。存储保护单元(MPU)65可以控制将地址空间分割成不同 的区域。虽然图2示出了一个安全区域和一个次安全区域,但还有可能的 是存储地址空间包含两个或更多个离散的安全区域或者两个或更多个离散 的次安全区域。存储地址空间还包括保留地址范围70(例如0xF0000000 或更高的地址值),在该范围内地址值不对应于任何有效指令地址。这些 地址可用于特殊目的,例如用于处理异常返回和函数返回。安全区域40 和次安全区域50均可包含程序代码60和相应的堆栈30、32。分开的安全 和非安全堆栈指针寄存器24、26被用来维护用于安全区域40中的安全堆 栈30和次安全区域50中的次安全堆栈32的堆栈指针。

处理电路4可以在安全域和次安全域中操作。当处理电路处于安全域 中时,处理电路4可以访问存储器6的安全区域40中的数据和代码,并且 还可以访问次安全区域50中的数据和代码。然而,当处理电路4处于次 安全域中时,那么只可访问次安全区域50,而安全区域40是不可访问 的。这防止了次安全域中的不受信任的代码访问安全数据。虽然图1和图 2示出了只有一个安全域、一个次安全域和存储器6的相应安全区域40和 次安全区域50的示例,但还有可能提供两个以上的域和区域。例如,可 以有若干安全域,每个安全域具有一个安全级,或者可以有若干次安全 域。在一些实施例中,每个域可以具有一个不同的安全级。在其他实施例 中,可以有多个具有相同安全级的域。

一般而言,图1的系统进行操作,使得当处理电路4执行来自存储器 6的安全区域40的代码时,处理电路4则处于安全域中,并且当处理电路 执行来自存储器6的次安全区域50的代码时,处理电路4则在次安全域中 操作。然而,图3A和图3B示出了如果这是所使用的唯一域确定技术则会 产生的安全问题的一个示例。

在图中3A,程序代码60包括次安全域中的函数bob()和安全域中的两 个函数joe()和fred()。函数joe()被bob()调用并且检查bob()所提供的密码 是否有效。如果该密码有效,joe()则调用函数fred()用于执行安全处理。 清楚的是,希望只有通过了函数joe()中的密码检查才可执行函数fred()。 图3A示出了代码正确地操作的情况。函数bob()包含调用函数joe()的分支 指令100。如图3A所示,分支指令100使返回地址(PC+4)被放入链接寄存 器22并且函数joe()的地址被放入程序计数寄存器20。返回地址表示一旦 函数joe()已完成,处理就应切换到的指令的地址。程序计数寄存器20的 更新使处理跳转到函数joe()的起始地址。由于用于函数joe()的代码被存储 在安全区域40中,所以joe()将在安全域中被处理。

当响应于分支指令或其他控制流改变指令而从次安全域变到安全域 时,在分支指令100的目标地址必须存在防护(guard)指令102,否则将 触发防护检查错误(该机制防备次安全域中的分支到存储器的安全区域中 的函数的中间的分支)。在该情况下,由于存在防护指令102,因此处理 可以在安全域中继续。函数joe()然后检查bob()所提供的密码是否匹配所 存储的密码,若是,则调用函数fred()。当fred()结束时,然后另一个分支 指令104通过使得分支到其地址被存储在链接寄存器22中的程序指令, 而将处理返回到次安全域。

图3B示出了安全漏洞的示例,其中,黑客可以无正确密码而获得对 安全函数fred()的访问。如图3A所示,在调用joe()时,bob()理应编写函 数返回地址PC+4到链接寄存器22。然而,取而代之的是,黑客可以编写 bob(),使得MOV指令106将函数fred()的地址放入链接寄存器22。因 此,即使因为未提供正确密码而使joe()中的密码检查失败,joe()中的函数 返回分支104也将分支到存储于链接寄存器22中的地址,即函数fred()的 地址。因此,在没有正确的密码的情况下,次安全域已能够使安全域执行 函数fred()。

而且,由于使处理切换到函数fred()的分支指令104是在安全域中被 执行的,因此系统将不需要在fred()中存在防护指令。因此,黑客可以使 用不受信任的次安全代码来触发到存储器6中的任何任意安全位置的分 支,这可以导致对安全数据或安全代码的未获授权的访问。

为了防止这种类型的攻击,提供了目标域值,这提供了用于确定在诸 如分支指令之类的控制流改变指令之后处理器将被期望在哪个域中操作的 第二技术。与基于控制流改变指令的目标地址的第一确定技术一起,存在 两种不同的确定所选择区域的方式。至少对于在安全域中执行的控制流改 变指令而言,一种技术可以用于选择在分支之后处理器实际上应该在哪个 域中操作,而另一种技术可用于检查所选择域是否为允许域。如果域选择 中的所选择域不匹配允许域,则会触发错误,因此,可以防止图3B所示 的类型的攻击。

图4A示出了维护目标域值的第一示例。控制流改变指令150,例如 分支指令,可以包含用于表示目标域值的位字段T。如果目标域值T具有 一值(例如T=1),则指示该指令被期望分支到安全域,如果它具有另一 值(例如T=0),该指令则被期望分支到次安全域。图4B示出了可以用 目标地址的一个位表示目标域值T的另一个示例。这在分支指令或其他控 制流改变指令155指定用于存储目标地址的寄存器时可以是有用的。在图 4A和图4B的示例中,目标域值通过之前用于表示目标地址处的指令是来 自第一指令集还是第二指令集的冗余位字段来表示。处理电路4只支持第 一指令集,因此该位字段已变得冗余,并因此被再用于目标域值。图4A 所示的目标指令集字段到目标域值的映射改进了与传统代码的后向兼容 性。

图5示出了处理控制流改变指令的一个示例。在步骤200,处理电路 4判断下一个指令是否为控制流改变指令。控制流改变指令可以是引起程 序计数寄存器20的非顺序更改的任何指令,例如分支指令或将新值装入 程序计数寄存器20的另外的指令。如果该指令不是控制流改变指令,那 么在步骤202,处理电路4则处理其他种类的指令。处理然后移至下一个 指令。

如果当前的指令是控制流改变指令,该方法则移至步骤204,在该步 骤中处理电路4确定哪个域为处理器4应在其中针对目标地址处的程序指 令进行操作的所选择域。执行该步骤的定时可以变化,例如,该步骤可以 响应于控制流改变指令的执行被执行,或者响应于控制流更改之后的目标 地址处的程序指令的执行而被执行。如将在图6和图7中所论述的,可以 使用第一确定技术或第二确定技术来执行域选择。

在步骤206,处理电路判断控制流改变指令是否是在安全域中被执行 的。若是,那么在步骤208中,处理电路则执行域检查来确定哪个域是允 许域选择选择用于目标地址处的程序指令的允许选择域。在步骤210,处 理电路判断在步骤204中被选择的域是否为在步骤208中被选择的允许选 择域。若否,那么在步骤212,则触发域检查错误。另一方面,如果所选 择域与允许选择域相匹配,那么在步骤214,在所选择域中处理目标地址 处的指令。该方法然后返回到步骤200用于下一个指令。

同时,如果在步骤206中判定在执行控制流改变指令时系统未处于安 全状态,那么在步骤220,则判断目标指令是否来自安全区域。若否,该 方法则继续到步骤214,在该步骤中在次安全域中处理目标地址处的指 令。在该情况下,控制流改变指令和目标地址处的目标指令处于次安全区 域中,因此更改是可接受的,因为不存在正被处理的安全代码。

然而,如果在步骤220判定目标地址处的指令来自安全区域,那么在 步骤222,则判断该指令是否为防护指令。若否,则在步骤224中触发防 护检查错误并且该方法结束。因此,当从非安全域更改为安全域时,该切 换之后的第一指令必须为防护指令。这防止了能够分支到安全代码内的任 何任意点从而引起安全漏洞的非安全代码。另一方面,如果在步骤222该 指令为防护指令,该方法则继续到步骤214,在该步骤中处理该指令,然 后该方法返回到步骤200用于下一指令。

图5示出了如果在次安全域中执行控制流改变则不执行域检查的示 例。然而,如果希望的话,也可以在次安全域中执行域检查。

图5示出了两种用于确定所选择域的技术。在步骤204中执行的域选 择确定将在其中处理指令的实际域。在步骤208中执行域检查以检查该域 是否为允许域。图6和图7示出可以使用的两种确定技术。

图6示出了第一域确定技术。在步骤230,处理电路4确定存储器6 中的哪个区域包含将被处理的下一个指令的地址。例如,处理电路4可以 发送地址到存储器保护单元65,该存储器保护单元65可以返回哪个存储 器区域对应于该地址的指示。如果指令地址是在次安全区域50中,那么 在步骤232中,次安全域则被选择为所选择域,而如果指令地址是在安全 区域40中,那么在步骤234中,安全域则被选择为所选择域。对于多数 指令通常都会执行该技术,虽然可能有一些例外。可以存在可使用不同技 术或其他参数来确定所选择域的一些指令。例如,如将稍后进行说明的, 防护指令102可能需要不同的技术。

图7示出了基于图4A或图4B所示的目标域值的第二确定技术。在步 骤250,确定目标域值T的值。如果目标域值具有值0,那么在步骤252, 次安全域则被选择为所选择域,而如果目标域值具有目标1,那么在步骤 254,安全域则被选择为所选择域。应理解的是,也可以使用域到目标域 值T的值的不同映射,虽然图4A和图7所示的映射对于与传统代码的后 向兼容是有用的。

图6和图7所示的第一确定和第二确定可以用于域选择或域检查。在 一个示例中,图6所示的第一确定可用于选择处理器将在其中进行操作的 实际域的域选择,而基于目标域值的图7所示的第二确定可用作检查以查 找哪个是允许选择域。另一方面,目标域值(第二确定)可用于触发实际 域选择,而下一个指令的地址(第一确定)可用做检查以查看目标地址是 否匹配目标域值中指示的域。以任一方式,安全域中的代码都可用于设置 目标域值以指示控制流改变指令被期望分支到的域。

图8和图9示出了可以使用域检查来防止对安全代码的未获授权的访 问的示例。图8示出了与图3B相同的情形。再次,黑客已编写函数bob() 以将函数fred()的地址放入链接寄存器22,以试图使安全域104中的函数 返回分支指令104切换到安全函数fred()。然而,响应于防护指令102,处 理电路4将链接寄存器22中的该地址的目标域值T设为值0,以指示函数 返回分支104应分支到存储器的次安全区域中的指令。当函数返回分支指 令104被执行时,处理实际上切换到安全区域中的函数fred()。因此,在 第一确定(其基于函数fred()的第一指令的地址确定所选择域应该为安全 域)和第二确定(其基于目标域值确定所选择域应该为次安全域)之间将 存在不匹配。无论第一确定还是第二确定中的哪一个代表域选择以及哪一 个代表域检查,这种不匹配都将引起错误触发,这将防止安全函数fred() 的进一步处理。因此,这防止了黑客使用次安全代码来触发从安全代码到 另一个安全位置的分支。

图9示出了执行域检查可以是有用的另一个示例。在该情况下,安全 风险来自在寄存器R0中存储函数指针的次安全域中的函数john(),安全域 中的函数bill()然后用其调用函数。从bill()调用函数的分支指令300分支 到寄存器R0中指示的地址。如果函数指针已被设为安全位置,次安全代 码就可以触发安全代码切换到任意安全位置,即使该位置不是防护指令所 标记的有效安全入口点。因此,这会造成安全漏洞。

然而,通过包含将目标域值T设为0以指示函数指针应指向次安全域 中的地址的早期目标域设置指令302,编写安全函数bill()的程序员就可以 防备该种攻击。当响应于分支指令300而分支到函数指针位置时,如果黑 客已将函数指针设为安全值,那么域检查将确定如下的不匹配:由于该指 令处于安全区域中而确定的安全域与目标域值所指示的次安全域之间的不 匹配。因此,可以触发错误,并且可以防止安全漏洞。

虽然图8和图9示出了触发错误的情况,但在其他实施例中,如果在 函数指针位置存在防护指令以指示其为控制流的未获授权更改,就可以避 免该错误(参见以下的图14和图15)。

如图8和图9所示,分支指令之前的目标域值设置指令被用于将目标 域值设为所希望的值。目标域值设置指令可以是如图8所示的防护指令或 者如图9所示的另一种目标域设置指令。一般而言,安全代码的程序员应 在安全域中的控制流改变指令之前的程序代码中包含目标域值设置指令, 以确保控制流改变指令正确地起作用。

目标域值T对于其他目的以及域检查和域选择而言可以是有用的。在 图10和图11中示出了一个示例。该示例涉及函数调用和函数返回。通常 会使用第一控制流改变指令来调用上述函数bob()、joe()等,该第一控制流 改变指令将函数返回地址放入链接寄存器22并分支到与将被调用的函数 的第一指令相应的地址,然后第二控制流改变指令会将处理返回到该函数 返回地址。然而,如果函数是从安全域被调用并且将在次安全域中被执 行,那么返回地址可能需要对次安全代码隐藏。因此,伪返回地址可被存 储在链接寄存器中。例如,伪返回地址可以是图2所示的保留范围70的 地址之一。实际返回地址可以被保存到安全堆栈30用于在从该函数调用 返回时在安全域中进行访问。

为了使得更容易确定伪地址还是实际返回地址应被保存到链接寄存器 22,可以使用目标域值T。这在图10和图11中示出。图10示出了当执行 触发函数调用的第一控制流改变指令时的处理。在步骤350,判断下一个 指令是否为将返回地址放在链接寄存器中的类型的分支指令BL或BLX。 若是,在步骤360中判断处理当前是否处于安全域中,并且用于分支的目 标域值T指示该分支被期望切换到次安全域。如果不是这样的情况,那么 实际返回地址在步骤365中被存储在链接寄存器22中。然而,如果在步 骤360中,处理处于安全域中,并且目标域值T指示处理被期望切换到次 安全域(T=0),那么在步骤370,伪返回地址被存储在链接寄存器22 中。在步骤380,实际返回地址被保存到安全堆栈。无论哪个地址被保存 到链接寄存器,该方法然后都继续到步骤390,在该步骤中处理分支到目 标地址并且函数然后被处理。然后针对目标地址处的指令的域选择和检查 将如图5所示地继续进行。在图10的步骤360,目标域值使得能够比基于 目标地址进行判断的情况更快地确定是伪返回地址还是实际返回地址应被 保存在链接寄存器中。

最终,将遇到另一个控制流改变指令(图11的步骤400)。在步骤 410,检查目标地址在步骤410是否为伪地址。若否,处理则在步骤420 分支到控制流改变指令的目标地址,因为该指令是不是函数返回的正常控 制流改变指令,或者是其目标地址为存储在链接寄存器中的实际返回地址 的函数返回。另一方面,如果在步骤410确定目标地址为伪地址,那么在 步骤430处理切换到安全域。在步骤440从存储器的安全区域40中的安全 堆栈取回实际返回地址。然后,在步骤450处理分支到实际返回地址,然 后域选择和检查继续如常。

图12示出了目标域值可以是有用的另一个示例。当调用函数时,有 时调用函数有必要通过堆栈将函数自变量传递到被调用函数。如果函数调 用是从安全域作出,那么函数自变量应被存储在安全堆栈30还是次安全 堆栈32将取决于被调用函数是在安全域还是次安全域中被执行。如图12 所示,确定哪个堆栈用于传递函数自变量可以使用目标域值T而作出。使 用目标域值T使得能够比利用存储器保护单元65检查哪个区域与代表被 调用函数的位置的目标地址相对应的情况更快地确定目标域。图12的确 定可以由处理电路在硬件中执行,或者由处理电路所运行的代码在软件中 执行。

至此示出的示例已说明了在单个域为具体控制流改变指令的允许域的 环境下的域检查。然而,在一些情况下,可能希望使若干域为允许域。图 13示出了这样的一个示例。图13对应于图9所示的情形,但在该情况下 函数reg()包含分支指令300,该分支指令300取决于由次安全函数mary() 放入寄存器R0的值,有时应返回到次安全域并且在其他时候应切换到安 全域中的受信任函数alice()。利用上述技术(在该技术中目标域值设置指 令302设置寄存器R0中的函数指针的目标域值,以指示次安全域为期望 的目标域),当mary()将寄存器R0设为安全位置时,将触发错误。在该 情况下,在执行分支指令300时,目标域值将指示次安全域为所选择域, 而在分支到函数alice()时,MPU65将确定安全域为所选择域。如果该具 体分支是合法的,则希望在该情况下避免触发错误,但仍保护免于这种类 型的未获授权的切换。

图14和图15示出了可以解决这个问题的方式。对于一些程序指令, 系统可以确定多个域为允许域,使得无论分支指令300之后的行为如何, 都允许域切换。然而,为了保护免于未获授权的切换,系统可以要求分支 指令300之后的第一指令为防护(GUARD)指令。

在图14的示例中,域选择是基于目标域值的,而域检查是基于由 MPU65针对一地址而确定的区域的。对于防护指令,MPU65确定安全域 和次安全域二者为允许域。因此,在分支300之后,处理将切换到次安全 域,因为目标域值T被设为了0。然而,对于alice()中的防护指令306,基 于第一确定的域检查选择安全域和次安全域二者为允许域。因此,实际域 为次安全域,并且这与允许域之一相匹配,因此不存在错误。类似地,对 于受安全代码控制的到alice()的分支,目标域值将被设为1,使得在该分 支之后,系统在安全域中执行。因此,alice()既可以从安全代码也可以从 次安全代码被访问,并且分支300可以正确地切换到安全代码和次安全代 码二者。如果分支300导致切换到安全区域中的程序指令而不是防护指 令,则会触发错误。因此,仍可以避免到任意安全位置的未获授权的切 换。

在图15所示的另一个示例中,域检查是基于目标域值,而域选择是 基于指令地址所对应的存储器区域。在该情况下,响应于分支指令300, 次安全域和安全域二者都被选择为用于目标地址处的指令的允许选择域 (无论目标域值为何值)。在分支到alice()中的防护指令306时,MPU65 将确定安全域为所选择域,该域将与来自域检查的允许域之一相匹配。倘 若在目标位置存在防护指令306,就不会触发错误。

因此,无论域选择和域检查中的哪一个使用目标位,系统都可允许从 安全域到受次安全域所设置的地址控制的安全位置的一些合法切换。需要 防护指令来确认这样的切换。通常,当已处于安全域中时,不需要防护检 查,因此,为了确保执行防护检查,系统可以在执行目标域值具有值0的 存储器的安全区域中的分支指令300之前切换到次安全域。如果分支切换 到安全域,则分支将看起来好像是来自次安全域的,因此在目标地址将需 要防护指令以避免错误。

本申请的主题涉及在共同转让的同时待决的美国申请号13/368,419和 英国专利申请号1217531.1中论述的主题,这两个文件的全部内容通过引 用结合在此。

虽然已参照附图详细说明了本发明的说明性实施例,但应理解的是本 发明不限于那些精确的实施例,并且本领域的技术人员可以在不脱离如权 利要求所限定的本发明的范围和精神的情况下作出各种更改和修改。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号