论文部分内容阅读
可扩展固件接口(EFI)是英特尔公司为其新一代64位安腾处理器设计的计算机平台固件和操作系统或其他应用软件之间的一种新型程序接口规范,它同时兼容英特尔32位平台,是现有传统BIOS的升级方案。同传统BIOS相比,EFI提供了极大的可扩展性和可定制性。EFI定义了许多重要的数据结构以及系统服务,实现这些数据结构与系统服务,就相当于实现了一个可用的BIOS核心。EFI开发软件包(EDK)是英特尔公司对EFI规范的实现,英特尔已公布其源码和设计结构,其大部分代码为C语言开发,有很大的开发灵活性。英特尔同时发布EFI开发软件包相关的各种技术文档,以方便相关开发工作。随着对BIOS攻击的日益增多,实现安全可信BIOS的要求日益紧迫。EFI并没有解决BIOS面临的安全威胁。而且EFI大部分程序由C语言实现,因此EFI面临更大的被恶意修改和攻击的威胁,这对EFI的安全性提出了更高的要求。对EFI安全性的研究是目前的研究热点。目前针对EFI安全的研究大多基于TPM安全芯片来建立可信链,而TPM芯片现在应用并不广泛。因此本文采用应用更为普遍的USB Key构建可信根,以EFI DXE阶段前的代码为根原点建立可信链。建立基于EFI的可信链是实现可信EFI的基础,本文主要研究EFI可信链中EFI驱动和应用程序的加载校验过程。EFI下驱动和应用程序均以EFI Image形式加载,本文针对EFI Image加载过程提出两种校验方案——白名单文件方案和EFIImage文件头嵌入签名的方案。白名单方案需要在系统中设置白名单文件记录所需校验的EFI Image的文件路径和散列值,在加载EFI Image时,需要首先查找白名单文件中相关记录并计算比对散列值;而EFI Image文件头嵌入签名的方案则需要对EFI Image文件的散列值进行签名,并将签名值存储于EFI Image文件自身中,在加载EFI Image文件时直接从其自身文件中读出签名值,解密得到散列值,然后计算比对散列值。通过对两种方案的优缺点的对比分析,本文最后选用白名单文件方案进行实现。在白名单文件方案的实现过程中,通过分析与调试英特尔EFI架构开源代码,准确定位EFI中加载驱动与应用程序Image文件的函数入口点,掌握EFI下应用程序、驱动程序和服务的开发过程。基于以上工作,在EFI下成功驱动USB Key设备,以系统服务形式实现了MD5算法,并初步实现了EFI可信链建立的关键技术——EFI驱动和应用程序加载时的完整性校验。