说明书硬件协助的操作系统重启计数器设计方法
(一)、技术领域:本发明涉及一种操作系统重启计数器设计方法,特别是 涉及一种硬件协助的操作系统重启计数器设计方法。
(二)、背景技术:TPM(可信平台模块)内部配有可信的单调计数器, 但是该单调计数器不能被外部用户直接访问,只能够将计数值输出至外部计数 器,供外部用户访问使用。用户可以通过命令TPM_CreateCounter向TPM申请 一个外部单调计数器。一旦申请成功,TPM返回一个计数器句柄以及一个认证 随机数,而外部单调计数器的初值为内部计数器值+1。用户使用 TPM_IncrementCounter可以对外部计数器执行单调递增操作,但实质上触发内 部单调计数器的递增操作。TPM基于一个内部单调计数器,为若干个用户提供 外部计数器服务。由于用户无法篡改内部计数器,且用户可以通过认证随机数 验证自己所申请的外部计数器的唯一性,这样能够保证单调计数服务的可信 性。
Bryan Parno等人提出的Memoir利用TPM NVRAM来存储系统重启信息。 Memoir最初的设计目的是为了保证软件模块状态连续性,防止状态回滚攻击。 为此,Memoir不得不记录系统重启信息,以便检查系统重启之前和之后的模块 状态的连续性情况。Memoir所采用的解决方案是利用NVRAM来记录系统重启 的信息。TPM NVRAM是TPM内部一个容量有限、受控访问、可擦写的存储区 域,一般用于存储少量密钥信息。用户在提供必要的认证信息后,可以访问该 区域。
目前,主流商用计算机系统所具备的,具有可信特点的硬件计数器主要是 TPM单调计数器。但是,一旦系统重新启动,TPM的计数值将丢失,无法记录 操作系统重启次数。Bryan Parno等人提出的Memoir将系统重启的信息记录于 TPM NVRAM中。然而,使用NVRAM的限制在于:NVRAM的擦写次数有限 (约为100000次)、容量有限(一般约为1,280字节)。一般情况下,用户不应 该占用NVRAM的存储空间。此外,当攻击者获得操作系统的控制权以后,攻 击者仍然有可能会重放NVRAM中的数据,存储于NVRAM中的系统重启信息 存在被篡改的可能。
(三)、发明内容:
本发明要解决的技术问题是:提供一种硬件协助的操作系统重启计数器设 计方法,该方法具有良好的软、硬件兼容性,不影响现有软硬件的正常使用, 不对计算机系统的软硬件环境作特别要求。
本发明的技术方案:
术语解释:
●可信平台模块(TPM,Trusted Platform Module):TPM是通过LPC总线嵌入 到硬件主板上硬件,它具有独立的可执行单元和存储器,能够向计算机系 统提供加解密、签名、远程证明等功能支持。
●完整性度量(Integrity Measurement):完整性度量是指在信任传递过程中, 对影响平台完整性的实体进行度量。在TCG规范中,完整性度量机制是通 过杂凑算法实现的,完整性度量值就是被度量实体二进制代码的杂凑值。
●平台配置寄存器(PCR,Platform Configuration Register):TPM内部存储完 整性度量值的寄存器。现有操作系统可信启动机制往往使用PCR记录系统启 动所涉及实体的完整性度量值(即:度量实体二进制代码的杂凑值)。PCR 的一个突出特点是能够使用有限容量的存储空间记录无限多的度量结果, 这依赖其特定的更新方式。假设拟将某值(用value表示)更新(更确切的应 该为扩展)到PCR中,其更新公式为PCR新值=Hash(PCR旧值||value)。 此外PCR的另一个突出特点是只有计算机系统重启才能初始化PCR(TPM 1.2 版本后,计算机系统未重启,TPM接收到特定指令也会初始化PCR,但是 这种初始化的PCR初始值与系统重启初始化的初始值不同,所以仍然可以知 道是何种方式导致了初始化)。
●对外证明(Attestation):证明实体完整性相关性质的过程。对外证明具有多 种不同层面的含义,本发明中专指对平台进行的证明。本质上是这样的一 种操作:使用TPM的AIK密钥对一组PCR进行数字签名,为平台的一组完整 性度量结果提供证明。
●封装(Seal)和解封(UnSeal):TPM将PCR内容与秘密信息共同加密的一 种工作方式,解密时需要PCR处于相同内容时,才能正确还原秘密信息。由 于在系统可信引导过程中,PCR不断记录系统引导所涉及的实体的完整性度 量值,所以利用封装可以实现如下功能:当用户在系统引导的某个环节, 封装了某数据,那么当引导过程与封装时的引导过程完全相同时,才能在 同一步骤解封该数据。
●TPM NVRAM:TPM内部容量有限的非易失性存储区域。该区域为TPM存 储少量工作所必要的密钥等信息。限于成本,TPM NVRAM的存储容量一 般为1280字节,有效擦写次数为100000次。
●系统重启计数器:用于记录操作系统在某段时间内启动的次数,也是本发 明所要设计的计数器。
●秘密共享方案:将秘密以适当的方式拆分,拆分后的每一个份额由不同的 参与者管理,单个参与者无法恢复秘密信息,只有若干个参与者协作才能 恢复秘密消息。换个角度:当部分参与者丢失份额后,只要仍然有足够多 的参与者能够提供正确的份额,仍然可以还原秘密。本发明正是利用这一 点,利用秘密共享方案将秘密分散存储于磁盘。
●线性反馈移位寄存器(如图1所示):反馈移位寄存器由移位寄存器和反馈 函数组成。移位寄存器每次向右移动一位,最右侧元素(即:bk)被输出, 并且通过反馈函数生成bn+k补充到最左侧元素。当反馈函数为线性关系(形 如f(a1,a2,a3,…an)=kna1⊕kn-1a2⊕....⊕k2an-1⊕k1an),称该反馈移位寄存器为线 性反馈移位寄存器。本发明所使用的地址发生器就以线性反馈移位寄存器 为核心。
本发明将系统重启计数信息存储于磁盘内,在系统重启时执行递增操作,并 输出计数信息供用户查询。然而,直接将重启计数信息存储于磁盘并不安全。 一旦攻击者获得操作系统的控制权后,攻击者就可以容易的篡改重启计数信息, 这是因为在磁盘中的存储位置以及计数信息的内容容易被攻击者获知和篡改。 为了保证重启计数的可信性,本发明提出在TPM的协助下,构建安全可信的系 统重启计数器。
本发明所提出的计数器存在两个合理的安全假设。①TPM硬件是可信。一 般来讲,攻击者都是采用网络的形式入侵远程的计算机系统,不对目标主机具 有物理控制权。这使得TPM硬件不会被攻击者采用物理手段所破解。另一方 面,任何软件对TPM的访问都需要经过必要的认证和授权。所以,在不对TPM 拥有物理控制权的前提下,可以假设TPM硬件为可信的。②启动过程的操作系 统是可信的。操作系统启动过程所涉及的各实体相对固定,可以采用基于杂凑 方法对其进行完整性度量。目前,关于操作系统可信引导的相关技术已经相对 成熟,一些商用操作系统已经实现可信引导。所以本发明认为:在启动过程的 操作系统是可信和安全的。
本发明的基本原理如图2所示。本发明的基本思想可以概括为:将系统重 启计数信息秘密且分散的存储于磁盘中,并将系统重启次数信息的完整性度量 值扩散到TPM PCR中,供用户访问和验证系统重启次数的可信性。要点包括: ①基于秘密共享方案,将重启计数信息分拆为多个秘密份额,分散存储于磁盘 的多个位置,并在需要的时候,收集足够多的份额还原重启计数信息;②在分 散存储和还原重启计数信息时,秘密份额的存储地址由地址发生器根据地址种 子生成;③为了保证地址种子的机密性,本发明采用TPM封装机制,对地址种 子进行封装存储,保证只有当系统可信重启至某个环节才能解封,还原地址种 子;④对外输出重启计数信息时,为了防止其被攻击者所篡改,重启计数信息 的完整性度量值将按照TPM PCR的扩展规则,扩展至指定的TPM PCR中,用户 可以查询和验证重启计数信息的完整性。
用|→表示可信依赖关系,那么本发明的可信依赖关系可以表示为以下两个 式子:
①重启计数信息|→秘密份额|→地址信息|→地址种子|→TPM封装机制|→安 全假设
②重启计数值|→TPM PCR|→安全假设
式①反映了重启计数信息存储过程的可信依赖关系。只要保证秘密份额的 完整性,就可以保证重启计数值的可信;为了保证秘密份额不被篡改或重放, 其地址信息必须保证机密性;为了保护地址信息,就必须保证地址种子不被窃 取;而地址种子被TPM封装保护,并且只在操作系统启动过程中进行解封(此 时认为操作系统是可信的,不存在攻击者)。式②反映了重启计数信息输出过 程的可信依赖关系。当重启计数信息输出至指定位置,其可信性依赖于存储于 PCR的完整性度量值;由于本发明假设PCR不会被非法篡改,就可以保证重启 计数信息能够被用户查询和验证。
一种硬件协助的操作系统重启计数器设计方法,具体为:首先设置地址种 子、地址发生器、存取单元、散列表和控制单元,计数器将依赖磁盘中若干个 秘密份额查询系统重启次数,而这些秘密份额的存储地址将由地址发生器根据 地址种子生成;TPM的支持体现在三个方面:TPM为计数器提供随机数发生服 务;TPM为计数器提供封装和解封服务;TPM PCR存储系统重启信息的完整性 度量值;
然后进行如下控制:
步骤1,初始化:
初始化是使用系统重启计数器的准备环节,初始化的核心任务是完成地址 种子、散列表以及地址发生器的生成或者初始化,参与实体为控制单元和地址 发生器,协助实体为TPM;
初始化含有两种情况:第一次使用系统重启计数器,以及系统重启计数器 缺乏可用的份额;第一次使用系统重启计数器时,控制单元在工作目录下无法 找到地址种子和散列表,就开启初始化;经过若干次使用以后,绝大多数分散 存储在磁盘内的份额被操作系统覆盖,系统重启计数器缺乏可用的份额时,控 制单元再次开启初始化流程;
系统重启计数信息的格式为{num,rand},其中num为整数,表示系统重启的 次数,rand是认证码,用于标识初始化;如此设计的原因在于:为了防止攻击者 通过频繁初始化系统重启计数器欺骗用户;攻击者可以通过删除地址种子和散 列表,或者故意用大体积文件占用磁盘空闲空间,导致系统重启计数器频繁初 始化;这样,如果仅仅系统重启计数信息,仅仅记录系统重启次数,就可能使 用户相信系统并未重启,因为计数值始终为初始值;为此,系统重启计数器不 仅记录系统重启的次数,也记录每次初始化的认证码(即一个随机数),这样 可以通过认证码进行识别不同的初始化值;
初始化的具体过程如下:
①控制单元生成地址种子:控制单元访问TPM,通过TPM_GetRandom命 令要求TPM生成随机数,以此作为地址种子;为了保护地址种子的随机性,控 制单元使用TPM的随机数发生服务;
②控制单元生成初始化认证码:控制单元再次访问TPM,通过 TPM_GetRandom命令要求TPM再次生成随机数,以此作为重启信息的认证码;
③控制单元封装地址种子:控制单元访问TPM,通过TPM_Seal命令要求 TPM封装地址种子,并存储于磁盘;目前,主流操作系统均支持基于TPM的安 全引导,在引导过程中将各引导成分的HASH指纹扩展到TPM PCR;控制单元 在系统重启过程中封装地址种子,而封装的内容包括TPM PCR的内容,这就使 得只有当操作系统重启至控制单元,且已经完成引导的成分均可信才能解封地 址种子,从而保证地址种子不被攻击者察看以及重启过程不被攻击者所干扰 (假设系统启动过程是可信的)。
④地址发生器生成地址序列:地址发生器读取地址种子,并驱动内部线性 反馈移位寄存器工作,输出指定数量的地址,形成待写入份额的地址序列;需 要说明的是:地址序列是临时列表,一旦使用完毕即释放和擦除,不在磁盘上 存储;
⑤控制单元初始化散列表:控制单元根据地址序列的信息初始化散列表, 确定不能写入份额的地址,并在散列表中相应处置0;导致不能写入份额的原因 有两个方面,第一种是磁盘固定使用的扇区,典型的如磁盘引导区;第二种是 操作系统已经使用该磁盘空间,例如已经写入某个数据文件,此时份额不能写 入该地址,否则会破坏数据文件;对于第一种情况的处理,控制单元可以根据 常识确认地址序列中是否有地址落入该部分存储空间;对于第二种情况的处 理,控制单元需要查询文件系统才能确定;
步骤2,重启计数:
在操作系统引导至系统重启计数器时,重启计数开始;当满足初始化条件时 (即:初次使用系统重启计数器,或者缺乏可用份额),开启初始化过程,否 则开始重启计数;
重启计数的流程如下:
①地址种子解封:控制单元从磁盘指定位置读取被封装的地址种子,通过 TPM_UnSeal命令,解封地址种子;在初始化过程中,控制单元生成地址种子, 并将其封装、存储;在本过程中,控制单元通过TPM_UnSeal命令,将地址种子 解封;由于TPM PCR存储了操作系统可信引导过程中的度量结果,这就使得只 有当操作系统处于可信的环境时,控制单元才能成功解封地址种子;
②生成地址序列:地址发生器读取地址种子,用其初始化内部的线性反 馈移位寄存器,并驱动移位寄存器输出地址序列;
③还原上一次系统重启计数值:存取单元根据散列表和地址序列,读取存 取在磁盘中的各份额,并基于拉格朗日插值公式,将其还原;
④系统重启计数值递增:存取单元执行重启计数值的递增操作,根据拉格 朗日插值公式完成秘密分割,并按照散列表和地址序列,将份额分散存储到指 定位置;
⑤系统重启计数信息输出:存取单元将系统重启计数信息输出至控制单 元,控制单元进一步输出至用户(可以使用文件、系统调用等多种形式),同 时计算系统重启计数信息的完整性度量值,并扩展至TPM PCR(可信平台模块 平台配置寄存器)中。这样,用户可以根据存储于TPM PCR中的完整性度量值 来验证系统重启信息是否被篡改。
步骤2的③中还含有以下几个环节:
(a),根据散列表和地址序列,存取单元从磁盘中收集所有可用的份额;
(b),从上一次使用份额以来,可能有一些可用份额已经被操作系统无意中 破坏,所以无法依赖简单的一次还原就确定重启计数值,必须首先查找可能被 破坏的份额;为了查找可能被破坏的份额,存取单元根据拉格朗日插值公式, 反复从可用的份额中选取若干个进行还原操作,要求每个份额至少参与一次还 原操作,基于大数原则(即:当大多数还原都得到同一个值时,则认为该值为 正确的),确定上一次系统重启计数值;
(c),根据上一环节的操作结果,确认被破坏的份额,并更新散列表。
此步骤存在一种可能:存取单元在反复还原中,无法确认系统重启计数 值;导致这一情况可能是因为磁盘空闲空间过少,或者可用份额不足;此时, 系统重启计数器开始初始化,进入初始化流程。
步骤2的④中还含有以下几个环节:
(a),系统重启计数信息的格式为{num,rand},递增操作是指对其中num执行 递增操作,认证码rand不发生变化,递增操作由存取单元完成;
(b),存取单元在上一步骤(即:步骤2的③中还原上一次系统重启计数值) 已经还原多项式,此时存取单元修改递增后的系统重启计数信息,重新生成份 额;
(c),存取单元查询散列表和地址序列,将新的份额更新至磁盘指定位置。
地址发生器用于生成若干地址,地址种子是地址发生器所使用的初始向量; 地址发生器所生成的地址就是秘密份额存储于磁盘内的地址;地址发生器的核 心是线性反馈移位寄存器;地址发生器将地址种子作为线性反馈移位寄存器的 初始向量,并驱动线性反馈移位寄存器工作,不断输出比特流;地址发生器将 依次截取该比特流中固定长度的片段,形成若干个地址信息;
具体说明如何依赖线性反馈移位寄存器生成多个地址:线性反馈移位寄存 器的反馈函数可以表示为:f(a1,a2,a3,…an)=kna1⊕kn-1a2⊕....⊕k2an-1⊕k1an,其中 系数ki∈{0,1}(i=1,2,3,…,n)。该函数为n元布尔函数,如果反馈移位寄存器的当 前状态为si=(ai,.....ai+n-1),则有ai+n=f(ai,ai+1,...,ai+n-1),ai+n将被输出,同时根据反 馈移位寄存器的工作方式,ai+n将成为其新的输入,推动反馈移位寄存器进入下 一状态si+1=(ai+1,.....ai+n);反复驱动反馈移位寄存器输出,形成伪随机的比特流;
线性反馈移位寄存器初始状态下,其初始值anan-1...a3a2a1即为地址种子;地 址发生器开始工作时,读取地址种子并对其内部的线性反馈移位寄存器初始 化,然后驱动线性反馈移位寄存器输出,而后按照约定依次截取n个比特组成 一个地址信息,输出的第一组即为地址种子,不用作地址信息;换言之,线性 反馈移位寄存器输出的第一组即为地址种子,第二组为第一个可用的地址,依 次类推。
设k是地址的长度,k的取值与磁盘大小有关;为了保证地址发生器所生产 的地址能够随机地分散到磁盘的多个角落,线性反馈移位寄存器产生的地址要 覆盖磁盘的地址空间;例如:当磁盘大小为220时,那么k的取值就可以设为20; 按照上述方法理论上可以以获取2k/k个地址信息,远远超过实际需要的地址个 数;这种方式能够产生足够多的地址。
地址发生器的核心是线性反馈移位寄存器;地址发生器采用软件实现线性 反馈移位寄存器;初始化时,地址发生器为线性反馈移位寄存器随机生成反馈 函数以及地址种子;该反馈函数一直使用,直至再次地址发生器初始化;地址 发生器初始化的内容包括:设置地址种子的长度,设置每次生成地址的数量, 重新生成反馈函数,重新生成地址种子。
存取单元负责从磁盘中还原系统重启信息,以及将系统重启信息存储到磁 盘中;基于秘密共享方案,将系统重启信息分拆为多个份额,并这些份额分散 存储到磁盘中多个位置;与之对应的,当用户需要获知系统的重启次数时,则 根据秘密共享方案,从磁盘中多个位置收集足够多的份额执行还原操作,恢复 系统重启次数;存取单元就是上述这一思想的完成者;只要保证份额存储地址 的机密性,就可以保证系统重启信息不会被篡改;存取单元将份额分散地存储 于磁盘的多个角落;由于份额存储地址的机密性,攻击者无法直接篡改份额, 除非更换整个磁盘,否则无法篡改系统重启信息;
存取单元采用拉格朗日插值公式作为秘密共享的实现方案;具体来讲,存 取单元随机构造一个t-1次多项式,形如:
f(x)=(at-1xt-1+at-2xt-2+…+a1x+s)mod p,
其中at-1,at-2,…,a1均为随机选择,p为大素数,s是系统重启信息;该多项 式需要秘密保护,不能被攻击者所获知,存取单元完成份额的生成或秘密还原 后,需要将多项式擦除,不能存储于不可信的磁盘上,以免攻击者获取该多项 式;
当存取单元准备将s分割为n个份额时,就随机选择xi,并计算多项式在n 个不同位置xi处的值bi=f(xi),(xi,bi)则是将分散存储的份额,存取单元根据地 址发生器的地址,将份额隐藏存储于磁盘中;当存取单元拟恢复系统重启信息 s,存取单元根据地址发生器的提示,获取t个份额,这样就可以获得由t个方程 组成的方程组,通过解此方程组即可还原多项式,进而得知系统重启次数s;
b 1 = ( a t - 1 x 1 t - 1 + a t - 2 x 1 t - 2 + . . . + a 1 x 1 + s ) mod p b 2 = ( a t - 1 x 2 t - 1 + a t - 2 x 2 t - 2 + . . . a 1 x 2 + s ) mod p . . . . b t = ( a t - 1 x t t - 1 + a t - 2 x t t - 2 + . . . a 1 x t + s ) mod p ]]>
需要说明的是:n将远远大于t;这是因为存取单元将份额存储于磁盘时,并 不会告知操作系统该磁盘空间已被使用,这就导致操作系统会在无意识的覆盖 份额的内容;为了保证存取单元有足够多的份额,还原系统重启信息s,存取单 元会产生足够多的份额,即使一部分份额被操作系统覆盖或改写,也不会导致 存取单元无可用份额使用的情况出现。
散列表用于标识上一次系统重启时能正常使用的份额;如上所述,操作系 统并不知道份额存储于磁盘何处,就有可能在后继工作中占用份额存放的存储 空间,导致存取单元所使用的份额被其无意识中被修改,不再可用;为了提高 系统效率,使用散列表标识分散存储每个份额是否可用,以防止存取单元在分 散和还原系统重启信息时再次读取已经不可用的份额,进行不必要的工作。
散列表标识份额可用性的方法如下:散列表使用比特0和1表示指定位置份 额的可用性,其中,1表示该份额可用,0表示份额不可用;散列表使用0或1在 散列表中的位置来标识份额的地址信息;例如:散列表前五个比特值为01001表 示,在地址发生器所产生的第二个地址和第五个地址所存储的份额可用;当地 址发生器产生的地址位于磁盘的特殊位置(如磁盘引导扇区)时,通过修改散 列表将其设置为不可用,以避免由于系统重启计数信息的修改,导致磁盘数据 丢失。
控制单元负责控制和协调系统重启计数器各成分的工作;控制单元的核心 任务包括:
①初始化系统重启计数器;
②利用TPM的支持,解封地址种子;
③驱动存取单元,从磁盘中还原系统重启信息s;
④执行系统重启次数递增操作,并驱动存取单元完成系统重启信息的分散 存储;
⑤将系统重启信息输出给用户,且将完整性度量值扩展到TPM PCR(可信 平台模块平台配置寄存器)中,供用户验证系统重启信息的可信性。
本发明核心是利用秘密共享的思想将系统重启次数的相关信息分散隐藏、 存储于磁盘空闲空间,并采用可验证的方式输出给用户使用,核心的流程是重 启计数流程及相关模块,具体的有:
①控制单元利用TPM的封装和解封机制,保证只有当操作系统处于一个可 信状态时,才能获知地址种子;
②地址发生器基于一个地址种子,生成多个可用的地址信息;
③存取单元基于秘密共享思想,将系统重启次数的相关信息分散存储于磁 盘空闲空间;
④控制单元基于TPM PCR的支持,用可验证的方式将重启信息输出给用户 使用。
本发明的有益效果:
1、本发明为现有主流商用计算机系统提供了一种安全的操作系统重启计 数器;现有主流商用计算机系统缺乏对操作系统重启计数的支持,无法记录操 作系统在特定时间内的重启次数;但是另一方面,记录操作系统在特定时间内 的重启次数,对于对外证明、远程监控、版权控制等方面具有重要的基础性支 撑作用;一种最为直接的方法是在磁盘上记录系统重启次数,但是这种方法易 使计数值被篡改;现有方法是利用TPM NVRAM来存储系统重启次数,通过限 制用户访问NVRAM来防止攻击者篡改计数值,但是这种方法会占用TPM NVRAM有限的容量,减少其使用寿命;本发明在TPM的协助下,利用秘密共享 思想,将系统重启次数相关信息秘密、分散地存储于磁盘的空闲空间,并采用 可验证的方式供用户查询使用,与现有技术相比,本发明具有良好的软、硬件 兼容性,不影响现有软硬件的正常使用,不对计算机系统的软硬件环境作特别 要求。
2、本发明能避免像Memoir那样不合理地使用TPM资源,能够在不影响现有 软硬件运行的前提下,实现构建系统重启计数器的目的;在操作系统不可信的 情况下(引导过程的操作系统被假定为可信),本发明所设计的计数器仍然能 够正常记录系统重启次数。
(四)、附图说明:
图1为线性反馈移位寄存器的结构示意图;
图2为本发明的工作原理示意图;
图3为操作系统重启计数器的结构示意图;
图4为线性反馈移位寄存器、地址种子以及地址之间的关系示意图;
图5为初始化的流程示意图;
图6为重启计数的流程示意图。
(五)、具体实施方式:
硬件协助的操作系统重启计数器设计方法具体为:首先设置地址种子、地 址发生器、存取单元、散列表和控制单元(如图3所示),图3中磁盘中圆圈代 表记载系统重启次数的秘密份额,计数器将依赖磁盘中若干个秘密份额查询系 统重启次数,而这些秘密份额的存储地址将由地址发生器根据地址种子生成; TPM的支持体现在三个方面:TPM为计数器提供随机数发生服务;TPM为计 数器提供封装和解封服务;TPM PCR存储系统重启信息的完整性度量值;
然后进行如下控制:
步骤1,初始化:
初始化是使用系统重启计数器的准备环节,初始化的核心任务是完成地址 种子、散列表以及地址发生器的生成或者初始化,参与实体为控制单元和地址 发生器,协助实体为TPM;
初始化含有两种情况:第一次使用系统重启计数器,以及系统重启计数器 缺乏可用的份额;第一次使用系统重启计数器时,控制单元在工作目录下无法 找到地址种子和散列表,就开启初始化;经过若干次使用以后,绝大多数分散 存储在磁盘内的份额被操作系统覆盖,系统重启计数器缺乏可用的份额时,控 制单元再次开启初始化流程;
系统重启计数信息的格式为{num,rand},其中num为整数,表示系统重启的 次数,rand是认证码,用于标识初始化;如此设计的原因在于:为了防止攻击者 通过频繁初始化系统重启计数器欺骗用户;攻击者可以通过删除地址种子和散 列表,或者故意用大体积文件占用磁盘空闲空间,导致系统重启计数器频繁初 始化;这样,如果仅仅系统重启计数信息,仅仅记录系统重启次数,就可能使 用户相信系统并未重启,因为计数值始终为初始值;为此,系统重启计数器不 仅记录系统重启的次数,也记录每次初始化的认证码(即一个随机数),这样 可以通过认证码进行识别不同的初始化值;
初始化的具体过程如下(如图5所示):
①控制单元生成地址种子:控制单元访问TPM,通过TPM_GetRandom命 令要求TPM生成随机数,以此作为地址种子;为了保护地址种子的随机性,控 制单元使用TPM的随机数发生服务;
②控制单元生成初始化认证码:控制单元再次访问TPM,通过 TPM_GetRandom命令要求TPM再次生成随机数,以此作为重启信息的认证码;
③控制单元封装地址种子:控制单元访问TPM,通过TPM_Seal命令要求 TPM封装地址种子,并存储于磁盘;目前,主流操作系统均支持基于TPM的安 全引导,在引导过程中将各引导成分的HASH指纹扩展到TPM PCR;控制单元 在系统重启过程中封装地址种子,而封装的内容包括TPM PCR的内容,这就使 得只有当操作系统重启至控制单元,且已经完成引导的成分均可信才能解封地 址种子,从而保证地址种子不被攻击者察看以及重启过程不被攻击者所干扰 (假设系统启动过程是可信的)。
④地址发生器生成地址序列:地址发生器读取地址种子,并驱动内部线性 反馈移位寄存器工作,输出指定数量的地址,形成待写入份额的地址序列;需 要说明的是:地址序列是临时列表,一旦使用完毕即释放和擦除,不在磁盘上 存储;
⑤控制单元初始化散列表:控制单元根据地址序列的信息初始化散列表, 确定不能写入份额的地址,并在散列表中相应处置0;导致不能写入份额的原因 有两个方面,第一种是磁盘固定使用的扇区,典型的如磁盘引导区;第二种是 操作系统已经使用该磁盘空间,例如已经写入某个数据文件,此时份额不能写 入该地址,否则会破坏数据文件;对于第一种情况的处理,控制单元可以根据 常识确认地址序列中是否有地址落入该部分存储空间;对于第二种情况的处 理,控制单元需要查询文件系统才能确定;
步骤2,重启计数:
在操作系统引导至系统重启计数器时,重启计数开始;当满足初始化条件时 (即:初次使用系统重启计数器,或者缺乏可用份额),开启初始化过程,否 则开始重启计数;
重启计数的流程如下(如图6所示):
①地址种子解封:控制单元从磁盘指定位置读取被封装的地址种子,通过 TPM_UnSeal命令,解封地址种子;在初始化过程中,控制单元生成地址种子, 并将其封装、存储;在本过程中,控制单元通过TPM_UnSeal命令,将地址种子 解封;由于TPM PCR存储了操作系统可信引导过程中的度量结果,这就使得只 有当操作系统处于可信的环境时,控制单元才能成功解封地址种子;
②生成地址序列:地址发生器读取地址种子,用其初始化内部的线性反 馈移位寄存器,并驱动移位寄存器输出地址序列;
③还原上一次系统重启计数值:存取单元根据散列表和地址序列,读取存 取在磁盘中的各份额,并基于拉格朗日插值公式,将其还原;
④系统重启计数值递增:存取单元执行重启计数值的递增操作,根据拉格 朗日插值公式完成秘密分割,并按照散列表和地址序列,将份额分散存储到指 定位置;
⑤系统重启计数信息输出:存取单元将系统重启计数信息输出至控制单 元,控制单元进一步输出至用户(可以使用文件、系统调用等多种形式),同 时计算系统重启计数信息的完整性度量值,并扩展至TPM PCR(可信平台模块 平台配置寄存器)中。这样,用户可以根据存储于TPM PCR中的完整性度量值 来验证系统重启信息是否被篡改。
步骤2的③中还含有以下几个环节:
(a),根据散列表和地址序列,存取单元从磁盘中收集所有可用的份额;
(b),从上一次使用份额以来,可能有一些可用份额已经被操作系统无意中 破坏,所以无法依赖简单的一次还原就确定重启计数值,必须首先查找可能被 破坏的份额;为了查找可能被破坏的份额,存取单元根据拉格朗日插值公式, 反复从可用的份额中选取若干个进行还原操作,要求每个份额至少参与一次还 原操作,基于大数原则(即:当大多数还原都得到同一个值时,则认为该值为 正确的),确定上一次系统重启计数值;
(c),根据上一环节的操作结果,确认被破坏的份额,并更新散列表。
此步骤存在一种可能:存取单元在反复还原中,无法确认系统重启计数 值;导致这一情况可能是因为磁盘空闲空间过少,或者可用份额不足;此时, 系统重启计数器开始初始化,进入初始化流程。
步骤2的④中还含有以下几个环节:
(a),系统重启计数信息的格式为{num,rand},递增操作是指对其中num执行 递增操作,认证码rand不发生变化,递增操作由存取单元完成;
(b),存取单元在上一步骤(即:步骤2的③中还原上一次系统重启计数值) 已经还原多项式,此时存取单元修改递增后的系统重启计数信息,重新生成份 额;
(c),存取单元查询散列表和地址序列,将新的份额更新至磁盘指定位置。
地址发生器用于生成若干地址,地址种子是地址发生器所使用的初始向量; 地址发生器所生成的地址就是秘密份额存储于磁盘内的地址;地址发生器的核 心是线性反馈移位寄存器;地址发生器将地址种子作为线性反馈移位寄存器的 初始向量,并驱动线性反馈移位寄存器工作,不断输出比特流;地址发生器将 依次截取该比特流中固定长度的片段,形成若干个地址信息;
具体说明如何依赖线性反馈移位寄存器生成多个地址:线性反馈移位寄存 器的反馈函数可以表示为:f(a1,a2,a3,…an)=kna1⊕kn-1a2⊕....⊕k2an-1⊕k1an,其中 系数ki∈{0,1}(i=1,2,3,…,n)。该函数为n元布尔函数,如果反馈移位寄存器的当 前状态为si=(ai,.....ai+n-1),则有ai+n=f(ai,ai+1,...,ai+n-1),ai+n将被输出,同时根据反 馈移位寄存器的工作方式,ai+n将成为其新的输入,推动反馈移位寄存器进入下 一状态si+1=(ai+1,.....ai+n);反复驱动反馈移位寄存器输出,形成伪随机的比特流;
线性反馈移位寄存器、地址种子以及地址之间的关系如图4所示;线性反馈 移位寄存器初始状态下,其初始值anan-1...a3a2a1即为地址种子;地址发生器开始 工作时,读取地址种子并对其内部的线性反馈移位寄存器初始化,然后驱动线 性反馈移位寄存器输出,而后按照约定依次截取n个比特组成一个地址信息,输 出的第一组即为地址种子,不用作地址信息;换言之,线性反馈移位寄存器输 出的第一组即为地址种子,第二组为第一个可用的地址,如图4所示的地址1, 依次类推。
设k是地址的长度,k的取值与磁盘大小有关;为了保证地址发生器所生产 的地址能够随机地分散到磁盘的多个角落,线性反馈移位寄存器产生的地址要 覆盖磁盘的地址空间;例如:当磁盘大小为220时,那么k的取值就可以设为20; 按照上述方法理论上可以以获取2k/k个地址信息,远远超过实际需要的地址个 数;这种方式能够产生足够多的地址。
地址发生器的核心是线性反馈移位寄存器;地址发生器采用软件实现线性 反馈移位寄存器;初始化时,地址发生器为线性反馈移位寄存器随机生成反馈 函数以及地址种子;该反馈函数一直使用,直至再次地址发生器初始化;地址 发生器初始化的内容包括:设置地址种子的长度,设置每次生成地址的数量, 重新生成反馈函数,重新生成地址种子。
存取单元负责从磁盘中还原系统重启信息,以及将系统重启信息存储到磁 盘中;基于秘密共享方案,将系统重启信息分拆为多个份额,并这些份额分散 存储到磁盘中多个位置;与之对应的,当用户需要获知系统的重启次数时,则 根据秘密共享方案,从磁盘中多个位置收集足够多的份额执行还原操作,恢复 系统重启次数;存取单元就是上述这一思想的完成者;只要保证份额存储地址 的机密性,就可以保证系统重启信息不会被篡改;存取单元将份额分散地存储 于磁盘的多个角落;由于份额存储地址的机密性,攻击者无法直接篡改份额, 除非更换整个磁盘,否则无法篡改系统重启信息;
存取单元采用拉格朗日插值公式作为秘密共享的实现方案;具体来讲,存 取单元随机构造一个t-1次多项式,形如:
f(x)=(at-1xt-1+at-2xt-2+…+a1x+s)mod p,
其中at-1,at-2,…,a1均为随机选择,p为大素数,s是系统重启信息;该多项 式需要秘密保护,不能被攻击者所获知,存取单元完成份额的生成或秘密还原 后,需要将多项式擦除,不能存储于不可信的磁盘上,以免攻击者获取该多项 式;
当存取单元准备将s分割为n个份额时,就随机选择xi,并计算多项式在n 个不同位置xi处的值bi=f(xi),(xi,bi)则是将分散存储的份额,存取单元根据地 址发生器的地址,将份额隐藏存储于磁盘中;当存取单元拟恢复系统重启信息 s,存取单元根据地址发生器的提示,获取t个份额,这样就可以获得由t个方程 组成的方程组,通过解此方程组即可还原多项式,进而得知系统重启次数s;
b 1 = ( a t - 1 x 1 t - 1 + a t - 2 x 1 t - 2 + . . . + a 1 x 1 + s ) mod p b 2 = ( a t - 1 x 2 t - 1 + a t - 2 x 2 t - 2 + . . . a 1 x 2 + s ) mod p . . . . b t = ( a t - 1 x t t - 1 + a t - 2 x t t - 2 + . . . a 1 x t + s ) mod p ]]>
需要说明的是:n将远远大于t;这是因为存取单元将份额存储于磁盘时,并 不会告知操作系统该磁盘空间已被使用,这就导致操作系统会在无意识的覆盖 份额的内容;为了保证存取单元有足够多的份额,还原系统重启信息s,存取单 元会产生足够多的份额,即使一部分份额被操作系统覆盖或改写,也不会导致 存取单元无可用份额使用的情况出现。
散列表用于标识上一次系统重启时能正常使用的份额;如上所述,操作系 统并不知道份额存储于磁盘何处,就有可能在后继工作中占用份额存放的存储 空间,导致存取单元所使用的份额被其无意识中被修改,不再可用;为了提高 系统效率,使用散列表标识分散存储每个份额是否可用,以防止存取单元在分 散和还原系统重启信息时再次读取已经不可用的份额,进行不必要的工作。
散列表标识份额可用性的方法如下:散列表使用比特0和1表示指定位置份 额的可用性,其中,1表示该份额可用,0表示份额不可用;散列表使用0或1在 散列表中的位置来标识份额的地址信息;例如:散列表前五个比特值为01001表 示,在地址发生器所产生的第二个地址和第五个地址所存储的份额可用;当地 址发生器产生的地址位于磁盘的特殊位置(如磁盘引导扇区)时,通过修改散 列表将其设置为不可用,以避免由于系统重启计数信息的修改,导致磁盘数据 丢失。
控制单元负责控制和协调系统重启计数器各成分的工作;控制单元的核心 任务包括:
①初始化系统重启计数器;
②利用TPM的支持,解封地址种子;
③驱动存取单元,从磁盘中还原系统重启信息s;
④执行系统重启次数递增操作,并驱动存取单元完成系统重启信息的分散 存储;
⑤将系统重启信息输出给用户,且将完整性度量值扩展到TPM PCR(可信 平台模块平台配置寄存器)中,供用户验证系统重启信息的可信性。
本发明选择TPM作为硬件支持,具有类似功能的TPCM也可应用于本发 明。TPM是由国际TCG组织所倡导的一种硬件,现已经配备到主流计算机系统 中。TPCM是由我国设计和研究的,旨在替代TPM的自主知识产权的硬件。在 对本发明的硬件支持上,TPCM完全可以替代TPM。在产品实现上,只需要更 新相关的命令即可。
本发明基于线性反馈移位寄存器产生地址,但不排斥其它地址发生方式。 典型的可以利用对称加密算法反复加密得到的密文流作为地址。本发明选择线 性反馈移位寄存器的原因在于其初始向量仅需要一个地址种子即可,进而可以 减少TPM封装和解封的数据量(主要考虑到TPM有限的计算能力,为了提高计 算效率,TPM的封装和解封的数据量应该尽可能量的少)。
本发明采用基于拉格朗日插值公式的秘密共享方案,但不排斥其它秘密共 享实现方案。基于拉格插值公式的秘密共享方案相对简单,易于实现,这是本 发明选择其作为分割重启计数信息的原因所在。不过,还存在若干其它秘密共 享实现方案。
本发明在从多个份额还原系统重启信息时,采用大数表决方式来确定被篡 改的份额,但不排斥其它方法。一种典型的方法可以秘密存储校验信息,即随 同秘密份额一同存储系统重启信息的杂凑值,这样可以容易的查找哪些份额已 经被破坏,从而可以减少大数表决方式所依赖的多次还原操作,但是这种方式 会导致磁盘中存储的秘密数据增加(增加了杂凑值),数据被操作系统覆盖的 风险也相应增加。