针对运行已验证软件的硬件的端到端安全性的制作方法

文档序号:12513061阅读:233来源:国知局
针对运行已验证软件的硬件的端到端安全性的制作方法与工艺

当用户向远程服务(例如,基于云的服务)提交个人数据时,不能保证个人数据将保持安全,或者甚至不能保证该服务将产生正确的结果。最多,服务可以具有隐私策略并且在数据泄露的情况下限制服务的责任。然而,最近的标题已经提供了操作系统、库或应用(例如,软件应用)的脆弱性如何使得个人数据能够被访问的示例。



技术实现要素:

提供本发明内容以便以简化的形式介绍将在以下具体实施方式中进一步描述的一些概念。本发明内容不旨在标识所要求保护的主题的关键或必要特征;也不用于确定或限制所要求保护的主题的范围。

已验证软件系统可以在安全硬件(例如,可信硬件)上执行。在被执行之前,软件系统的属性可以被验证为符合软件规范。证明软件系统的身份的第一凭证可以被发送给外部应用。由安全硬件的提供方(例如,制造商)签名的第二凭证可以被发送给外部应用。第二凭证可以证明安全硬件的身份。以这种方式,可以在低级(例如,汇编语言级)验证作为整体的系统(例如,完整软件栈),并且然后将其引导到安全硬件并由安全硬件执行以提供安全系统。第一凭证和第二凭证可以使得外部应用能够以如下方式与软件系统的软件应用通信:发送给软件应用或从软件应用接收的消息被加密并且可以由外部应用和软件应用解密,但是不能由其他实体解密或修改。

附图说明

参考附图描述详细描述。在附图中,附图标记的一个或多个最左边的数字标识附图标记首次出现的附图。不同附图中的相同的附图标记指示相似或相同的项目。

图1是根据一些实现的包括规范翻译器的说明性架构。

图2是根据一些实现的包括应用的说明性架构。

图3是根据一些实现的包括可信增量(TrInc)应用的说明性架构。

图4是根据一些实现的包括已验证软件栈(例如,系统)的说明性架构。

图5是根据一些实现的在安全硬件上执行的已验证软件的说明性架构。

图6是根据一些实现的包括离线和运行时的说明性架构。

图7是根据一些实现的包括从软件应用接收公钥的示例过程的流程图。

图8是根据一些实现的包括执行已经被验证为符合软件规范的软件系统的示例过程的流程图。

图9是根据一些实现的包括执行软件系统的已验证引导的示例过程的流程图。

图10是包括已验证软件系统的说明性架构。

具体实施方式

服务的软件代码的正式验证可以提供服务与正式规定的安全标准精确匹配的数学保证。遗憾的是,尽管软件验证可以提供关于软件代码的可信赖性的有力保证,但是计算成本可能如此高,以至于服务提供方可能无法执行其整个系统的软件验证。因此,服务提供方最多可以提供关于被大量未验证软件代码包围的、用高级语言编写的小程序的有力保证。例如,已验证传输层安全协议实现可以依赖于未验证操作系统和未验证软件库。作为另一示例,针对公钥加密系统(例如,RSA或类似系统)的机器检查的正确性证明可以假定实现公钥加密系统、对应运行时库和操作系统的加密库的正确性。作为另一示例,依赖于可信汇编代码的微内核可以不对应用级语义的正确性进行声明。因此,服务可能不能执行服务的软件代码的完整形式验证,并且因此可能不能提供服务与正式规定的安全标准精确匹配的数学保证。

本文中所描述的系统和技术可以用于执行已经被验证为端到端安全的应用,使得验证能够覆盖可以被执行的所有软件代码(“代码”),例如,已验证代码不仅包括应用,还包括操作系统、库(运行时库、程序库、动态库)和可以执行的驱动器。因此,在一些情况下,不需要假定在一个或多个服务器上执行的软件的任何部分是正确的。经历验证的代码是被执行的汇编代码,而不是可以编写代码的一个或多个任何高级语言。验证过程可以假定硬件是正确的,但不对编译器的正确性或代码的运行时执行进行假定。验证过程因此可以证明(demonstrate)整个系统实现代码的高级抽象状态机的功能正确版本。验证过程可以证明安全远程等效性,例如,远程用户可以建立到其输出不能与高级抽象状态机的输出区分开的代码的安全通道。

验证在一个或多个服务器上执行的代码在功能上正确并且证明远程等效性可以使得验证过程能够为整个系统的行为提供完全的规范和证明,详细描述系统(例如,软件代码和硬件)将在每种可能的情况下如何表现。证明远程等效性可以包括(i)证明属性的功能正确性和(ii)非干扰的证明,其涉及证明代码的关系属性(例如,关于具有不同输入的相同代码的两个运行如何彼此相关的属性)。此外,可以加强远程等效性以经由可信计算来提供安全远程等效性(例如,如由可信计算组规定的,可信计算组是开发和发布用于由行业实现的规范的国际行业标准组)。例如,可以使用诸如可信平台模块(TPM)的安全硬件来证实(例如,经由证明)公钥对应于私钥,私钥仅对在一个或多个服务器上执行的代码已知。远程用户可以使用公钥来创建到代码的安全信道,从而实现和与代码的抽象状态机的直接通信相称的安全性。将证明与完全验证的代码组合因此可以提供端到端安全性的极高保证。

与使用传统技术相比,本文中所描述的技术和系统可以使得软件开发者能够以适度的开发人员努力来开发可验证安全应用。例如,传统技术通常可能需要几十个人花几年来验证单个软件层,因此使用传统技术来验证完整软件栈(例如,应用、操作系统、驱动器等)可能在计算上是禁止的。为了减少开发者努力,本文中所描述的技术和系统可以用于执行系统软件的快速、自动化、端到端软件验证。术语“软件栈”是指整个软件系统,例如,诸如操作系统、设备驱动器、软件库、应用以及其间的任何层。

为了在汇编级正确地验证代码(例如,通过适度的开发者努力),软件开发者可以使用本文中所描述的两个新工具。首先,规范翻译器可以使得软件开发者能够用高级语言有效地编写规范,并且然后验证对应汇编代码满足规范,因为规范翻译器可以将高级规范(例如,被表达为状态机)翻译成低级规范。第二,将以高级语言的可验证代码编译为可验证汇编语言的编译器可以用于将代码和对应证明从高级语言翻译为低级汇编代码(或机器代码)。这样的编译器可以使得软件开发者能够快速地编写和检查高级代码并且证明与可执行汇编代码相关联的属性。例如,针对整个系统(包括应用、库、驱动器和操作系统)(或其任何子集)的软件可以被编译成由可验证汇编代码组成的单个程序。验证整个系统代码(例如,作为整体)的正确性,使得在整个系统代码中没有未验证的代码,并且在系统的不同部件之间没有未验证的间隙。作为间隙的示例,假定第一部件X被描述为执行Q,并且第二部件Y被描述为使用进行Q的另一部件(X)来执行R。如果X表示的Q与Y表示的Q是不同的东西,则Y执行R的Y的保证不能成立,从而产生间隙。验证过程验证在系统的两个(或更多)部件之间没有未验证的间隙。

此外,验证过程验证系统的每个部件不能破坏系统的另一部件的规范。例如,应用可以被验证为不破坏操作系统的存储器管理子系统,并且操作系统的存储器管理子系统可以被验证为不破坏应用。

每个可用作独立服务的若干软件应用被提供作为可验证软件代码的示例。例如,描述了一种公证(notary)应用,其用于向对象(例如,文件、文档等)安全地分配逻辑时间戳以使得它们可以最终被排序。公证应用包括如下状态:状态包括单调递增计数器并且通过递增计数器、签名(例如使用签名)将计数器值与请求链接的语句以及用语句和签名进行回复来对公证请求进行响应。其他三个应用包括密码散列器、用于由多个用户使用的可信计数器、以及差异隐私数据库,差异隐私数据库最大化对数据库的查询的准确性,同时最小化标识数据库的记录的机会。

因此,下面参考附图描述技术和系统,技术和系统经由自动化完全系统验证在汇编级提供外部可检查的完全验证软件。还描述了用于构建相对大规模的端到端已验证系统的示例工具、技术和软件工程原则的集合。此外,提供了用于经由关系属性的验证来证明汇编级代码的基于信息流的安全属性的示例方法和用于系统开发人员用于形式验证的示例技术。软件和硬件各自可以提供证明其相应的身份的凭证,以验证与软件的通信是安全的。

说明性架构

图1是根据一些实现的包括规范翻译器的说明性架构100。在一些实现中,架构100可以用于提供远程等效性和端到端验证。

