UEFI BIOS Rootkit Analysis

catalog

1. BIOS简介
2. UEFI BIOS
3. EFI编程简介
4. UEFI Rootkit

 

1. BIOS简介

BIOS("Basic Input Output System 基本输入输出系统),它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制

0x1: 芯片简介

BIOS设置程序是储存在BIOS芯片中的,BIOS芯片是主板上一块长方形或正方形芯片,只有在开机时才可以进行设置(一般在计算机启动时按F2或者Delete进入BIOS进行设置,一些特殊机型按F1、Esc、F12等进行设置)。BIOS设置程序主要对计算机的基本输入输出系统进行管理和设置,使系统运行在最好状态下,使用BIOS设置程序还可以排除系统故障或者诊断系统问题,BIOS本质是一段代码组成的程序,但是它与一般的软件还是有一些区别,而且它与硬件的联系也是相当地紧密。形象地说,BIOS应该是连接软件程序与硬件设备的一座"桥梁",负责解决硬件的即时要求。主板上的BIOS芯片或许是主板上唯一贴有标签的芯片,一般它是一块32针的双列直插式的集成电路,上面印有"BIOS"字样

1. ROM

在微机(微型计算机Microcomputer System)的发展初期,BIOS都存放在ROM(Read Only Memory,只读存储器)中。ROM内部的资料是在ROM的制造工序中,在工厂里用特殊的方法被烧录进去的,其中的内容只能读不能改,一旦烧录进去,用户只能验证写入的资料是否正确,不能再作任何修改。如果发现资料有任何错误,则只有舍弃不用

2. EPROM

EPROM(Erasable Programmable ROM 可擦除可编程ROM)芯片可重复擦除和写入,解决了ROM芯片只能写入一次的弊端。EPROM芯片有一个很明显的特征,在其正面的陶瓷封装上,开有一个玻璃窗口,透过该窗口,可以看到其内部的集成电路,紫外线透过该孔照射内部芯片就可以擦除其内的数据,完成芯片擦除的操作要用到EPROM擦除器。EPROM内资料的写入要用专用的编程器,并且往芯片中写内容时必须要加一定的编程电压(VPP=12—24V,随不同的芯片型号而定)。EPROM的型号是以27开头的,如27C020(8*256K)是一片2M Bits容量的EPROM芯片。EPROM芯片在写入资料后,还要以不透光的贴纸或胶布把窗口封住,以免受到周围的紫外线照射而使资料受损

3. EEPROM

由于EPROM操作的不便,586以后的主板上BIOS ROM芯片大部分都采用EEPROM(Electrically Erasable Programmable ROM 电可擦除可编程ROM)。通过跳线开关和系统配带的驱动程序盘,可以对EEPROM进行重写,方便地实现BIOS升级

4. NORFlash

从奔腾时代开始,现代的电脑主板都使用NORFlash来作为BIOS的存储芯片。除了容量比EEPROM更大外,主要是NORFlash具有写入功能,运行电脑通过软件的方式进行BIOS的更新,而无需额外的硬件支持(通常EEPROM的擦写需要不同的电压和条件),且写入速度快,需要明白的是,在方便系统管理员的同时,也为黑客向机器种植Rootkit带来了便利

需要明白的是,不管采用什么持久化存储方式,主板和BIOS交互的接口方式都是不变的,主板从中读取代码数据并执行

0x2: 主要程序

1. 主要I/O设备的驱动程序和中断例程
BIOS中中断例程即BIOS中断服务程序。它是微机系统软、硬件之间的一个可编程接口,用于程序软件功能与微机硬件实现的衔接。DOS/Windows操作系统对软盘、硬盘、光驱与键盘、显示器等外围设备的管理即建立在系统BIOS的基础上。程序员也可以通过对INT 5、INT 13等中断的访问直接调用BIOS中断例程
由于BIOS直接和系统硬件资源打交道,因此总是针对某一类型的硬件系统,而各种硬件系统又各有不同,所以存在各种不同种类的BIOS,随着硬件技术的发展,同一种BIOS也先后出现了不同的版本,新版本的BIOS比起老版本来说,功能更强

2. 系统设置程序
微机部件配置情况是放在一块可读写的CMOS RAM芯片中的,它保存着系统CPU、软硬盘驱动器、显示器、键盘等部件的信息。关机后,系统通过一块后备电池向CMOS供电以保持其中的信息。如果CMOS中关于微机的配置信息不正确,会导致系统性能降低、零部件不能识别,并由此引发一系列的软硬件故障。在BIOS ROM芯片中装有一个程序称为"系统设置程序",就是用来设置CMOS RAM中的参数的。这个程序一般在开机时按下一个或一组键即可进入,它提供了良好的界面供用户使用。这个设置CMOS参数的过程,习惯上也称为"BIOS设置"。新购的微机或新增了部件的系统,都需进行BIOS设置

3. POST上电自检
微机接通电源后,系统将有一个对内部各个设备进行检查的过程,这是由一个通常称之为POST(Power On Self Test 上电自检)的程序来完成的。这也是BIOS的一个功能。完整的POST自检将包括CPU、640K基本内存、1M以上的扩展内存、ROM、主板、CMOS存贮器、串并口、显示卡、软硬盘子系统及键盘测试。自检中若发现问题,系统将给出提示信息或鸣笛警告
在自检成功后将磁盘相对0道0扇区上的引导程序装入内存,让其运行以装入DOS系统

4. 自检程序
在完成POST自检后,ROM BIOS将按照系统CMOS设置中的启动顺序搜寻软硬盘驱动器及CDROM、网络服务器等有效的启动驱动器,读入操作系统引导记录,然后将系统控制权交给引导记录,由引导记录完成系统的启动

Relevant Link:

http://baike.baidu.com/item/bios

 

2. UEFI BIOS

新型UEFI,全称"统一的可扩展固件接口"(Unified Extensible Firmware Interface),是一种详细描述类型接口的标准。这种接口用于操作系统自动从预启动的操作环境,加载到一种操作系统上
可扩展固件接口(Extensible Firmware Interface EFI)是Intel为PC固件的体系结构、接口和服务提出的建议标准。其主要目的是为了提供一组在OS加载之前(启动前)在所有平台上一致的、正确指定的启动服务,被看做是有近20多年历史的BIOS的继任者
与legacy BIOS 相比,UEFI最大的几个区别在于

1. 编码99%都是由C语言完成
2. 一改之前的中断、硬件端口操作的方法,而采用了Driver/protocol的新方式 
3. 将不支持X86实模式,而直接采用Flat mode(也就是不能用DOS了,现在有些EFI或UEFI能用是因为做了兼容,但实际上这部分不属于UEFI的定义了)
4. 输出也不再是单纯的二进制code,改为Removable Binary Drivers 
5. OS启动不再是调用Int19,而是直接利用protocol/device Path 
6. 对于第三方的开发,BIOS基本上做不到,除非参与BIOS的设计,但是还要受到ROM的大小限制,而UEFI就便利多了 
7. 弥补BIOS对新硬件的支持不足的毛病 

0x1: 结构

UEFI使用模块化设计,它在逻辑上可分为

1. 硬件控制
2. OS软件管理
//操作系统 -> 可扩展固件接口 -> 固件 —> 硬件

根据UEFI概念图的结构,可把UEFI概念划为两部分

1. UEFI的实体(UEFI Image)
根据UEFI规范定义,UEFI Image包含三种
    1) UEFI Applications
    uEFI Applications是硬件初始化完,操作系统启动之前的核心应用,比如: 启动管理、BIOS设置、uEFI Shell、诊断程式、调度和供应程式、调试应用...等等
    2) OS Loaders
    OS Loaders是特殊的uEFI Application,主要功能是启动操作系统并退出和关闭uEFI应用 
    3) UEFI Drivers 
    uEFI Drivers是提供设备间接口协议,每个设备独立运行提供设备版本号和相应的参数以及设备间关联,不再需要基于操作系统的支持

