刘涛,董亚楠
(四川大学计算机学院,成都 610000)
无校验值比对的可信链建立方法
刘涛,董亚楠
(四川大学计算机学院,成都 610000)
可信平台模块(TPM)具有对度量校验值进行硬件级保护等特点,在可信引导过程中起到至关重要的作用,进而有力保障用户计算环境的安全性。然而目前尚有大量不具备TPM硬件的计算机,如何实现其可信引导从而建立安全的计算环境仍然亟待解决。针对在没有TPM硬件的环境中度量校验值安全性难以保证的问题,提出一种无校验值比对的可信链建立方法。这种方法采用在操作系统引导时输入密钥来动态解码二进制指令流的模式,充分利用在操作系统引导这一特殊时期软硬件环境尚不完整,尝试破解密钥代价高昂的特点。通过实验验证这种方法的有效性。
可信链;可信度量;可信引导
随着信息产业的高速发展,个人电脑、手机、智能终端等电子设备越来越普及。然而普及的背后隐藏着越来越巨大的信息安全危机。电脑病毒、手机病毒、木马后门等不安全的因素层出不穷,给广大用户带来了严重威胁。病毒常常篡改操作系统运行所必须的关键部分,并偷偷在用户不知情的情况下运行,从而达到监视用户行为,盗取破坏用户敏感数据之目的。
保障系统启动过程的安全性对于建立安全的计算环境至关重要。为了保证系统的启动过程是安全可信的,文献[1]和[5]采用了可信链机制:即先确立一个可信任的根,从这个根出发,对下一个启动步骤进行可信度量,如果度量成功,则将其纳入可信链,并将系统控制权交给它;反之则认为该步骤被篡改,不可信而启动失败。不断重复这一过程,可信链不断延长,直至系统启动完毕。那么就可以认为,系统的启动过程是可信的,安全的。可信根是可信链的起点;可信度量则决定了可信链延展性。这两项在可信链的建立过程中相辅相成,缺一不可。
正是由于可信根和可信度量在可信链建立过程中的重要性,工业界和学术界普遍采用将二者结合的办法,即构建一个专门的安全芯片TPM(Trusted Platform Module)[1,4-5],它既作为整个系统的可信根,又作为可信度量的场所,它内部有专门的硬件电路负责密钥存储,加解密计算等。即使在没有内置TPM硬件的环境中,为了实现可信引导,很多人也采用外置类似TPM功能硬件的方法,如文献[2]中提出的USB-key等等。
由于TPM硬件(以及类似TPM功能的硬件)目前的普及率和大众认知度不高(在淘宝网上搜索TPM硬件条目数便可窥一二),这导致很多计算机难以实现可信引导而长期处于安全风险中。因此从实用的角度出发,如何在没有TPM硬件的条件下建立可信链,进而提供一个便捷、安全的计算环境是眼下的当务之急。文献[3]实现了一种无需TPM硬件实现可信引导的方法,其基本思想是在引导系统时引入一个精简Linux环境,对目标系统进行可信度量,然后与保存在精简Linux环境中的度量校验值进行比对,从而判定目标系统的可信与否。这种方法的不足之处在于存储在软件环境中的度量校验值安全可靠性难以得到保证。本文将介绍一种在没有TPM情况下不依靠校验值比对实现可信引导的解决办法。
1.1 可信根
计算机系统的启动需要经历如下过程,以PC启动位于硬盘上的Linux为例[1]:计算机上电后,首先完成硬件自检,接着执行BIOS中的代码完成硬件初始化,然后读入并执行MBR中的代码,MBR其实包含了grub引导程序的stage1,接着执行grub的stage1_5,stage2,最后将控制权交给Linux内核vmlinuz完成Linux操作系统的启动,如图1所示。
图1 无TPM的Linux启动过程
在引入了TPM的计算机系统中,Linux操作系统的启动过程与之前相比增加了TPM的可信度量环节:计算机上电完成硬件自检,TPM度量BIOS中代码;BIOS初始化硬件,TPM度量MBR代码;执行MBR中grub引导程序的stage1,TPM度量stage1_5;执行stage1_5,TPM度量stage2;执行stage2,TPM度量vmlinuz;执行vmlinuz,至此Linux操作系统启动完成,如图2所示。
可信根应该有度量下一步可执行代码正确性的能力,否则就不能实现可信链的传递和延展。计算机上电、硬件自检、BIOS初始化硬件这三步的可执行代码常常位于主板的ROM中,对普通用户而言难以修改,通常由硬件生产厂家直接提供,几乎不具备度量的能力,因此不适宜作为可信根。对于普通用户而言,唯有位于磁盘上的代码是易于修改的,因此MBR或bootloader等作为在BIOS初始化硬件完毕后执行的第一步外部代码则可以经过修改而具备度量功能(比如修改grub或Linux中有关bootsector的代码)。既然这些代码位于磁盘上,对于普通用户是易于修改的,对于恶意程序或恶意用户来说也是易于修改的,那么如何保证这些代码的安全性?本文将在第二部分可信度量中做进一步分析和探讨。
图2 有TPM的Linux启动过程
1.2 可信度量
常见可信度量方法[1,3-5]可以简单总结为下面四步:(1)输入度量目标;(2)按照一定度量算法计算;(3)将度量结果与存储在某处的度量校验值进行比对;(4)根据比对的结果判断度量目标是否可信。如图3所示。前人的研究工作主要集中在第二步和第三步上,如在第二步中采用复杂的加解密算法,在第三步采用将校验值存储在TPM等特殊软硬件环境等方式来确保校验值的正确性和安全性。
图3 可信链建立过程中的常见度量步骤
这种依赖校验值比对的方式有一定弊端:恶意用户或程序可能通过某种途径获得或修改这个校验值,绕过复杂的度量算法,从而控制系统。如文献[7]提出利用LiveCD修改Linux登录密钥的方法就是一种变相修改校验值的方法。
一个更好的办法是在可信链的建立过程中移除校验值比对这一薄弱的环节,即不保存所谓的校验值,从而消除校验值比对带来的潜在威胁。这种方法的流程如图4所示:度量目标事先被一定的可逆加密算法加密(如位运算、DES加密等,由于加解密算法不在本文研究范围内,所以不再详述),到需要度量该目标时,提示用户输入密钥,然后将这个密钥不加验证地用于解密算法中进行运算。此时无论是真密钥还是假密钥,无论被度量目标被篡改与否,都可以运算得到一个二进制流的结果,然后系统跳转到该结果处继续执行。只有真密钥和未篡改的度量目标解码出来的结果才是有效的二进制指令流从而被正确执行。这样只能通过系统的运行行为(如正常开机、正常启动)而非存储在某处的校验值比对来判断密钥和度量目标的真伪。
图4 无校验值比对的度量步骤
利用上述无校验值比对的可信度量方式,可按如下过程建立可信链:假如操作系统启动需要经过5个步骤:s1,s2,s3,s4,s5,其中前一步包含了对后一步的解密算法,如s1的代码中包含了对s2的解密算法。写在磁盘上的操作系统代码已经按照上面5个步骤划分成了5块,并已经分别按照相应的加密算法进行了加密。当然s1不需要加密,因为它的上一步是BIOS,而BIOS中的代码不具备解密功能。当启动计算机时,上电、硬件自检、BIOS初始化硬件这三步不变,接着BIOS把控制权交给s1,s1完成自身特定功能后提示用户输入用于解密s2的密钥,如果密钥正确且s2没有被篡改,s2将得以正确解密而完成自身特定功能并提示输入解密s3的密钥;反之不能得到正确的s2代码而永远不能进行后续步骤,s3,s4,s5与此类似,不再赘述。
恶意程序不能破坏、增删s1-s5中任意一个环节,否则都将使得后续步骤的解密失败,因为这样会破坏数据的完整性从而导致解密运算得到的二进制流与原始可执行的二进制指令流不一致,使得启动不能继续进行。对于恶意程序来说,有可乘之机的地方在BIOS与s1处,即在BIOS与s1间增加一个环节。如引导区病毒(Boot sector viruses),它可以先于正常引导程序运行,待完成自身任务后将控制权交给正常引导程序。如何防范引导区病毒不在本文的讨论范围之列,文献[6]给出了一些常见的防范办法,本文不再赘述。但是近几年引导区病毒破坏力有限,在dos、win95时代猖狂一时,但在Linux和windowsNT时代的破坏却鲜有耳闻,现代操作系统已经具备有成熟的虚拟内存保护和管理机制,使得引导区病毒无机可乘。由此s1,s2,s3,s4,s5构成了一条可信链。
笔者在Linux-0.12基础上开发了一个小型的操作系统内核,它由两部分组成:引导程序和内核。它的启动将依次进行下面的步骤:上电,硬件自检,BIOS初始化硬件,BIOS将控制权交给引导程序,引导程序度量内核并将控制权交给内核,运行内核完成系统启动。
BIOS中可设置的启动引导设备有软盘、硬盘、光盘、U盘等等。理论上说这些设备都可以作为实验对象,但软盘由于其结构简单,设置方便,因此我们选用软盘作为引导介质。实验环境为:debian-7.0.0作为宿主操作系统,版本号为1.1.2的qemu虚拟机。
2.1 模拟度量目标没有被篡改条件下的运行情况
(1)实验步骤
①编译并制作正常可以启动的操作系统内核system。
②编写以位运算作为加密手段的加密程序encrypt.c,设置好加密参数,将system加密为e_system。
③编写带解密算法的引导程序boot.s,并编译成boot.bin。
④将引导程序boot.bin和加密后的内核e_system一并写入软盘镜像fakedisk.img中。
⑤用这个软盘镜像启动qemu虚拟机,运行参数为:qemu-system-i386-m 8-fda fakedisk.img。
(2)实验结果(如图5、图6)
2.2 模拟度量目标被篡改条件下的运行情况
(1)实验步骤
①编译并制作正常可以启动的操作系统内核system。
②编写以位运算作为加密手段的加密程序encrypt.c,设置好加密参数,将system加密为e_system。
③模拟篡改行为,随机修改e_system中的几位,得到f_system。
④编写带解密算法的引导程序boot.s,并编译成boot.bin。
⑤将引导程序boot.bin和篡改后的内核f_system一并写入软盘镜像fakedisk.img中。
图5 输入正确密钥,正常运行打印出标识
图7 输入正确密钥,不能正常运行打印出标识
⑥用这个软盘镜像启动qemu虚拟机,运行参数为:qemu-system-i386-m 8-fda fakedisk.img。
(2)实验结果(如图7、图8)
2.3 实验结果说明
实验发现当输入正确密钥且度量目标没有被篡改时,度量目标被还原成正确可执行的二进制指令流,正常运行并打印出标识;当输入错误密钥或度量目标被篡改时,度量目标被计算成无意义的二进制流,当跳转到该结果处执行后,虚拟电脑由于执行错误指令而出现“死机”的状态。
上述可信链建立过程中没有任何校验值比对,杜绝了恶意程序和用户修改或窃取度量校验值从而绕过可信度量的隐患。如果采用暴力破解密钥的办法,那么每尝试一次密钥就需要重启电脑一次;如果是在VirtualBox、qemu类的虚拟机中破解,每次尝试也需要重启虚拟机。这也是操作系统启动引导过程的特殊性,因为此时系统没有完全运转起来,不能提供完整的软硬件环境。相比于其他暴力破解方式(系统完全运转起来,使用破解软件,开启上百个线程,每秒尝试上万个密钥),这种暴力破解的代价是相当大的。
图6 输入错误密钥,不能正常运行打印出标识
图8 输入错误密钥,不能正常运行打印标识
按照文中设计的无校验值比对的可信链建立方式,构建具有可信度量功能的操作系统引导程序。实验结果表明,这种不依赖校验值比对的可信链建立方式是可行的。这为广大没有TPM硬件的用户提供了一种保障自身计算环境安全的新思路。
[1]吴刚.面向Xen安全计算机中可信链的可信引导及可信设备虚拟化[D].华南理工大学,2011.
[2]张帆,张聪,陈伟,等.一种无需操作系统的硬件级可信度量方法[J].华中科技大学学报:自然科学版,2014(11):6-10.
[3]姚金魁,张涛,王金双,陈融,施祖清.一种不依赖TPM的安全引导方式的设计与实现[期刊论文].计算机技术与发展,2012(6)
[4]谭良,周明天.基于可信计算平台的可信引导过程研究[J].计算机应用研究,2008,25(1):232-234.
[5]赫芳,刘毅,庄禄.面向云计算平台的可信度量研究[J].信息网络安全,2013(1):5-7.
[6]Boot sector.https://en.wikipedia.org/wiki/Boot_sector
[7]利用LiveCD修改root密钥.http://luyx30.blog.51cto.com/1029851/1092928/
A Way of Building Trusted Chain Without Checksum Validation
LIU Tao,DONG Ya-nan
(College of Computer Science,Sichuan University,Chengdu 610000)
The trusted platform module(TPM)is capable of protecting validation checksum from hardware level perspective,and plays a vital role in guaranteeing the safety of computing environment.However there are a lot of computers running without TPM,how to guarantee their safety is still unsolved.For that reason,proposes a way of building trusted chain without checksum validation.This method dynamically decodes binary instructions at boot time,taking full advantage of the characteristics that cracking key at initialization moment will be costly.Finally the effectiveness of the proposed method is verified by experiment.
Trusted Chain;Trusted Measurement;Trusted Startup
1007-1423(2016)33-0009-05
10.3969/j.issn.1007-1423.2016.33.002
2016-10-08
2016-11-15
刘涛(1990-),四川资阳人,在读硕士研究生,研究方向为嵌入式操作系统
董亚楠(1990-),女,河北保定人,在读硕士研究生,研究方向为嵌入式操作系统