远程等效性提供关于每个应用及其对应状态机之间的等效性的保证。例如,可以保证通过不可信网络与应用通信的远程设备接收与通过不可信网络与对应(例如,对应于应用)状态机通信的远程设备所接收的相同的消息序列。例如,公证应用的规范可以指示公证应用对单调增加的计数器签名。已知系统匹配该规范,则可以向远程设备提供如下保证:例如运行系统(i)不允许计数器回滚,(ii)不共享私钥,(iii)不提供针对除公证外的任何事物的签名的语句,(iv)正确地计算签名,(v)不易受缓冲器溢出、整数溢出或其他实现级漏洞的影响。

架构100可以使得远程设备能够建立到应用的安全信道。建立到应用的安全信道可以消除不可信网络干扰远程设备和应用之间的通信的能力。例如,公证应用的规范可以声明公证应用使用来自可信平台的随机性来计算密钥对,然后从可信平台获得公钥和应用的代码的证明。因此,接收证明的远程设备可以确定用对应私钥签名的公证由公证应用的代码在可信平台上生成,并且因此可以被认为好像用对应私钥签名的公证由与公证应用对应的状态机生成。

除了安全保证之外,在系统上运行的任何软件应用中不放置隐式信任。因此,每个软件部件(i)被验证为是安全的或(ii)在已验证沙箱环境中执行,已验证沙箱环境防止软件部件影响系统的其他部件的安全性。

另外,不是仅独立地验证系统中的每个部件,而是可以作为整体验证整个系统。通过这样做,系统的安全性可以避免关于系统的软件部件如何交互的不正确的假定。在用于生成要执行的软件的编译器中不放置隐式信任。因此,验证要执行的指令(例如,汇编代码),而不仅是验证将被编译以创建指令的高级源代码。

针对系统的代码可以用被设计为支持验证(例如,而不是以传统计算机语言)的语言来编写。当设计代码时,可以选择支持正确性(例如,而不是性能)的证明的算法和代码模式,以提供容易可验证系统。可以优化代码而不用担心优化可能引入错误,因为验证工具被设计为捕获可能由优化技术引入的任何错误。

已验证系统可以提供针对基于软件的攻击的安全性。例如,对手可以在已验证应用执行之前和/或在已验证应用终止之后在服务器上执行软件。对手可能损害服务器的固件、基本的输入/输出系统(BIOS)或外围设备(例如,网卡)。在一些情况下,系统可以假定中央处理单元(CPU)、存储器、芯片组和可信平台模块正确地表现,并且假定对手不发动物理攻击(例如,电探测存储器总线等)。

架构100可以包括高级规范102、规范翻译器104、低级规范106、验证器108、验证结果110、高级语言实现112、编译器114、汇编件语言实现116、汇编器118和机器代码实现120。例如,用户可以创建高级规范102和高级语言实现112。规范翻译器104可以将高级规范102(例如,有限状态机)翻译为低级规范106。

编译器112可以将高级语言实现112编译成汇编语言实现114。验证器108可以自动(例如,在没有人类交互的情况下)执行各种功能,诸如验证汇编语言实现116对应于低级规范106。在汇编语言实现114已经被验证器108验证为对应于低级规范106之后,汇编语言实现116可以由汇编器118转换为机器代码实现116形式的可执行代码。汇编语言是针对计算机或其他可编程设备的低级语言的示例,其中在汇编语言和由硬件处理器执行的机器代码指令之间通常存在一一对应的关系。

验证栈(例如,基于Floyd-Hoare或类似推理)可以用于证明代码的功能正确性。高级规范102和高级语言实现112可以使用被设计为可验证的高级语言来实现。高级语言可以具有内置的规范构造。验证器108可以是静态程序验证器,其可以用于验证用高级语言编写的软件程序的功能正确性。高级语言可以被设计为支持程序的静态验证。高级语言可以包括各种特征,诸如是命令式的(imperative)、顺序的、支持通用类、提供动态分配和归纳数据类型、并且具有内置的规范构造。高级语言规范可以使得用户能够规定前置条件、后置条件、框架规范(读和写集合)和终止度量。高级语言可以提供可更新的虚拟(ghost)变量、递归函数和类型,例如集合和序列。规范和虚拟构造可以由验证器108在验证期间使用,并且当编译器114正在创建汇编语言实现116时可以被编译器114省略。

在一些实现中,验证器108可以作为编译器114的一部分运行。编程器可以以类似于静态类型检查器的方式与验证器108交互,例如,当验证器108产生错误时,编程器可以通过改变高级实现112中的类型声明、规范或语句中的一个或多个来进行响应。验证器108可以自动填充低级证明细节。

编译器114可以采用与高级规范102对应的高级语言实现112并且自动(例如,在没有人类交互的情况下)将高级语言实现112翻译成可验证汇编语言实现116。汇编语言实现116可以使用中间验证语言(IVL)以用于描述要由推理引擎(诸如可满足性模理论(SMT)求解器)免除的证明义务。IVL可以包括如下验证引擎(例如,验证器108):其以汇编语言实现116作为输入,为证明义务生成验证条件(VC),并且将VC传递到推理引擎。可以使用验证器108在汇编级(例如,汇编语言实现116)验证针对整个系统的代码。高级语言实现112或编译器114中的任何错误可以由验证器108来标识。因为一些安全属性不能经由功能正确性来表达,所以描述用于验证代码的关系属性的技术(例如,高级语言实现112)。当验证结果110指示汇编语言实现116已经被验证为正确时,可信汇编器118可以用于将汇编语言实现116转换为机器代码实现120(例如,可执行代码)。

使用推理验证代码

验证器108可以使用某种类型的推理(例如,Floyd-Hoare推理或其他类似推理)来执行汇编语言实现116的验证。高级语言实现112可以用关于程序可以进入的状态的断言来注释,并且验证过程可以证明当程序正在运行时断言对于到程序的所有可能输入都是有效的。对于生成多个输出的程序,可以使用多个输出通过用前置条件注释输出方法来验证程序的规范,其在程序代码被执行的任何时候必须为真。

因此,为了使得验证器108能够验证汇编语言实现116,高级语言实现112可以规定一个或多个前置条件、后置条件、循环不变量或其任何组合。除了被包括在高级规范102中的前置条件和后置条件之外,还有高级语言实现中的前置条件、后置条件、循环不变性之外。

编写可信赖规范

为了使能系统的端到端验证,可以使用两种类型的规范,例如硬件规范和软件规范。对于硬件规范,规定可以执行的每个汇编指令,以使能低级验证。硬件规范描述了指令的期望(例如,对多个寄存器求和的ADD可以期望多个寄存器的求和不引起溢出)、以及指令对系统的一个或多个影响(例如,ADD将多个寄存器的和写回到目的地寄存器)。

软件规范可以包括对应软件应用的期望行为的抽象描述。抽象描述可以按照较低级库规范来模块化地编写。例如,针对公证应用的软件规范可以描述(i)公证应用的状态机如何进行以及(ii)在每种状态下允许的输出。为了说明,规范可以指示特定状态中的一个输出是被定义用于在公钥加密系统(例如,RSA)签名中使用的签名消息。

高级规范102可以使用规定由系统使用的那些特征子集的惯用类型的规范,例如,而不规定未使用的特征。例如,安全硬件(例如,可信硬件,诸如可信平台模块(TPM))可以具有数百页的相关联的文档。然而,使用可信硬件的功能的子集的特定系统可以规定可信硬件的功能的子集,而不规定在特定系统中未使用的可信硬件的功能。编写高级规范102以包括由系统使用的功能同时排除未使用的功能可以导致针对高级规范102的更小的大小(例如,与在包括未使用的功能的情况下相比),从而使能更容易和更准确的规范的人工审查。

可以使用各种附加技术来减少规范(例如,高级规范102)中的故障/错误。例如,可以更容易和更快地验证包括由系统使用的功能的更小规范。作为另一示例,以比实现代码更抽象的、声明性的方式编写的规范可以使规范错误不太可能发生并且当规范错误确实发生时更容易找到。

产生可验证汇编语言

为了在低级验证软件代码的同时使能快速、大规模软件开发,可以彼此验证规范和对应汇编语言。例如,高级规范102可以被翻译为低级规范106,高级语言实现112可以被编译成汇编语言实现116,并且验证器108可以验证汇编语言实现116如低级规范106规定地表现。这使得高级语言能够用于高级实现112而不信任编译器114并且不信任运行时环境(例如,其可以使用各种库、运行时部件、操作系统实用程序等)。

验证关系属性