2. 平台初始化框架
uEFI框架主要包含两部分
    1) PEI(EFI预初始化)
    PEI主要是用来检测启动模式、加载主存储器初始化模块、检测和加载驱动执行环境核心
    2) 驱动执行环境(DXE)
    DXE是设备初始化的主要环节,它提供了设备驱动和协议接口环境界面 

0x2: 优点

1. 纠错特性
与BIOS显著不同的是,UEFI是用模块化、C语言风格的参数堆栈传递方式、动态链接的形式构建系统,它比BIOS更易于实现,容错和纠错特性也更强,从而缩短了系统研发的时间。更加重要的是,它运行于32位或64位模式,突破了传统16位代码的寻址能力,达到处理器的最大寻址,此举克服了BIOS代码运行缓慢的弊端

2. 兼容性
与BIOS不同的是,UEFI体系的驱动并不是由直接运行在CPU上的代码组成的,而是用EFI Byte Code(EFI字节代码)编写而成的。Java是以"Byte Code"形式存在的,正是这种没有一步到位的中间性机制,使Java可以在多种平台上运行。UEFI也借鉴了类似的做法。EFI Byte Code是一组用于UEFI驱动的虚拟机器指令,必须在UEFI驱动运行环境下被解释运行,由此保证了充分的向下兼容性
一个带有UEFI驱动的扩展设备既可以安装在使用安腾的系统中,也可以安装在支持UEFI的新PC系统中,它的UEFI驱动不必重新编写,这样就无须考虑系统升级后的兼容性问题。基于解释引擎的执行机制,还大大降低了UEFI驱动编写的复杂门槛,所有的PC部件提供商都可以参与=

