计算机基本输入输出系统安全研究
2013-03-19严霄凤
严霄凤
工业和信息化部计算机与微电子发展研究中心(中国软件评测中心)北京 100048
0 引言
计算机基本输入/输出系统(Basic Input/Output System,BIOS)是固化在计算机主板上一个ROM芯片中,计算机通电后首先执行的一组程序,是硬件与软件程序之间的接口。其功能包括上电自检及初始化、硬件中断处理、程序服务处理等。为计算机提供最底层、最直接的硬件控制,在计算机系统中起着非常重要的作用。
由于BIOS在计算机架构中独特和优越的位置,使其成为整个计算机系统的关键和灵魂。运行在BIOS级别上的代码将对计算机系统具有很强的控制能力,BIOS一旦受到恶意破坏将可能直接导致整个硬件系统瘫痪。如果攻击者作为针对企业的复杂、有针对性网络攻击的一部分,对BIOS进行恶意修改将可能造成永久的拒绝服务攻击(如,损坏BIOS)或使恶意软件长期存在(如,在BIOS中植入恶意软件)。
1 BIOS
BIOS固件有几种不同的类型。一些计算机使用16位的传统 BIOS,而许多新的系统使用基于统一可扩展固件接口(Unified Extensible Firmware Interface,UEFI)规范的引导固件。
系统 BIOS通常由原始设备制造商(OEM)和独立 BIOS供应商开发,并利用计算机硬件分发到最终用户。制造商经常通过更新系统固件来修复错误、为漏洞打补丁和支持新的硬件。系统 BIOS通常存储在电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,EEPROM)或其他形式的闪存上,并可由最终用户修改。
对于一个给定的计算机系统,除了主板之外,BIOS还可能存在于硬盘驱动器控制器、显卡、网卡上及其他附加卡上。这类固件通常采用扩展ROM的形式,在引导过程中由系统固件装载和执行。
1.1 BIOS的作用
系统BIOS的主要功能是初始化硬件组件和加载操作系统,其启动过程通常包括以下几个阶段:
(1)执行可信核心根:系统BIOS可能包括一个小的固件核心块——通常称为BIOS引导块,BIOS引导块被首先执行并能够验证其他固件组件的完整性。对于可信计算应用,系统BIOS还可能包含度量可信核心根(CRTM)。
(2)初始化和测试底层硬件:在启动过程中,系统BIOS初始化并测试计算机系统硬件的关键件,包括主板、芯片组、内存和CPU等。
(3)加载并执行附加固件模块:系统BIOS执行固件附加件,扩展系统BIOS的能力或初始化启动系统所需的其它硬件组件。这些附加模块可以存储在与系统 BIOS相同的 flash memory或初始化的硬件设备(如,视频卡、局域网卡)中。
(4)选择引导设备:配置系统硬件后,系统BIOS搜索引导设备(如,硬盘驱动器、光盘驱动器、USB驱动器),并执行存储在设备上的引导加载程序。
(5)加载操作系统:在 BIOS仍然控制着计算机的情况下,引导加载程序开始加载和初始化操作系统内核。当内核可用时,将计算机系统的主控制权从系统BIOS传给操作系统。
另外,系统BIOS加载系统管理中断(SMI)处理程序并初始化高级配置和电源接口(ACPI)表及其代码,为运行中的计算机系统提供重要的系统管理功能,如电源和散热管理等。
1.2 BIOS更新
合理更新系统BIOS的几种合法机制包括:
(1)用户启动更新:系统和主板制造商通常为用户提供能够更新系统BIOS的实用程序。今天大多数厂商提供的工具可以对用户正常运行的系统更新系统 BIOS。根据系统上实现的安全机制,这些工具可能直接更新系统BIOS或在下次系统重启时进行更新。
(2)管理更新:计算机系统可能具有基于硬件和软件的代理,允许系统管理员远程更新系统BIOS。
(3)回滚:在应用BIOS前对更新进行认证的BIOS实现方法也可以在更新过程中检查版本号。在这种情况下,系统BIOS可能进行一个特殊的更新过程,将安装的固件回滚到一个以前安装的版本,防止攻击者用具有已知漏洞的固件刷新闪存。
(4)人工恢复:为了从被损坏或发生故障的系统 BIOS中恢复,许多计算机系统允许用户在启动过程中,在用户亲自参与的情况下,用已知良好的版本和配置取代正在使用的系统BIOS。
(5)自动恢复:有些计算机系统能够检测系统 BIOS的损坏,并从主系统BIOS的一个单独存储位置(如,第二个闪存芯片,或硬盘驱动器上的一个隐藏分区)的备份固件镜像中恢复。
为了保证只有真实、合法的BIOS映像可以存储在闪存中,需要确保BIOS更新机制的安全。客户端系统通常只有一条更新BIOS的路径,而服务器系统可能实现多种更新机制,使管理员能够从不同的环境更新 BIOS。对于服务器系统,经认证的BIOS更新机制包括以下三种类型:
(1)更新机制1:随时可进行BIOS更新。可以不考虑服务器的运行状态安全进行BIOS更新。
(2)更新机制2:重启时进行BIOS更新。在服务器运行时启动BIOS闪存处理,但直到系统重启时才对BIOS闪存进行实际更新。
(3)更新机制3:重启时进行BIOS验证。在每次引导程序执行前验证BIOS的真实性,只有通过认证的BIOS才被执行。
此外,某些服务器可能不使用这三个经认证的更新机制,而使用安全本地更新机制更新系统BIOS。
1.3 更新可信根
基本服务器的体系架构类似于具有单一BIOS更新机制的客户端PC系统。通常情况下,基本服务器上的更新可信根(RTU)是系统BIOS的一部分。硬件保护可以集成使用可信平台模块(TPM)和基于芯片组的锁定机制。
RTU是硬件和固件的可信组合,执行BIOS安全更新并保持BIOS的完整性。RTU可能具有验证经数字签名的映像、启动和停止写保护机制、将BIOS更新写入闪存、执行BIOS恢复以及更新RTU本身等功能。RTU本质上可信的基础是通过一个独立的运行环境将破坏RTU功能的风险降到最低,从而保持RTU固有的可信性。RTU的每个功能组件可以看作特定功能的一个可信根:
(1)验证组件:验证经数字签名的映像,决定是否应将控制传给映像。因为该组件是从已知良好的机器状态进入的,所以具有可信的执行路径。验证组件可以用于将可信执行扩展到缺乏完整性保护的代码。
(2)恢复组件:负责将机器返回到一个已知的良好状态。
(3)完整性组件:负责保持映像的完整性。
(4)更新组件:执行RTU的安全更新,保持RTU的完整性。
2 BIOS面临的安全风险
系统BIOS的安全性问题可以归结为其完整性保护的问题,系统BIOS完整性可能面临各种不同的攻击威胁。系统BIOS完整性遇到的第一个威胁来自系统通过供应链从制造商到用户的过程。在系统BIOS安全到达用户的情况下,在系统的整个生命周期中系统 BIOS完整性面临的风险可能包括:
(1)用户安装恶意系统BIOS。通常用户更新系统BIOS的主要方法是利用BIOS更新工具进行BIOS更新操作。在用户亲自访问计算机系统的情况下,通常没有什么办法防止用户安装未经批准的BIOS映像。
(2)恶意软件修改系统BIOS。恶意软件利用弱BIOS安全控制或系统BIOS本身的漏洞对系统BIOS进行刷新或修改。通常目的的恶意软件一般不包含这样的功能,但是一个针对企业的攻击可能直接把目标指向企业的系统 BIOS。恶意的系统BIOS可能通过网络或利用介质传递到系统。
(3)系统管理工具对系统BIOS进行攻击。基于网络的系统管理工具可以被攻击者用来进行企业范围内系统BIOS的攻击。例如,假设一台企业维护的,用于企业部署,执行系统BIOS更新功能的服务器受到攻击,被攻破的服务器可能将恶意的系统BIOS传播到整个企业的计算机系统。
(4)将系统BIOS回滚到脆弱的版本。这是一种特别隐秘的攻击,因为此时的系统BIOS虽然是真实的(即来自于制造商的),但它存在漏洞,是很脆弱的,很容易受到攻击。
对于服务器,同样容易受到威胁客户端系统相同形式的BIOS攻击。另外,服务器还将面临以下方面的风险:
(1)更新机制存在漏洞。服务器具有多个 BIOS更新机制,每个机制都可能存在漏洞,更新机制之间的交互还可能带来额外的安全漏洞。
(2)管理网络缺乏必要保护。服务器中的服务处理器(SP)拥有更高的权限来执行系统管理,其中可能包括对BIOS的修改。虽然 SP可以通过一个独立的通信通道控制,但对此通道未经授权的访问将对服务器造成很大的风险。通常对数据网络有许多专门的安全保护,但对管理网络可能缺乏必要的审查和保护。
(3)BIOS备份被恶意修改。如果安全保护不充分,攻击者很容易对备份在服务器上的BIOS映像实施改写攻击。对BIOS备份修改后,攻击者可以采用相应的方式使服务器重新启动被感染的BIOS备份映像。
3 BIOS风险缓解
BIOS安全是安全系统的一个重要组成部分。作为引导过程中第一个执行的代码,系统BIOS被系统中的硬件和软件组件隐含认为是可信的。系统BIOS风险缓解的主要工作是防止攻击者对系统BIOS进行未经授权的修改,保证其完整性。客户端系统的安全风险缓解措施——BIOS更新认证、闪存区域完整性、安全本地更新和防止旁路,直接适用于服务器级,其目的是减轻针对系统BIOS的高级持续性攻击的风险。另外,由于服务器体系结构的复杂性和服务器具有的BIOS多更新路径的特点,还应对BIOS映像进行授权和认证,确保BIOS映像的完整性和来源的正确性。
3.1 BIOS安全
通过保护BIOS更新机制的安全,确保在BIOS被配置后能够保持其完整性。安全的BIOS更新机制应包括:
(1)一个验证BIOS更新真实性和完整性的过程;
(2)一个确保不能从安全更新过程之外修改BIOS的机制。
通过认证来验证BIOS更新映像是否由真实的来源产生且没有被改变。
3.1.1 BIOS更新认证
经认证的BIOS更新机制采用数字签名确保BIOS更新映像的真实性。使用经认证的BIOS更新机制更新BIOS,应有一个RTU,其中包含一个签名验证算法和密钥存储,密钥存储应包括验证BIOS更新映像签名所需的公钥或合法的密钥加密哈希值。密钥存储和签名验证算法应以保护方式存储在计算机系统上,并保证只能通过经认证的更新机制或安全本地更新机制进行修改。在RTU内存储空间有限的情况下,BIOS更新映像的验证可以分两个阶段建立:(1)验证所提供公钥的加密哈希值,(2)利用所提供的公钥验证BIOS更新的签名。
经认证的更新机制应确保BIOS更新映像已经过数字签名,并且可以在更新BIOS前使用RTU中的密钥验证数字签名。恢复机制也应使用经认证的更新机制,或满足安全本地更新的要求。RTU应能防止未授权将BIOS更新到一个较早的真实版本。例如,通过验证确保更新BIOS映像的版本号高于当前使用BIOS映像的版本号。
3.1.2 安全本地更新
BIOS可以选择使用安全本地更新机制代替经认证的更新机制对系统BIOS进行更新。安全本地更新机制,应仅用于加载第一个BIOS映像或从不能使用经认证的更新机制对损坏的系统BIOS进行修复的情况。安全本地更新机制应通过要求管理员本人亲自参与服务器更新操作,确保BIOS更新映像的真实性和完整性,降低远程攻击者执行恶意代码将BIOS映像改写为一个虚假系统BIOS映像的风险。进行安全本地更新,可以通过要求在允许更新系统BIOS前输入管理员口令或解锁物理锁(如,主板上的跳线)实现进一步的安全保护。
3.1.3 固件完整性保护
为了防止执行虚假或恶意的BIOS代码,在启动过程中,应保持系统BIOS验证和系统BIOS执行之间系统BIOS的完整性。
为了防止在经认证的BIOS更新过程之外意外或恶意修改系统BIOS,应采用适当的机制保护系统BIOS,确保不能从经认证的BIOS更新过程之外修改BIOS。确保系统BIOS完整性的保护机制,应在 RTU外部的代码执行之前引用。BIOS完整性保护应通过硬件机制强制执行,并只能通过合法的机制(如,系统复位)停止。
如果可以在经认证的 BIOS更新机制之外修改系统BIOS(如,无法锁定闪存),则应在每个更新前使用RTU验证组件认证BIOS映像的完整性。如果认证失败,RTU应将其自动恢复到受保护的真实 BIOS。自动恢复机制可降低拒绝服务攻击(如,攻击者可能加载一个不真实的BIOS,将系统置于无法开机的状态)的风险。
应保护每个 RTU避免来自经认证的更新机制外部的修改。确保RTU完整性的保护机制应在RTU外部的代码执行前引入。RTU完整性保护应通过硬件机制强制执行,并只能通过合法的机制(如,系统复位)停止。
3.1.4 防止旁路
除了通过用户亲自参与的安全本地更新机制外,经认证的BIOS更新机制应是对系统BIOS进行修改的唯一机制。系统及相应的系统组件和固件的设计应确保,除了用户亲自参与的安全本地更新机制外,不存在绕过经认证的更新机制安装和执行未经认证的BIOS代码的方法。任何能够绕过经认证的更新机制的方法都可能形成漏洞,允许恶意软件修改系统BIOS或用非法BIOS映像覆盖系统闪存。
经认证的更新机制应是对RTU进行修改的唯一机制。除了用户亲自参与的安全本地更新机制外,不应存在绕过经认证的更新机制修改RTU的方法。
为了获得对性能和管理的改进,计算机平台实现的功能可以让系统部件能够直接访问 RTU或系统 BIOS,具有对BIOS闪存的读访问权限,但应防止系统组件直接修改系统BIOS。
3.2 更新机制安全
一个服务器可以实现三个典型安全BIOS更新机制中的一个或多个,实施的方法取决于平台上的硬件支持。这些方法的区别在于,什么时候可以建立一个RTU,并且闪存安全锁定机制可用,以防止意外或恶意修改BIOS闪存中存储的代码和数据。所有的机制都依赖于一个数字签名的BIOS更新映像,以及使用公钥验证该映像签名的RTU验证组件的能力。
3.2.1 更新机制1:随时可进行BIOS更新
更新机制 1可以在系统运行时使用 SMI处理程序、SP或其他安全方法更新BIOS闪存,而不要求重启系统。新的BIOS在系统重启时执行。执行此BIOS更新机制要求:
(1)按照BIOS更新认证要求对BIOS更新映像进行数字签名。
(2)运行时可用一个RTU更新BIOS闪存。
(3)存在一个锁定机制,使得只有RTU可以写入BIOS闪存。
(4)将数字签名的BIOS更新映像传给一个RTU,RTU有能力将BIOS更新映像存储在不允许对BIOS更新映像进行未授权写访问的位置。
实施此机制的一般步骤是:
(1)将数字签名的BIOS更新映像传送给RTU。
(2)RTU将BIOS更新映像存储在只能被RTU写入的位置。
(3)RTU验证BIOS更新映像的真实性。
(4)RTU将通过认证的BIOS更新映像写入BIOS闪存。
(5)RTU依据固件完整性保护要求,确保在将控制传给RTU外部的代码(如,扩展ROM)之前锁定BIOS闪存。
此安全更新机制能够防止将虚假的代码写入 BIOS闪存,所以在启动过程中没有必要验证BIOS。
3.2.2 更新机制2:重启时进行BIOS更新
更新机制2在服务器运行时启动BIOS闪存处理,但是,直到服务器重新启动时才进行实际的 BIOS闪存更新。此BIOS更新机制能够防止将虚假的代码被写入BIOS闪存。执行此BIOS更新机制要求:
(1)按照BIOS更新认证要求对BIOS更新映像进行数字签名。
(2)存在一个锁定机制,使得运行时只有RTU可以写入BIOS闪存。
(3)RTU在系统启动期间可用于更新BIOS闪存。系统重启时在更新BIOS闪存之前执行RTU,RTU在闪存发生任何变化前验证BIOS更新映像的数字签名。
(4)存在一个内容受保护的存储位置,运行时可以缓存签名的BIOS更新映像,系统重启时,在更新BIOS闪存前,RTU可以访问它来验证BIOS更新映像的数字签名。
实施此机制的一般步骤是:
(1)将数字签名的 BIOS更新映像缓存在服务器重启时内容受保护的存储位置。
(2)服务器重启时将执行权传给RTU。
(3)RTU验证BIOS更新映像的真实性并将通过认证的更新写入BIOS闪存。
(4)在执行不可信代码前,启用BIOS闪存锁定机制。
3.2.3 更新机制3:启动时进行BIOS验证
更新机制3不存在运行时保护BIOS闪存的锁定机制或因其局限性,不能防止RTU以外的实体写入BIOS闪存,可能发生对 BIOS闪存的恶意更新。在每次启动时执行 BIOS前应对BIOS闪存内容进行认证,如果认证确定BIOS闪存是不真实的,启动自动恢复过程,且不执行不真实的 BIOS更新。执行此BIOS更新机制要求:
(1)按照BIOS更新认证要求对BIOS更新映像进行数字签名。
(2)在BIOS更新映像写入闪存之前验证其数字签名。
(3)按固件完整性保护要求,RTU能够在执行之前对系统BIOS进行验证。RTU验证组件在启动时执行并在BIOS更新代码执行之前进行验证。
(4)如果确定系统BIOS不真实,RTU启动自动恢复过程将其恢复到受保护并且是真实的系统BIOS。
实施此机制的一般步骤是:
(1)验证数字签名的BIOS映像,并将其写入BIOS闪存。
(2)开机时将执行权传给RTU,RTU验证BIOS的真实性。
(3)如果BIOS闪存是真实的,将执行权传给BIOS。
(4)如果BIOS闪存是虚假的,RTU启动一个恢复过程,将其恢复到受保护并且是真实的BIOS版本。
3.3 服务处理器安全
服务器与客户机之间的主要区别是在服务器系统中包括一个服务处理器(SP)。SP在管理和监视服务器的过程中起着关键的作用,并承担者更新系统BIOS的角色。
SP作为可信根:服务器中的SP可能具有直接更新BIOS闪存以及本身的闪存或其它存储介质的能力,某些或全部SP环境可用作系统BIOS的RTU。为了保持服务器固件的完整性,必须保护SP的执行环境,防止恶意代码更新 BIOS或SP闪存。根据BIOS安全原则,SP器应满足下列要求:
(1)通过经认证的更新机制更新SP代码、加密密钥和存储在SP闪存中的静态数据。
(2)控制SP环境,保证只有经过认证的代码可以在SP上执行。
(3)对与SP交互的用户进行授权。
SP不作为可信根:一些具有 SP的服务器可能不把 SP用作RTU 进行BIOS更新。为了确保SP环境无法绕过BIOS保护,系统中的SP不应直接对BIOS闪存进行写访问。此外,SP不应在主机操作系统控制范围之外直接并且无限制地访问服务器上的系统内存,防止SP干扰合法的更新过程。
[1]王斌等.BIOS级身份认证系统的设计及实现[J].北京:计算机工程与设计.2010.
[2]王越峰等.一种基于主板 BIOS的身份认证方案及实现[J].北京:中国教育信息化.2009.
[3]杨培等.BIOS安全防护技术研究[J].北京:计算机工程与设计.2008.
[4]李晨光.揭秘 TPM 安全芯片技术及加密应用[OL].IT168.2012.
[5]TCG Specification Architecture Overview Revision 1.4 2nd[S].August 2007.
[6]NIST SP 800-147,B IOS Protection Guidelines[S].April 2011.
[7]NIST SP 800-147B(Draft).BIOS Protection Guidelines for Servers(Draft)[S].July 2012.