除了功能正确性之外,验证器108可以验证应用不提供(“泄漏”)关于秘密数据(例如,要被保持隐私或被限制访问的数据)的信息,诸如私钥。不泄露关于秘密数据的信息的属性被称为非干扰。假定变量S表示应用内部的秘密数据,I表示到应用的公共输入。如前所述,语句O:=(S+S)+(I+I)满足功能正确性规范,例如even(O)。然而,输出O可以使得外部方(例如,未授权的程序)能够例如通过计算O/2-I来确定秘密S。在该示例中,秘密S被泄漏到外部。相反,语句O:=(S-S)+(I+I)满足even(O),但不提供关于输出O中的S的信息,因为存储在O中的值取决于I中的值,但是独立于S。为了验证程序不提供关于秘密数据的信息,验证器108可以分析程序的多个执行并且比较程序的执行的输出以确定输出取决于哪些值。假定公共输入I被传递给程序的所有执行,但是秘密S在程序的执行中是不同的。如果程序的所有执行产生相同的输出O而与S无关,则O独立于S并且程序不提供关于S的信息。如果程序的至少一个执行产生与程序的其余执行不同的输出,则程序可以提供关于S的信息。因此,可以通过证明当给定相同的I但不同的S时,程序的两个执行不产生不同的O,来证明O与S无关。在数学上,想法是,证明对于所有可能的执行对(称为每对L和R(用于左和右)中的两个执行),如果公共输入I相等但秘密S可以不同,则输出O可以相等,例如,当语句O:=(S-S)+(I+I)满足条件时,O:-(S+S)+(I+I)不满足条件(例如,反例,IL=IR=1且SL=2且SR=3)。

为了确定应用不暴露秘密数据,开发者可以用显式关系注释来注释代码。例如,xL可以写为left(x),并且xR可以写为right(x):

在该示例中,关系前置条件left(I)==right(I)指令验证器108确定在调用Test的任何地方是否IL=IR,并且关系后置条件left(O)==right(O)指令验证器108确定是否IL=IR=>OL=OR。对于大多数代码,验证器108可以利用现有的功能正确性注释,并且因此开发者可以不提供关系注释。例如,验证器108可以使用代码中的功能后置条件:

program ComputeIpChecksum(I)returns(O)ensures O==IpChecksum(I);

以确定如果IL=IR,则IpChecksum(IL)=IpChecksum(IR),因此OL=OR。

证明安全属性

要求(和验证)程序的输出独立于程序中的秘密数据可能对于大多数真实世界系统来说是太严格的(例如,不切实际和不必要的)条件。通常,程序可以允许秘密数据对输出的有限影响,诸如使用秘密密钥来对输出进行签名。针对这样的程序的安全策略可以明确地解密某些值,例如签名,使得签名可以被包括在输出中。

图2是根据一些实现的包括客户端、网络、应用和解密器的说明性架构200。架构200示出了已验证系统的结构,包括客户端202、网络204、应用206和解密器208。解密器208可以授权从秘密数据导出的所选择的输出的释放。应用的解密策略可以被表示为与由应用的规范规定的高级行为对应的状态机。客户端202可以跨网络204与(已验证)应用206通信。例如,客户端202可以通过网络204发送输入数据I。网络204可以丢弃、延迟、复制或者损坏输入数据I。网络204可以不访问应用206的秘密数据。应用206可以接收输入数据I的被损坏的版本I*,并且通过跨网络204发送输出O来进行响应。网络204可以损坏输出O并且向客户端提供被损坏的版本O*。

当计算输出O时,应用206可以调用解密器208策略一次或多次。每次调用解密器208时,应用206可以将秘密数据S、输入i和期望的解密输出d传递给解密器208。为了成功验证,根据规定d=StateMachineOutput(S;i)的状态机的解密策略,期望的解密输出d将等于输出。当验证器108执行静态验证并且确定满足状态机的解密策略时,解密器208产生应用206可以用作输出O的一部分的解密输出o。

在一些实现中,o可以等于d,使得解密器208在运行时期间无操作(no-op)(没有操作)。然而,解密器208无操作的信息可以不被公开给验证器108,使得可以公开oL=oR而不公开dL=dR。在一些情况下,例如,如果秘密数据S可以使用对d的暴力搜索(例如通过对公钥进行分解)来确定,则dL=dR可能表示SL=SR,这是不期望的。

安全应用示例

讨论了已验证安全应用(例如,被称为坚固(Ironclad)应用)的四个示例。针对每个应用的证明基于先前证明的低级库、驱动器和操作系统的证明。每个应用可以编译为经由诸如例如用户数据报协议(UDP)的协议与其他机器通信的独立系统图像。每个示例应用是有用的和完整的应用,其可能值得数据中心中的至少一个专用机器。对细粒度安全执行环境的硬件支持可以使能复用多个坚固应用。

公证应用

公证应用向文档安全地分配逻辑时间戳,使得文档可以被最终排序。在传统系统中,这种时间戳服务的用户假定机器正在执行正确的软件。本文中所描述的公证应用不需要这样的假定。

公证远程等效性。公证应用等效于如下状态机,该状态机具有以下状态:

·使用加密系统(例如,RSA)密钥生成算法根据从可信硬件读取的随机字节的第一连续序列来计算(PublicKey(公钥),PrivateKey(私钥))对。

·其中平台配置寄存器(例如,PCR 19)已经用密钥对的公共部分被扩展的可信硬件平台;以及

·被初始化为0的计数器Counter(计数器);

并且该状态机具有以下转换:

·给定输入(connect(连接),Nonce(随机数)),通过获取PCR 17-19上的引用Quote和外部随机数Nonce来改变可信硬件状态。输出是(PublicKey;Quote(引用))。

·给定输入(notarize(公证),Hash(散列)),递增Counter并且返回SigPrivateKey(OP-CTR-ADV||RFC4251Encode(Counter)||Hash)。

PCR是允许安全存储和报告安全相关度量的寄存器。用于公证应用的规范的一部分可以包括要在out_sig被解密之前被满足的谓词(其否则由于对秘密数据的依赖性而不能被输出):

datatype NotaryState=NotaryState_c(keys:RSAKeyPair,cntr:nat);

predicate NotarizeOpCorrect(in_st:NotaryState,out_st:NotaryState,in_msg:seq<int>,out_stmt:seq<int>,out_sig:seq<int>)

{

ByteSeq(in_msg)

&&out_st.keys==in_st.keys

&&out_st.cntr==in_st.cntr+1

&&out_stmt==[OP_COUNTER_ADV]

+rfc4251_encode(out_st.cntr)+in_msg

&&out_sig==RSASign(in_st.keys,out_stmt)

}

证明公证等效性可以包括以下各项的证明:(1)输入非干扰,(2)Connect程序的功能正确性,(3)公证程序的功能正确性和(4)输出非干扰。(1)输入非干扰:公证应用传递给解密器208的随机数和消息基于公共数据。(2)连接的功能正确性:应用正确地从随机性导出密钥,并且当可信硬件的PCR处于所需状态时,应用获得的可信硬件引用来自可信硬件。(3)公证的功能正确性:应用递增计数器并且正确地计算签名。(4)输出非干扰:写入不受保护的存储器仅依赖于公共数据和计算的状态机输出。

TRINC应用

图3是根据一些实现的包括TrInc应用302的说明性架构300。

被称为TrInc 302的可信增量应用概括了公证应用。TrInc 302维护每个用户的(例如,每个应用的)计数器,使得每个用户(例如,每个应用)接收其间没有间隙的连续值。TrInc 302是分布式系统中的通用工具,因为TrInc 302可以用于各种功能,诸如例如防篡改审核日志、拜占庭容错复制状态机、验证不可信文件服务器正确地表现等。TrInc 302可以包括用于使得能够创建计数器306的创建计数器304模块。计数器306可以包括N个计数器(其中N>0),诸如第一计数器308到第N计数器310。TrInc 302可以包括私钥模块312、公钥证书模块314、加密处理模块316、元计数器318和TrInc状态指示器320。

TRINC远程等效性。除了TrInc具有多个计数器(每个计数器具有元组(Ki;vi))和初始被设置为0的元计数器之外,TrInc应用302远程等效于如公证应用的状态机。代替公证转换,TrInc具有:

·给定输入(create(创建),K),

o设i:=meta_counter,

o增量mcta_countcr,以及

o设(Ki,vi)=(K,0)。

·给定输入(advance;i,vnew,Msg,UserSig),设vold=计数器元组i中的vi。

o如果vold<=vnew和VerifySigKi(vnew||Msg,UserSig),则设vi:=vnew且输出SigPrivateKey(OP-CTR-ADV||encodc(i)||encode(Vold)||encode(Vnew)||Msg)。

密码散列(“PASSHASH”)应用。密码散列应用可以使密码数据库的丢失无害。例如,攻击者可能会窃取数据库并且发动离线攻击。即使数据库被正确地散列和盐化,低熵密码也会使数据库变得脆弱。通过使用密码散列,散列密码的未授权访问不会损害安全性。