3. 鼠标操作
UEFI内置图形驱动功能,可以提供一个高分辨率的彩色图形环境,用户进入后能用鼠标点击调整配置,一切就像操作Windows系统下的应用软件一样简单

4. 可扩展性
UEFI将使用模块化设计,它在逻辑上分为硬件控制与OS(操作系统)软件管理两部分,硬件控制为所有UEFI版本所共有,而OS软件管理其实是一个可编程的开放接口。借助这个接口,主板厂商可以实现各种丰富的功能。比如我们熟悉的各种备份及诊断功能可通过UEFI加以实现,主板或固件厂商可以将它们作为自身产品的一大卖点。UEFI也提供了强大的联网功能,其他用户可以对你的主机进行可靠的远程故障诊断,而这一切并不需要进入操作系统

5. 图形界面
目前UEFI主要由这几部分构成
    1) UEFI初始化模块
    2) UEFI驱动执行环境
    3) UEFI驱动程序
    4) 兼容性支持模块
    5) UEFI高层应用
    6) GUID磁盘分区组成
UEFI初始化模块和驱动执行环境通常被集成在一个只读存储器中,就好比如今的BIOS固化程序一样。UEFI初始化程序在系统开机的时候最先得到执行,它负责最初的CPU、北桥、南桥及存储器的初始化工作,当这部分设备就绪后,紧接着它就载入UEFI驱动执行环境(Driver Execution Environment DXE)。当DXE被载入时,系统就可以加载硬件设备的UEFI驱动程序了。DXE使用了枚举的方式加载各种总线及设备驱动,UEFI驱动程序可以放置于系统的任何位置,只要保证它可以按顺序被正确枚举。借助这一点,我们可以把众多设备的驱动放置在磁盘的UEFI专用分区中,当系统正确加载这个磁盘后,这些驱动就可以被读取并应用了。在这个特性的作用下,即使新设备再多,UEFI也可以轻松地一一支持,由此克服了传统BIOS捉襟见肘的情形。UEFI能支持网络设备并轻松联网,原因就在于此

值得注意的是,一种突破传统MBR(主引导记录)磁盘分区结构限制的GUID(全局唯一标志符)磁盘分区系统将在UEFI规范中被引入。MBR结构磁盘只允许存在4个主分区,而这种新结构却不受限制,分区类型也改由GUID来表示。在众多的分区类型中,UEFI系统分区用来存放驱动和应用程序

Relevant Link:

http://baike.baidu.com/item/UEFI

 

3. EFI编程简介

0x1: 背景

可扩展固件接口(EFI—Extensible Firmware Interface)最早可追溯到1998年的Intel Boot Initiative(IBI)项目。现在EFI规范主要由一些公司财团来开发和维护(包括Intel和Microsoft),定义了为系统固件导出的一系列API和数据结构,可以被下列客户端所使用

1. 操作系统加载器(boot loader)
2. 操作系统
3. EFI设备驱动
4. EFI诊断和系统工具
5. EFI命令解释器(shells)

0x2: 标准EFI开发环境

要开始进行UEFI开发,需要用到两个开发包

1. EFI开发工具(EDK)
该工具包里含有TianoCore(Intel的UEFI参考实现的公开部分)的源代码、许多范例和二进制的EFI Shell,我们可用make系统构建工具来构建,甚至还可以在Win32 UEFI模拟器中构建,这样可以更方便地开发和测试

2. EFI工具集(EFI Toolkit) 

0x3: EFI开发简介

1. 生成支持EFI二进制文件的GNU编译器工具链
2. 利用该工具链,编译GNU EFI软件包,该软件包提供了EFI编程接口的初始集合,如果在EFI程序用到了某些GNU EFI不能提供的EDK功能,我们可以从EDK源代码中引入相关代码

Relevant Link:

http://blogs.ejb.cc/archives/4211/introduction-to-efi-programming
http://h17007.www1.hp.com/docs/iss/proliant_uefi/sch_help/v24599840.html
http://www.intel.cn/content/www/cn/zh/architecture-and-technology/unified-extensible-firmware-interface/uefi-driver-and-application-tool-resources.html

 

4. UEFI Rootkit

https://github.com/hackedteam/vector-edk
http://blog.trendmicro.com/trendlabs-security-intelligence/hacking-team-uses-uefi-bios-rootkit-to-keep-rcs-9-agent-in-target-systems/

Copyright (c) 2015 Little5ann All rights reserved

posted @ 2017-04-23 10:17  郑瀚Andrew  阅读(2991)  评论(0编辑  收藏  举报