PASSHASH远程等效性。PassHash应用远程等效于以下状态机。状态由字节串Secret(秘密)组成,Secret被初始化为从可信硬件读取的前32个随机字节。给定输入(hash,Salt(盐化),Password(密码)),passhash应用输出SHA256(Secret||Salt||Password)。这里,SHA256仅用作散列算法的示例。应当理解,可以使用其他类似的散列技术来代替SHA。

基于该规范,在没有秘密的穷开心散列密码对于离线攻击者是无用的,对即使低熵密码的暴力猜测攻击也是不可行的。

差异隐私(“DIFFPRIV”)服务。差异隐私应用提供差异隐私服务,并且是具有更抽象规范的更大应用(例如,与TrInc等相比)的示例。差异隐私应用可以从贡献方收集敏感数据,并且允许分析者研究聚合数据库。差异隐私应用可以保证每个贡献方的差异隐私,例如,提供给分析者的答案不能与在省略贡献方的数据的情况下提供的答案区分开。如果对于任何一组答案S和差异为单行的任何一对数据库D1和D2存在P[A(D1)∈S]<=λ·[A(D2)∈S],其中隐私参数λ=eε,则算法A有差异地隐私,隐私为ε。

具有小的隐私参数的多个查询可以等效于具有参数的乘积(product)的单个查询。开始于向贡献方保证的隐私预算b=λ,具有参数λQ的每个查询Q除以预算b′:=b/λQ(例如,可以拒绝具有λQ>b的查询)。对于噪声计算,计算查询的灵敏度Δ,其是在单个数据库行改变的情况下,查询结果可以改变的最多量。分析者接收真实答案和从由Δ参数化的分布中得到的随机噪声值的和。可以使用仅包括有理数的噪声分布,因为可以使用指令集(例如,x86指令集)精确地采样噪声分布。

DIFFPRIV远程等效性。DiffPriv应用远程等效于具有以下状态的状态机:

·密钥对和可信硬件类似于公证应用被初始化;

·剩余预算b,实数;以及

·行序列,每个行由重复检测随机数和整数列值的列表组成;

并且包括连接到应用、初始化数据库、添加行和执行查询的转换。

灵敏度。用作规范的噪声计算公式中的灵敏度参数的值Δ可以是查询结果的实际灵敏度。例如,如果定义A(D)作为应用在数据库为D时计算的答案,则对于任何两个数据库D1和D2,|A(D1)A(D2)|Δ。

对于可验证性,可以使用Airavat类型查询,其中每个查询是将行转换为单个值的映射器、以及聚合结果集合的缩减器,使得仅缩减器影响灵敏度。分析者可以提供任意的映射器;DiffPriv可以提供针对单个缩减器和的灵敏度属性。DiffPriv应用可以获取RowMin(行最小)和RowMax(行最大)参数,以将每个映射器输出值修剪到某个范围。例如:

DiffPriv应用被验证为满足将缩减器输出灵敏度与在噪声生成中使用的D相关联的谓词。

完全系统验证

图4是根据一些实现的已验证软件栈(例如,系统)400的说明性架构。软件栈400包括一个或多个应用402、一个或多个公共应用404、标准库406、用户数据报协议/因特网(UDP/IP)408协议模块、以太网410协议模块、网络驱动器412、一个或多个数据类型414、散列算法416模块、可信硬件驱动器418、公钥加密系统420加密系统、BigNum(大数)库422(例如,用于执行加密功能)、CoreMath(核心数学)库424(例如,用于执行科学、工程或计算密集型计算)、和操作系统426(例如,已验证微内核)。在一些情况下,散列算法416可以使用安全散列算法(SHA)。当然,不同的实现可以使用其他不同的散列算法。应用402可以包括已验证应用428和未验证应用430。未验证应用430可以在已验证环境(例如沙箱)432中执行,已验证环境432防止未验证应用430恶意地伤害(例如,破坏)软件栈400的剩余部分,诸如已验证应用428、操作系统426等。

应用402可以包括PassHash、公证、TrInc、DiffPriv、另一应用或其任何组合。操作系统426可以包括延迟启动、IOMMU、分段、页表、另一操作系统实用程序或其任何组合。当计算机在可信状态下运行时,例如,已验证软件在可信硬件上执行时,加载未验证软件可能导致整个计算机的状态变得不可信。因此,计算机可以在可信状态和不可信状态之间切换。硬件的中央处理单元(CPU)可以提供硬件指令,其将存储器位置作为参数,重置硬件平台,原子地测量位于该存储器位置的未验证软件,将未验证软件扩展到计算机的PCR中的一个中,并且在硬件保护的环境中开始执行未验证软件。在硬件保护的环境中执行未验证软件的这个过程被称为延迟启动。作为延迟启动的一部分,CPU可以禁用对包含安全引导加载程序的物理存储器页的直接存储器(DMA)访问,禁用中断和硬件调试器以防止先前执行的代码重新获得控制,将PCR17到PCR23的动态寄存器重置为0,并且在保护模式下执行未验证软件。延迟启动可以提供类似于重新引导计算机(例如,从清洁状态(clean-slate)开始)的安全性优点,同时绕过完全重新引导的开销(即,外围设备保持启用,BIOS和引导加载程序不被调用,存储器内容保持完整,等等)。

软件代码可以包括注释,例如循环不变量、前置条件和后置条件,以使得能够验证软件代码。注释可以被视为构建到高级定理的引理。

为了说明针对系统400的端到端验证的步骤,描述了若干命题。为了便于理解,这些命题在下面用简单的英语简要说明。应当理解,实际命题可以采用高级语言实现112中的注释的形式。下面描述的命题是可以在验证系统400时使用的几个关键命题。

IOMMU配置。已验证应用(例如,坚固应用)可以配置输入输出存储器管理单元(IOMMU)以将存储器划分为设备可访问和应用专用的私有存储器,使得非设备操作访问应用专用的私有存储器。汇编语言指令规范可用于确定非设备存储器操作仅访问已经被硬件的设备排除向量(简单IOMMU)保护的应用专用的私有存储器。

一些中央处理单元(CPU)可以提供诸如用于测量的动态信任根源(DRTM)的特征,也称为延迟启动。DRTM可以将CPU重置为已知状态,存储由指令的引数(argument)指向的存储器内代码的测量(例如,散列代码),并且跳转到该代码。在延迟启动之后,硬件可以提供CPU的软件程序控制以及64千字节(KB)的受保护存储器。为了使用大于64KB,软件程序可以首先基于与IOMMU的配置相关联的规范来扩展IOMMU的保护。在扩展IOMMU的保护之后,程序可以满足用于汇编语言指令访问64KB区域外部的存储器的前置条件。

设备看不到秘密数据,例如,只有非秘密数据可以被传递到设备。汇编语言指令规范可以指示将数据存储到设备可访问存储器,即IOMMU允许设备访问的存储器只能存储非秘密数据O(例如,OL-OR)。更具体地,左和右执行可以生成将相同值存储到相同地址、模定时和活性的相同的设备序列。非正式地,活性(liveness)是在系统或算法中“最终发生好的东西”的要求(即,系统“进步”)。数据库的最终一致性是活性属性的示例。

为了证明OL=OR,可以用关系注释来注释实现代码的输入路径和输出路径。输入路径和输出路径可以包括应用事件循环和网络栈。例如,以太网、互联网协议(IP)和UDP层可以维护分组上的关系属性。

TPM中的密钥。应用可以将公钥正确地扩展到可信硬件的PCR(例如,PCR 19)中。私钥可以使用随机数生成器(例如,TPM随机性)来生成,并且从不离开可信硬件平台。

证明。应用可以在将其公钥扩展到PCR之后生成正确的可信硬件证明。

推论2-安全信道。如果客户端接收到公钥和证明,并且已验证PCR代码值(例如,PCR 17、PCR 18)与已验证应用的PCR代码值匹配,并且已验证PCR数据值(例如PCR 19)匹配公钥,并且凭证(例如,证书、令牌等)示出证明来自可信硬件提供方,则客户端可以使用公钥来建立直接到已验证应用的安全信道。

加密库

散列。散列算法416可以符合各种标准(例如,FIPS 180-4和FIPS 198-1)。

引理11——加密系统操作。公钥加密系统420可以使用来自可信硬件的连续随机性(例如,未被选择性地采样)来生成密钥,并且通过素性测试(例如,Miller-Rabin素性或类似测试)。公钥加密系统420可以包括加密、解密、签名和验证(包括填充)的命令,并且可以产生符合标准(例如,PKCS 1.5和RSA标准)的字节数组。

对于诸如散列函数的一些类型的加密原语,验证器108可以验证功能正确性。从RFC 2313导出的加密系统规范(例如RSA规范)将加密和签名操作定义为由理想整数构成的密钥上的模幂运算。密钥生成规范可以使用从两个随机素数导出的密钥。BigNum 420库可以用于实现加密原语。BigNum 420库可以使用32位字的数组来实现任意精度的整数,提供用于公钥加密系统(例如RSA等)的操作,诸如除法和按模计算。BigNum 420库可以包括BigRat(大有理数),其将提供的操作扩展到有理数,其可以用于差异隐私。

BIGNUM/BIGRAT正确性。每个BigNum/BigRat操作可以产生表示正确的无限精度整数或实数的值。

在一些实现中,编译器114可以不被包括在可信计算基础(TCB)中。如果编译器114不是TCB的一部分,则汇编语言实现116可以由验证器108验证。验证器108可以使用由编译器114产生的若干不变量,诸如类型安全性、数组边界安全性和传递栈安全性。

类型安全性。可以根据由高级语言使用的类型系统来验证每个值和堆对象的内容以准确地表示期望的内容,使得对每个值和堆对象的操作不会引起运行时类型错误。

数组边界安全性。数组操作可以使用在数组边界内的索引。

传递栈安全性。当调用特定程序时,堆栈具有足够的堆栈空间剩余用于由特定程序和特定程序可能调用的任何附加程序调用的堆栈操作。堆栈可以包括用于存储关于程序的信息的数据结构。例如,当程序调用子程序(例如,子例程)时,可以在调用子程序之前将该程序的快照存储在堆栈中。例如,快照可以包括由程序使用的变量的值等。当子程序已经完成执行时,可以使用存储在堆栈中的快照来恢复程序的状态,使得程序的执行可以继续。术语“堆栈”是指存储在数据结构中的一个或多个实体的集合。对集合的操作可以包括用于向集合添加实体的CALL操作(也称为推送)和用于从集合中去除实体的RET操作(也称为弹出)。推送和弹出操作之间的关系使得堆栈可以被实现为后进先出(LIFO)数据结构。在LIFO数据结构中,添加到结构的最后实体可以是要去除的第一实体。这等效于在顺序集合中仅在存储集合的数据结构的一端处(其被称为堆栈的顶部)执行推送和弹出操作。

即使高级语言是类型安全的语言,验证器108也可以不假定编译器114保留类型安全性。因此,验证器108可以通过为表示高级语言值的数据结构建立类型不变量来验证汇编语言级的类型安全性。例如,数据结构中的指针可以指向期望类型的值,并且任意整数不可以用作指针。这种类型不变量可以在整个汇编语言代码中维护,并且可以存在于循环不变量、前置条件、后置条件或其任何组合中。因此,外部汇编语言类型检查器可以不用于检查编译的汇编语言实现116。相反,单个验证过程(例如,由验证器108执行)可以用于手动编写汇编语言代码和编译代码(例如,汇编语言实现116)。

高级属性保留。给定高级语言前置条件,每个程序证明输出堆栈状态和寄存器满足高级语言后置条件。编译器114可以维护高级语言注释,诸如前置条件、后置条件和循环不变量。此外,编译器114可以将高级注释连接到低级堆栈和寄存器值,使得对堆栈和寄存器值的操作满足与高级语言实现112和对应高级规范102相关联的正确性定理。

操作系统不变量。可以维护操作系统数据结构不变量。

垃圾收集正确性。操作系统426的存储器管理器可以创建符合高级语言的语义的高级语言的对象表示。操作系统426的垃圾收集器可以维护正确的对象数据,并且可以不留下悬垂指针,即使垃圾收集器在存储器中移动对象。垃圾收集器可以回收存储在存储器中的垃圾,例如,已经分配但不再使用的存储器中的对象。例如,如果系统不具有指向存储器的已分配部分的任何指针,则存储器的已分配部分可以由垃圾收集器回收以供另一程序使用。

图5是根据一些实现的在安全硬件上执行的已验证软件的说明性架构500。可信硬件502可以包括提供基于硬件的信任根源的硬件,例如可信平台模块(TPM)。例如,可信硬件502可以以能够经由证明协议被安全地报告给远程方的方式在引导周期期间在可信硬件502上记录与软件执行相关联的信息。可信硬件502可以以在平台配置寄存器(PCR)中维护的散列链的形式来维护关于当前引导周期的记录。在可信硬件502上执行的软件应用可以经由扩展操作向PCR添加新信息。扩展操作可以更新PCR以包括与新信息级联的先前PCR值的散列。可信硬件可以保持不离开可信硬件并且可以通过对PCR中的值进行签名来用于证明可信硬件的当前状态的私钥552(例如,RSA密钥)。可信硬件可以证实对应公钥由真实硬件可信硬件保持,以防止软件的假冒。

架构500可以使用延迟启动,也称为用于测量的动态信任根源(DRTM)。为了帮助从安全操作系统和管理程序的可信计算基础(TCB)中去除引导代码,中央处理单元(CPU)可以提供将CPU重置为已知状态的指令,在可信硬件中存储由指令的引数指向的存储器中代码的测量(散列),并且跳转到该代码。该“延迟启动”或DRTM允许不可信软件在新重置的CPU上引导、配置设备、加载软件、并且然后可验证地引导可信软件。CPU指令可以使CPU进入良好地规定的重置状态,使设备和存储器保持原样。CPU指令可以禁用中断,配置CPU的设备排除向量(DEV)和基于位向量的IOMMU,以防止设备访问存储器的一部分,将可信硬件的PCR 17重置为固定值,以及用存储器的一部分的散列扩展寄存器。最后,执行可以跳转到代码。因此,软件应用可以利用在其执行之前的任何引导,同时保护软件应用不受其他软件应用和其他设备的影响。以这种方式,可信硬件可以向远程验证器证明该代码在受保护的环境中运行。

硬件502可以执行已验证低级代码506(例如,微内核或低级操作系统)的已验证引导504。硬件502可以执行和记录已验证低级代码506的已验证启动508。已验证低级代码506可以包括已验证设备接口510、已验证中断处理程序512、已验证线程514和已验证垃圾收集器516。已验证设备接口510可以提供各种类型的输入/输出(I/O)以使得架构500能够与其他设备通信。当接收到中断时,已验证中断处理程序512可以用于执行各种动作。已验证线程514可以是已验证微内核或其他低级操作系统的一部分。已验证垃圾收集器516可以收集不再使用(例如,不再被引用)的并且可以被回收和重新使用的存储器的已分配部分。

已验证高级代码518(例如,应用、实用程序、库等)可以在已验证低级代码506之上执行。已验证高级代码518可以包括散列算法(例如,SHA或类似算法)模块520、用于修改位和数组的代码522、用于执行加密系统(例如,RSA)加密和签名的代码524、大整数模块526、数学模块528、可信硬件驱动器530、UDP/IP模块532、以太网模块534和网络驱动器536。应当理解,散列算法模块520仅是可以使用的一种类型的散列算法的示例,并且其他实现可以使用其他类型的散列算法。

各种应用可以在已验证高级代码518之上执行,诸如可信部件538(例如TrInc等)、密码保险库(vault)540和隐私数据库542(例如,提供差异隐私)。

在运行时,应用544可以向用户(或第二应用)提供公钥546和凭证548(例如,证书、令牌等)。凭证548可以由可信硬件502签名(例如,使用散列550)以示出公钥546由具有特定散列的二进制文件(例如,对应于整个软件系统)提供。用户(或第二应用)可以检查散列550与先前观察到的散列(例如,在离线步骤中观察到的散列)匹配。可信硬件502可以提供由硬件提供方签名的凭证548,其指示公钥546由可信硬件平台(例如,可信硬件502)排他地保持。如果凭证548有效并且散列550正确,则包括应用544的已验证(例如,可验证安全的)二进制文件创建公钥546,并且接收方(例如,用户或第二应用)可以信任地交互并且信任用公钥546签名的消息来自应用544,并且信任发送给应用544的用公钥546加密的消息将仅被应用544看到。

因此,在运行时,用户(或第二应用)信任核心硬件502未被篡改但不需要信任与硬件502相关联的软件或外围设备。来自应用544的消息可以用应用544的公钥546签名。可信硬件502可以证明公钥546来自具有加密散列代码(例如,SHA1、SHA256等)的可执行体,加密散列代码应当匹配先前获得的(例如,从离线步骤)散列代码。可信硬件502的提供方可以证实公钥546由硬件502保持,例如可信硬件平台。

被包括在已验证低级代码506中的操作系统(例如,图4的操作系统426)可以被修改和/或扩展以消除未验证引导代码并且提供面向安全性的存储器模型。操作系统还可以可验证地遵守在较高级执行的应用的安全规范。例如,传统操作系统可以取决于用于系统配置(例如,设备枚举,设备配置、存储器分段、存储器分页等)的未验证引导加载程序和未验证的基本输入/输出系统(BIOS)。在一些实现中,可以提供已验证BIOS和引导加载程序。在其他实现中,不是验证现有BIOS和引导加载程序,而是可以使用延迟启动(例如,DRTM)来可验证地将架构500置于安全状态,并且开始执行已验证低级代码506和已验证高级代码518。虽然延迟启动简化了引导过程,但是延迟启动可以使用已验证代码在启动之后来配置CPU。

在延迟启动之后,应用可以具有对CPU和存储器的一部分(例如,64kb)的控制。然而,在延迟启动之前运行的代码在理论上可能替换设备固件或恶意配置设备直接存储器访问(DMA)缓冲器。基于CPU的输入/输出存储器管理单元(IOMMU)可以保护存储器的该部分不被未授权实体访问。

ESP可以是指向堆栈顶部的寄存器。EAX可以是累加器寄存器。在x86处理器架构的示例中,存储器地址可以用被称为段和偏移的两个部分规定。段可以规定由系统分配的存储器块的开始,并且偏移可以是到存储器块中的索引。段值可以存储在段寄存器中,诸如包括当前指令的段的CS寄存器和可以包括堆栈段的SS寄存器。可以使用隐式或显式段描述符来访问存储器。段描述符可以包括基地址和限制。如果尝试使用具有基址B和限制L的描述符来访问存储器地址M,则被访问的实际存储器地址是B+M,除非B+M>L。在后一种情况下,可能发生段故障。对堆栈的访问(例如,经由推送和弹出指令)可以使用SS段,并且对代码的访问(例如,以读取下一指令)可以使用CS段。

架构500的形式规范可以规定在引导到已验证低级代码518时,EAX可以指向已验证低级代码518,ESP可以包括EAX+64KB,并且SS和CS可以描述平坦段。DEV可以被配置为保护EAX和ESP免受外部设备的影响。EAX模式是针对加密块密码的操作模式,其被设计为同时提供具有两遍方案的消息(认证加密)的认证和隐私,一遍用于实现隐私,一遍用于针对每个块的真实性。

惯用规范可以描述如何导航存储器和保护存储器中的大部分。例如,满足规范可以提供应用可以访问的存储器的上限和下限覆盖存储器的更大部分。DEV是一种IOMMU,其可以被配置为防止设备读取或写入规定的存储器范围,诸如(EAX,EAX+64KB)。

惯用表示规定可以不描述PCI或DEV的所有行为,而是可以描述特定操作序列的效果;例如,而不是示出到特定目的地的完整路线图(例如,具有所有可能的路径)和逐步指向。尽管硬件502可以支持其他配置,但是尝试使用硬件502的代码可能无法验证。使用惯用规范可以降低规范的复杂性,使得规范更快和更容易验证。例如,x86分段的惯用规范可以规定段描述符可以具有任何基址,但是长度为232并且特权级(DPL)为0。

微内核或操作系统规范可以规定段访问的效果,包括用于CALL和RET指令的SS。CALL和RET指令影响堆栈,例如,CALL将先前的指令指针值推送到堆栈上,并且RET从堆栈弹出存储的指令指针值,以知道应该在何处继续执行。CALL和RET都可以经由SS访问存储器。

规范还可以规定描述符影子缓存行为;例如,当使用选择器寄存器而不是存储器中的描述符时,段行为可以取决于缓存在处理器中的阴影值。这样的规范使得能够验证在延迟启动之后,软件代码访问正确的存储器区域,并且未授权的应用和/或设备不能篡改(例如,访问)存储器区域。例如,在一些实现中,DEV可以被配置为向已验证操作系统(例如,微内核)暴露128MB的受保护存储器,并且存储器的剩余部分可以用于到设备的I/O。

为了提供关于应用的信息流保证(例如,为了证明应用不能确定秘密数据),可以定义已验证代码与外部世界之间的边界(例如,未验证代码)。例如,由DEV保护的存储器区域可以被视为在内部,而其他存储器区域(例如,I/O和存储器映射的设备区域)被视为未验证,因为恶意设备可以在任何时间读取或写入存储器,并且即使良性设备(例如,网卡)也可以通过设计将数据暴露给未验证代码和未验证设备。已验证和未验证代码之间的边界可以在汇编代码级规定。

对于可以被证明由DEV保护的存储器区域,规范可以规定加载和存储的标准模型,例如,经由存储指令写入存储器的值以后可以经由加载指令被读回。相反,当读取和写入未被DEV保护的存储器时,没有这样的保证,因为理论上恶意设备可以在任何时间改变存储器中的值。规范可以规定对不可信存储器造成可见影响的软件指令具有被提供给指令的引数是公共的前置条件。例如,存储指令的引数(例如,地址和值)可以具有引数是公共的前置条件。作为另一示例,加载指令的地址引数可以具有引数是公共的前置条件,因为其他设备可以能够观察正被访问的地址。公共值可以经由来自不可信存储器的负载,代码中的常数值或由可信应用专用策略(例如,使得加密的秘密被传输的策略)解密的值来获得。不是源自外部世界的任何值(例如从用于生成密钥的可信硬件获得的随机值)可以不被标记为公共的,并且因此除了经由解密策略之外,可以不离开系统。

因为信息流可以在加载和存储指令上在机器代码级执行,所以针对网卡或其他网络层的正确性的规范可以不用于可信计算基础(TCB)。相反,架构500可以重复证明与网络的交互产生公共数据。例如,驱动器可以通过网络栈传播从网卡接收的公共输入,其中分组由以太网、IP和UDP层处理。每个层可以证明该层没有用非公开数据污染分组,使得应用最终接收到公共分组流。当传输时,网络栈实现的顶部(例如,UDP层)可以请求从应用接收的数据已经被规定为公共数据。这允许网络栈实现证明提供给IP层的数据是公共的,等等,直到网络驱动器最终证明网络驱动器存储到不可信存储器的个体字是公共数据并且因此安全释放。

为了使得应用能够提供远程证明并且获得安全随机性,使用惯用规范用于可信硬件和已验证可信硬件驱动器530。可信硬件规范可以包括驱动两级(例如,低级和高级)模型的可信硬件的状态机的伪指令。在低级状态机中,指令可以一次一个字节地向数据缓冲器写入或读取,并且执行使用数据和控制寄存器加载的命令。在更高级的状态机中,命令执行可以根据可信硬件语义来解释命令。例如,可以被惯用规定的命令可以包括可信硬件命令,诸如扩展(例如,向PCR添加数据)、对象独立授权协议(OIAP)、LoadKey(例如,将密钥加载到可信硬件中)、Quote2(例如,执行引用操作)和GetRand(例如,随机数生成器)。

扩展、OIAP、LoadKey和Quote2可以被包括在标准库(例如,图4的标准库406)中,并且可以用于证明由已验证应用保持的私钥将私钥视为安全数据(例如,通过使得不能够确定私钥)。GetRand命令可以提供用于生成加密密钥的强随机性的源。规范可以规定可以由GetRand依序地显示的随机值流。例如,用于创建使用随机输入的公钥(例如,RSA)的库例程的规范可以从由GetRand提供的随机值流依序地绘制,从而防止恶意随意选取。

图6是根据一些实现的包括离线操作602和运行时操作604的说明性架构600。离线操作602可以包括验证软件系统(例如,软件栈)符合对应系统规范。运行时操作604可以包括使得外部应用606或用户608能够验证在硬件(例如,可信硬件)上执行的软件系统是安全的和不受损害的证明。例如,运行时操作604可以使得外部应用606(或用户608)能够向已验证软件系统的应用发送消息和从已验证软件系统的应用接收消息,而没有其他方(例如,其他应用或其他硬件设备)能够访问被发送和接收的消息的内容。例如,可以使用使得应用和外部应用能够解密消息的密钥来对发送和接收的消息加密。其他实体(例如,其他软件或其他硬件)可能无法解密消息。

在离线操作602中,外部应用606或用户608可以接受正式的高级规范102,可以信任验证工具(例如,验证器108),可以信任服务提供方不会物理地改变硬件502,并且可以信任硬件规范(例如,指令集和可信硬件的硬件规范)对硬件502建模。其他任何事物(诸如应用(例如,应用544)、加密库、序列和数学库、操作系统(例如,操作系统426)和编译器中的一个或多个)可以被认为是不可信的,因为它们仅针对高级规范102被验证。

在图1的高级实现112已经被编译到汇编语言实现116并且由验证器108针对低级规范106验证之后,汇编器118可以用于创建机器代码实现120。机器代码实现120可以用于创建二进制文件(例如,由可信硬件的一个或多个处理器可执行),诸如软件系统二进制文件612。散列函数(例如,加密散列函数或其他散列函数)可以用于基于软件系统二进制文件612创建散列代码550(例如,加密散列代码)。软件系统二进制文件612可以包括已验证软件栈400。

在运行时操作604期间,应用544可以向外部应用606或用户608发送公钥546和第一凭证548。第一凭证548可以包括可信硬件签名614(例如,由可信硬件502签名)以指示公钥546由软件系统二进制文件612提供。外部应用606(或用户608)可以验证与可信硬件签名614相关联的散列代码616与在离线操作602期间生成的散列代码550匹配。

可信硬件502可以提供包括由可信硬件502的提供方签名的可信硬件提供方的签名620的第二凭证618。第二凭证618可以指示由合法硬件可信硬件(例如可信硬件502)排他地保持的可信硬件密钥622。

外部应用606(或用户608)可以认证(例如,验证)凭证548和618是有效的。外部应用606(或用户608)可以验证散列代码616与散列代码550匹配,例如指示已验证软件系统二进制文件612用于创建公钥546。在认证第一凭证548、第二凭证618和散列代码616之后,外部应用606(或用户608)可以安全地与已验证软件栈400的应用交互。例如,当外部应用606(或用户608)接收到消息(诸如包括公钥546的第一消息624)时,接收方可以将第一消息624认证为由应用544使用公钥546发送。外部应用606(或用户608)可以信任第一消息624的内容不能被其他实体访问,诸如其他应用626、其他外部应用、其他外部硬件等。作为另一示例,当外部应用606(或用户608)发送消息(诸如包括公钥546的第二消息628)时,外部应用606(或用户608)可以解密第二消息628,而其他实体(例如,其他应用626、其他外部应用、其他外部硬件等)不解密第二消息628。以这种方式,外部应用606(或用户608)可以以如下方式安全地与在可信硬件502上执行的已验证软件栈400交互:该方式使得消息(例如消息624和628)的内容能够被发送方和接收方可访问但不能被其他实体访问(例如,其他软件应用、外部硬件等)。

示例过程

在图7、8和9的流程图中,每个框表示可以用硬件、软件或其组合实现的一个或多个操作。在软件的上下文中,框表示在由一个或多个处理器执行时引起处理器执行所述操作的计算机可执行指令。通常,计算机可执行指令包括执行特定功能或实现特定抽象数据类型的例程、程序、对象、模块、部件、数据结构等。描述框的顺序不旨在被解释为限制,并且可以以任何顺序和/或并行地组合任何数量的所描述的操作以实现处理。为了讨论的目的,如上所述,参考架构100、200、300、400或500来描述过程700、800和900,但是其他模型、框架、系统和环境可以实现这些过程。

图7是根据一些实现的包括从软件应用接收公钥的示例过程700的流程图。过程700可以由图6的外部应用606执行。

在702,可以从在可信硬件上执行的软件应用接收公钥。例如,在图6中,外部应用606可以从应用544接收公钥546。公钥546可以基于应用544的私钥552来生成。

在704,可以接收由可信硬件签名的第一凭证(例如,证书、令牌等)。第一凭证可以标识公钥由与特定散列代码相关联的二进制文件提供。在706,可以认证第一凭证。例如,在图6中,外部应用606可以接收第一凭证548并且认证第一凭证548(例如,使用可信硬件签名614)。

在708,可以从可信硬件接收第二凭证。在710,可以认证第二凭证。例如,在图6中,外部应用606可以接收第二凭证618并且认证可信硬件提供方的签名620。

在712,可以做出该特定散列与离线提供的第二散列匹配的确定(例如,在包括软件应用的软件系统的执行之前)。例如,在图6中,外部应用606可以确定在运行时操作604期间接收的散列代码616匹配在离线操作602期间接收的散列代码550。

在714,可以从软件应用接收用公钥签名的第一消息。例如,在图6中,外部应用606可以接收用公钥546签名的第一消息624。公钥546可以指示第一消息624的内容对于应用544和外部应用606可访问,但是对于其它应用和其他设备不可访问。

在716,可以将用公钥签名的第二消息发送给软件应用。例如,在图6中,外部应用606可以发送用公钥546签名的第二消息628。公钥546可以指示第二消息628的内容对于应用544和外部应用606可访问,但是对于其他应用和其他设备不可访问。

因此,在接收到证明已验证软件的身份和在其上执行已验证软件的可信硬件的身份的凭证548和618之后,外部应用可以使用公钥发送和接收消息。发送和接收的消息的内容可以对于发送方和接收方可访问,但是对其他实体不可访问,从而提供安全的交互。

图8是根据一些实现的包括执行已经被验证为符合软件规范的软件系统的示例过程800的流程图。过程800可以由可信硬件执行,诸如图5和6的可信硬件502。

在802,可以执行已验证软件系统。例如,在图6中,已验证软件栈400可以由可信硬件502执行。

在804,可以由软件应用发送公钥。在806,可以发送由可信硬件签名的第一凭证(例如,证书、令牌等)。第一凭证可以将公钥标识为与二进制文件(例如,系统软件的二进制文件)相关联。因此,第一凭证可以证明软件的身份。在808,可以发送由可信硬件的提供方签名的第二凭证。第二凭证可以证明软件正在其上执行的硬件(例如,可信硬件)的身份。例如,在图6中,应用544可以向外部应用606发送公钥546、第一凭证548和第二凭证618。第一凭证548可以证明已验证软件栈400的身份,并且第二凭证618可证明可信硬件502的身份。以这种方式,保证外部应用606正在与应用544交互,而不是与假冒应用544的身份的其他软件和/或其他硬件交互。

在810,可以发送用公钥签名的第一消息。在812,可以接收用公钥签名的第二消息。应用544可以向外部应用606发送第一消息624。外部应用606可以向应用544发送第二消息628。凭证548、618和公钥546可以使得外部应用606和应用544能够在知道消息624和628的内容对于外部应用606和应用544可访问但是对于其他实体(包括已验证软件栈400的其他应用626以及其他软件应用和/或硬件)不可访问的情况下交互。

因此,凭证548和618可以用于分别证明已验证软件系统(例如,已验证软件栈)和可信硬件的身份。软件系统的应用和外部应用可以使用公钥交换消息。交换的消息的内容可以对于应用和外部应用可访问,但是对于其他实体不可访问,从而提供安全的交互。

图9是根据一些实现的包括执行软件系统的已验证引导的示例过程900的流程图。过程900可以由可信硬件执行,诸如图5和6的可信硬件502。

在902,可以执行软件系统的已验证引导。软件系统可以先前(例如,在离线操作期间)被验证为符合软件规范。例如,在图5中,可信硬件设备502可以执行至少已验证低级代码506的已验证引导504。

在904,可以从软件应用发送公钥。公钥可以基于仅对软件应用已知的私钥来生成。例如,在图6中,应用544可以基于私钥552生成公钥546,并且将公钥546发送给外部应用606。

在906,可以发送由可信平台模块签名的第一凭证。第一凭证可以标识公钥与二进制文件相关联(例如,使用二进制文件创建)。例如,在图6中,应用544可以将第一凭证548发送给外部应用606。第一凭证548可以例如通过确定散列代码616(在运行时操作604期间接收的)匹配散列代码550(在离线操作602期间提供的)来证明软件系统二进制文件612的身份。

在908,可以发送由可信硬件的提供方签名的第二凭证。第二凭证可以证明可信硬件的身份。例如,应用544可以发送证明可信硬件502的身份的第二凭证618。

在910,可以发送用公钥签名的第一消息。公钥可以指示第一消息由软件应用发送。在912,公钥可以经由证明被证实公钥对应于仅对软件系统已知的私钥。在914,可以接收使用公钥签名的第二消息。第二消息可以由软件应用可读取,但不由其他实体可读取。例如,在图6中,应用544可以将第一消息624发送给外部应用606。第一消息可以包括公钥546。公钥546可以经由证明被证实公钥546对应于私钥552。应用544可以接收使用公钥546签名的第二消息628。第一消息624和第二消息628的内容可以对于应用544和外部应用606可访问,但是对于其他应用626和其他外部软件和/或外部设备不可访问。

因此,第一凭证548可以证明已验证软件栈400的身份,并且第二凭证618可以证明可信硬件的身份。软件系统的应用和外部应用可以使用从仅对应用已知的私钥导出的公钥来交换消息。交换的消息的内容可以对于应用和外部应用可访问,但是对于其他实体不可访问,从而提供安全的交互。

示例计算设备和环境

图10示出了可以用于实现本文中所描述的模块和功能的计算设备1000(例如,可信计算基础或可信平台模块)和环境的示例配置。计算设备1000可以包括至少一个处理器1002、存储器1004、通信接口1006、显示设备1008、其他输入/输出(I/O)设备1010、和一个或多个大容量存储设备1012,这些部件能够诸如经由系统总线1014或其他合适的连接彼此通信。

处理器1002可以是单个处理单元或多个处理单元,其全部可以包括单个或多个计算单元或多个核。处理器1002可以被实现为一个或多个微处理器、微计算机、微控制器、数字信号处理器、中央处理单元、状态机、逻辑电路、和/或基于操作指令来操纵信号的任何设备。在其他能力中,处理器1002可以被配置为取回和执行存储在存储器1004、大容量存储设备1012或其它计算机可读介质中的计算机可读指令。

存储器1004和大容量存储设备1012是用于存储由处理器1002执行用以执行上述各种功能的指令的计算机存储介质的示例。例如,存储器1004通常可以包括易失性存储器和非易失性存储器(例如,RAM、ROM等)。此外,大容量存储设备1012通常可以包括硬盘驱动器、固态驱动器、包括外部和可移除驱动器的可移除介质、存储卡、闪存、软盘、光盘(例如CD、DVD)、存储阵列、网络附接存储装置、存储区域网络等。存储器1004和大容量存储设备1012两者在本文中可以统称为存储器或计算机存储介质,并且可以是能够存储计算机可读、处理器可执行程序指令作为可以由处理器1002执行的计算机程序代码的非暂态介质,处理器1002作为被配置用于执行本文中的实现中描述的操作和功能的特定机器。

计算设备1000还可以包括用于诸如经由网络、直接连接与其他设备交换数据的一个或多通信接口1006,如上所述。通信接口1006可以促进在各种各样的网络和协议类型内的通信,包括有线网络(例如,LAN、电缆等)和无线网络(例如,WLAN、蜂窝、卫星等)、因特网等。通信接口1006还可以提供与外部存储装置(未示出)的通信,诸如在存储阵列、网络附接存储装置、存储区域网络等中。

在一些实现中,可以包括显示设备1008,例如监视器,用于向用户显示信息和图像。其他I/O设备1010可以是从用户接收各种输入并且向用户提供各种输出的设备,并且可以包括键盘、遥控器、鼠标、打印机、音频输入/输出设备等。

存储器1004可以包括可以用于创建已验证软件系统的模块和软件部件。例如,在包括已经被验证的软件系统的可信计算环境中,存储器1004可以包括应用402、公共应用404、标准库406、UDP/IP 408、以太网410、网络驱动器412、数据类型414、散列算法416、可信硬件驱动器418、公钥加密系统420、BigNum 422、CoreMath 424和操作系统426。在软件开发系统中,如图1所示,存储器1004还可以包括高级规范102、规范翻译器104、低级规范106、验证器108、验证结果110、高级实现112、编译器114、汇编语言实现116、汇编器118、以及机器代码实现120。

本文中所描述的示例系统和计算设备仅是适合于一些实现的示例,而不旨在对可以实现这里描述的过程、部件和特征的环境、架构和框架的使用或功能的范围提出任何限制。因此,本文中的实现可以与很多环境或架构一起操作,并且可以在通用和专用计算系统或具有处理能力的其他设备中实现。通常,可以使用软件、硬件(例如,固定逻辑电路)或这些实现的组合来实现参考附图描述的任何功能。如本文中所使用的术语“模块”、“机制”或“部件”通常表示可以被配置为实现规定功能的软件、硬件或软件和硬件的组合。例如,在软件实现的情况下,术语“模块”、“机制”或“部件”可以表示当在一个或多个处理设备(例如,CPU或处理器)上执行时执行规定任务或操作的程序代码(和/或声明性类型指令)。程序代码可以存储在一个或多个计算机可读存储器设备或其他计算机存储设备中。因此,本文中所描述的过程、部件和模块可以由计算机程序产品来实现。

如本文中所使用的,“计算机可读介质”包括计算机存储介质和通信介质。计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据的信息的任何方法或技术实现的易失性和非易失性、可移除和不可移除介质。计算机存储介质包括但不限于随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程ROM(EEPROM)、闪存或其他存储器技术、光盘ROM(CD-ROM)、数字通用盘(DVD)或其它光存储装置、磁带盒、磁带、磁盘存储装置或其他磁存储设备、或可以用于存储信息以供计算设备访问的任何其它非传输介质。

相反,通信介质可以在诸如载波的调制数据信号中实施计算机可读指令、数据结构、程序模块或其他数据。如本文中所定义的,计算机存储介质不包括通信介质。

此外,本公开提供了如在附图中所描述和说明的各种示例实现。然而,本公开不限于本文中所描述和示出的实现,而是可以扩展到如本领域技术人员已知或将变得已知的其它实现。在说明书中对“一个实现”、“该实现”、“这些实现”、“示例”、“一些示例”、“一些实现”等的引用表示包括所描述的特定特征、结构或特性被包括在至少一个实现或示例中,并且这些短语在说明书中的各种地方的出现不一定都指代相同的实现。除非另有说明,所提供的各种实现和示例不旨在是相互排斥的,而是可以个体地使用或彼此组合使用。

示例

作为第一示例,已经被验证为符合软件规范的软件系统可以由安全硬件执行。软件系统可以包括操作系统和软件应用。公钥可以从软件应用被发送给在软件系统外部的外部应用。由安全硬件签名的第一凭证可以被发送给外部应用。第一凭证可以标识公钥与软件系统相关联。由安全硬件的提供方签名的第二凭证可以被发送给外部应用。第二凭证可以证明安全硬件的身份。公钥可以基于对软件系统已知但是对其他软件系统未知的私钥来生成。第二凭证可以由安全硬件使用第二密钥来签名。可以发送用公钥签名的第一消息。公钥可以指示第一消息由软件系统发送。可以接收使用公钥签名的第二消息。第二消息可以由软件系统可读取但其它软件系统不可读取。通过确定软件系统的汇编语言实现能够实现软件规范的功能正确版本,可以将软件系统验证为符合软件规范。验证软件系统符合软件规范可以包括证明远程等效性。证明远程等效性可以包括确定在软件规范中描述的属性的功能正确性并且证明软件系统的至少两个部件之间的非干扰。作为第二示例,可以执行软件系统的已验证引导。软件系统可以被验证为符合软件规范。软件系统可以包括软件应用。公钥可以从软件应用发送给在软件系统外部的外部应用。公钥可以基于对软件应用已知但是对其他软件系统未知的私钥来生成。由安全硬件签名的第一证书可以被发送给外部应用。第一证书可以标识公钥由软件系统的二进制文件提供。由安全硬件的提供方签名的第二证书可以被发送给外部应用。第二证书可以证明安全硬件的身份。将由安全硬件的提供方签名的第二证书发送给外部应用可以包括:(1)使用第二密钥签名第二证书以创建签名的第二证书,以及(2)发送签名的第二证书。可以发送用公钥签名的第一消息。公钥可以指示第一消息由软件系统发送。证明可以证实(1)公钥对应于私钥以及(2)私钥仅对软件系统已知。可以发送使用公钥签名的第二消息。第二消息可以由软件系统可读取但其它软件系统不可读取。在执行软件系统的已验证引导之前,可以将软件系统验证为符合软件规范。例如,可以通过证明远程等效性来将软件系统验证为符合软件规范。服务器可以包括安全硬件。验证可以包括证明安全远程等效性。软件系统的第一部件可以被验证为不能破坏软件系统的第二部件。作为第三示例,可以从由安全硬件执行的软件系统接收公钥。可以接收由安全硬件签名的第一凭证。第一凭证可以证明公钥由软件系统的二进制文件提供。可以从安全硬件接收证明安全硬件的身份的第二凭证。可以认证第一凭证和第二凭证以确定公钥是否由正由安全硬件执行的软件系统提供。公钥可以基于仅对软件系统已知的私钥。第二凭证可以由安全硬件的提供方签名。可以确定与软件系统相关联的系统散列,以匹配在软件应用开始在安全硬件上执行之前提供的在先散列。可以从软件系统接收用公钥签名的第一消息。公钥可以用于认证第一消息由软件应用发送。用公钥签名的第二消息可以被发送给软件系统。第二消息可以使用由软件应用维护的私钥来解密。

结论

尽管已经用特定于结构特征和/或方法动作的语言描述了主题,但是所附权利要求中限定的主题不限于上述具体特征或动作。相反,上面描述的具体特征和动作被公开作为实现权利要求的示例形式。本公开旨在覆盖所公开的实现的任何和所有修改或变化,并且所附权利要求不应当被解释为限于说明书中公开的具体实现。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1