杨少鹏,陈 佳,冯中华
(中国电子科技集团公司第三十研究所,四川 成都 610041)
随着全球信息化的飞速发展,网络信息技术的持续演进,计算机网络已经成为当今世界必不可少的高新技术之一。互联网对整个经济社会发展的渗透、驱动作用越来越明显,带来的风险挑战也在不断扩大。
随着《国家安全法》和《国家网络空间安全战略》的发布,以及近期发生的“斯诺登”事件、“震网”病毒攻击、”勒索”病毒攻击等安全事件,网络空间安全技术已成为关系到国家利益和安全的核心技术。
网络攻击的基本步骤包括搜集信息、实施入侵、上传程序、下载数据和保持访问。研究表明,信息系统中主要的安全事件都源于不安全的终端。病毒、木马、黑客等攻击行为利用终端上的安全弱点,在终端上发起攻击,并通过网络感染或破坏其他系统。例如,现在流行的APT 攻击具有结构复杂、手段高超、破坏严重、处理棘手、防范困难等特点。APT攻击的手段主要是在目标基础上建立并扩展立足点来获取信息,在一个很长的时间段内潜伏并反复对目标进行攻击,突破传统安全系统的防御措施。
目前,有效的安全防御手段是“控”和“防”相互结合,从终端源头进行控制,对用户行为规范进行安全管理和控制,从系统层面进行防御和预警。病毒、木马、黑客等攻击行为都是可执行程序,所以终端层面的控制就是通过可执行文件运行控制,即计算机运行可信。
计算机可信的主题思想是“行为的可预期性”,即通过可信根建立的一系列可信信任链,最后到应用程序可信。这里的可信是相对于可信源(即度量值)来说的,满足预期的度量值即为可信。所以,在商用可信中,如何获取度量值,从哪里开始比对度量值非常关键。操作系统启动时,开始度量的阶段越靠前,可信度越高,被篡改的机会越少。
目前,市面上使用的可信系统大多是基于硬件平台设计的。可信系统通过增加额外的硬件、固件、中间件来实现操作系统的运行可信。例如,可信BIOS 是对BIOS 进行安全加固,是整个计算平台安全的基石,只有保证BIOS 的安全可信,上层的操作系统和应用程序才具有安全基础;可信平台模块(Trusted Platform Module,TPM)是基于安全芯片实现的可信,实现数字签名、数据加解密和数据的访问控制,主要实现硬件的可信度量[1]。
基于硬件的可信计算机系统在易用性和可靠性上还有所不足,主要表现在以下几个方面。
(1)可信固件的改造和适配是一个复杂和长期的工作,只有新定制的计算机才具有可信BIOS的能力,已经在使用的计算机无法安装可信BIOS。
(2)安全芯片存储容量有限,内部无法存储大量摘要值,无法实现全覆盖。
(3)外接硬件容易受到供电、工艺水平等影响,有时无法识别,影响使用性。
(4)市面上的可信计算系统,在操作系统关键文件度量失败后无法自动完成修复,操作系统无法进入,影响系统的使用性和便捷性。
本文实现的可信系统软件为纯软件形态,以信任链传递技术为基础,通过软件白名单技术,实现对计算机操作系统文件和可执行文件摘要值的度量,在系统启动过程中建立可信链,达到对用户行为规范进行安全管理和控制,同时起到有效防范恶意代码的作用,确保运行的程序都是合法的、可知的和可信的。
可信系统软件是在现有计算机操作系统中安装部署,不涉及硬件的改动和操作系统的变动,在操作系统启动前开始度量,提高可信度。
操作系统的启动过程是一个复杂的过程,不同的操作系统具有相似但各不相同的启动方式和过程。系统启动是一个操作系统必经的阶段,是一个操作系统得以稳定运行的基础。操作系统文件和内核是操作系统的重要组件,运行在操作系统上的程序无时无刻在与系统文件进行交互。因此,操作系统文件和内核的可信运行对操作系统的安全增强至关重义。可执行文件是计算机上运行的单元,它们直接被用户使用,是操作系统与用户的接口。从安全角度上看,可执行文件的运行对操作系统安全构成了威胁。
计算机系统的启动过程,如图1 所示。计算机加电后首先执行系统主板BIOS 中的自检程序,而后根据CMOS 设置的启动顺序加载介质上的引导程序。以硬盘优先引导为例,BIOS 通过JMP 指令转跳到启动设备的主引导记录(Master Boot Record,MBR)。如果计算机上只安装了一个操作系统,那么系统将直接载入操作系统的内核镜像,然后启动操作系统[2]。如果该计算机上同时安装多个操作系统,则MBR 将会被Boot Loader(操作系统启动装载器)所覆盖,然后由用户进行配置和选择要启动的操作系统。
图1 操作系统启动流程
操作系统可信增强的设计思想是“根据预制的可执行文件的摘要值,确保可执行文件按照预期的行为运行”。根据操作系统启动原理及启动过程之间的依赖关系,在MBR 阶段、操作系统启动装载器阶段和操作系统启动后3 个阶段,通过“软能力”对操作系统运行进行安全增强,确保操作系统运行环境安全可信。同时,对操作系统启动关键文件进行备份和自动恢复,确保操作系统文件异常后能够快速实现文件恢复,提高操作系统的可用性和安全性,如图2 所示。
2.2.1 MBR 的可信
MBR 占据硬盘的一个扇区,它在磁盘的物理地址为0 磁头0 柱面1 扇区,大小为512 B。对MBR进行度量需要读取磁盘物理位置上的块数据,需要通过BIOS 提供的读写磁盘13H 号中断功能来实现。若MBR 异常,操作系统无法被正常引导。
图2 操作系统安全增强示意
2.2.2 OS Loader(操作系统装载器)的可信
在商用计算机中,OS Loader 处于MBR 和操作系统之间,主要职责用于引导操作系统,并把CPU控制权递交给它。
OS Loader 对其进行可信认证的关键在于要从磁盘扇区中读取引导程序文件数据。引导程序文件在磁盘中的位置是不固定的,且所在扇区也不一定是连续的,需要通过读取文件系统的结构元数据来定位,流程如下:
(1)获取OS Loader 所在分区的文件系统类型;
(2)根据文件系统类型加载相应的文件系统解析库;
(3)通过文件系统解析库读取引导文件数据,并验证其完整性。
2.2.3 操作系统的可信度量和备份恢复
操作系统的可信验证与OS Loader 的可信验证基本相同,也是验证文件的完整性。但是,操作系统的文件类型和数量远不止一个,包括操作系统的配置文件、主内核文件、内核驱动文件、系统服务程序文件、系统接口库文件等。通过文件采集工具,将要度量的操作系统文件摘要值计算加密保存,同时将文件进行加密存储。
操作系统文件度量时,若摘要值比对失败,则通过接口计入PE 操作系统,自动执行文件恢复程序,实现操作系统文件的自动恢复。
2.2.4 可执行文件的可信度量
可执行文件的运行控制是根据白名单机制,通过摘要值比对控制文件的运行,使文件的运行是可预期的。可执行文件的摘要值需提前采集。
Windows 系统的运行控制模块是通过内核驱动实现的。当可执行文件运行时,驱动拦截将要加载的可执行文件,计算可执行文件的摘要值判断此程序是否在可信列表中,如果在列表中则允许运行,否则拒绝运行。
可执行文件控制技术在Windows XP/2003 与Windows Vista/7 的实现方法不同,前者采用SSDT HOOK 技术,后者采用Windows 过滤平台(Windows Filter Platform,WFP)技术。中标麒麟系统的可信运行控制基于Linux 安全模块(Linux Security Module,LSM)框架实现。LSM 框架是一个针对Linux 内核的安全框架,在访问系统内核的资源接口处注册HOOK 函数接口,在进程访问系统资源前对进程行为进行控制[2]。
可信系统软件主要分为操作系统启动前的可信度量和操作系统启动后的可信度量两部分,主要工作流程如图3 所示。
图3 可信系统软件工作流程
(1)以一个干净的操作系统作为可信源进行操作系统文件和可执行文件的摘要值采集,并加密存储于操作系统硬盘;
(2)操作系统启动前,输入认证口令;
(3)口令认证成功后,对操作系统文件开始度量,操作系统文件度量值比对成功后进入操作系统;若操作系统文件度量值比对失败,则进入文件恢复阶段恢复异常的系统文件,恢复成功后重新度量进入操作系统;
(4)进入操作系统后,可执行软件若要运行,需与存储的摘要值进行比对,比对成功可以运行,比对失败禁止运行;
(5)用户可以根据需求,通过软件界面动态调整摘要值库文件。
本文基于“软能力”的可信系统软件是基于Windows XP 系统实现的,可以对操作系统文件进行摘要值度量和恢复,同时对可执行文件进行摘要值度量,在系统运行过程中建立可信传递,确保运行环境是可控的、可信的。
操作系统启动前的可信增强基于Grub4Dos 源码实现,通过grubinst.exe 程序覆盖系统原来的MBR,通过MBR 查找并加载grldr,在Grub 阶段完成操作系统文件的安全度量。若操作系统文件度量失败,则进入文件恢复模式进行受损文件的恢复。操作系统启动后的可信增强基于C/C++实现,包括应用层界面程序和驱动层程序。内核驱动实现可执行文件的安全度量,驱动程序以服务方式随操作系统自启动,确保系统环境运行安全可信。
3.1.1 采集源环境准备
计算机操作系统安装完成后,进行多杀毒引擎、多轮次全盘杀毒,确保操作系统采集源环境是安全的、可信的,后面将以此作为比对的基础。
3.1.2 文件采集和备份
通过可信系统软件提供的采集和备份工具,将操作系统启动过程中的exe、dll、sys、ini 等文件进行摘要值采集,形成摘要值数据链,加密保存到hmldr.cfg 文件中。涉及的主要函数包括AddHashToFile(char*filepath,char*filehash)、SetGrubPwd(char*pcszpwd)和AddFileToBackDirec(char*filepath)。AddHashTofile 函数将采集的操作系统内核文件的路径和计算的摘要值写入hmldr.cfg 中。SetGrubPwd 函数设置Grub 引导界面的登录口令,用于操作系统登录身份认证。Add FileToBackDirec 函数负责将操作系统内核文件备份。
Grub 包 括Stage1 和Stage2 阶 段。Stage1 实 现Bootloader 的功能;Stage2 是一个小型的操作系统,有自己的API 函数[3]。
本文通过Grub4Dos 0.4.5 版本源码实现操作系统文件安全度量和文件恢复。
备份操作系统原MBR,然后将Grub 程序安装到MBR,使其能够加载编译的新文件grldr。通过grubinst.exe 程序,将Grub4Dos 中的Stage1(512 B)安装到硬盘的MBR。运行脚本执行grubinst-savembr=MBR.sav(hd0),安 装GRLDR MBR 到 第 一 块硬盘并保存原来的MBR 到MBR.sav 文件中,确保MBR 被破坏后能够及时恢复引导区,确保操作系统可用。操作系统启动后,BIOS 执行软中断调用,加载MBR 至0x7c00 并跳转执行,Stage1 开始执行,然后加载Stage2 并跳转执行,Stage2 中的微型操作系统启动,完成对操作系统文件的安全度量。
(2)操作系统文件度量和文件恢复。操作系统文件的度量和恢复是在Stage2 阶段实现的,具体实现逻辑如图4 所示。
图4 文件度量和恢复逻辑
操作系统文件度量和文件恢复功能是在stage2.c 代码中实现,stage2 的入口是stage2/asm.S。asm.S 在设置好C 运行环境后,调用第一个函数init_bios_info(stage2/common.c)。该函数在执行一些底层的初始化后,调用stage2 的main 函数cmain,在cmain 函数中实现度量和恢复功能,其伪代码如下:
(1)计算机开机后,BIOS 引导MBR,然后加载Grub,执行stage2.c 中的cmain(void)函数;
(2)通过函数exec_cmdline 执行”inputpwd--cfgfile=/hmldr/hmldr.cfg--cfgpwd=%s--boot”,实现Grub 登录的口令认证;
(3)执行”graphicsmode-1 800 600 32”和”font/hmldr/hmldr.fnt”,进行背景图片和字体设置,用于展示操作系统文件度量过程;
(4)check_system_integrity 函数用来实现操作系统文件摘要值比对,通过_grub_open、grub_read等一系列函数读取操作系统文件,计算摘要值,通过grub_memcmp 函数实现摘要值比对,将结果通过函数display_check_progress 展示到显示器,方便用户直观看到操作系统文件摘要值正常或异常;
(5)如果所有文件度量成功,则执行”chainloader(hd0,0)+1”,启动操作系统;
(6)若某个文件摘要值度量失败,则进入恢复操作系统文件阶段,执行命令”{map--mem/hmldr/pe.iso(0xff)”,”map--hook”,”root(0xff)”,”chainloader--force(0xff)”,”boot”},操作系统会加载PE 镜像文件进入PE 模式;
(7)修改PE.iso 镜像,将文件备份恢复程序添加到自启动项中,PE 系统进入后自动执行文件恢复,文件修复完成后重启操作系统。
3.3.1 可执行文件初始化摘要值采集
可信系统软件初次安装时,需要用户根据需求扫描磁盘,计算并保存可执行文件摘要值,以此作为可执行文件基础白名单。
3.3.2 可执行文件白名单增加和删除
可信控制功能生效后,新增的可执行文件运行会被拦截。为满足操作系统用户的使用需求,需要对白名单进行高效的增加或删除。系统用户可以在软件界面进行可执行文件摘要值的删除。
可执行文件摘要值的增加包括两种方式。
(1)先运行,后添加。可执行文件尝试运行,驱动拦截模块捕捉可执行文件产生的摘要值形成拦截日志,用户可以将拦截的摘要值添加到白名单中,添加成功后可执行文件可以运行;
(2)先添加,再运行。用户可以通过软件界面进行可执行文件的添加,可执行文件的摘要值添加到白名单中,添加成功后可执行文件可以运行。
可执行文件采集流程如图5 所示。
Windows 系统的可执行文件可信度量由底层驱动实现。可执行文件运行时,驱动拦截运行的可执行程序,然后通过计算可执行程序的度量值判断此程序是否在白名单中。如果在白名单中则允许运行,否则拒绝运行。
图5 可执行文件摘要采集
在Windows XP 系统,采用SSDT HOOK 技术实现可执行文件运行拦截。系统服务描述符(System Service Descriptor Table,SSDT)是应用层到内核层的一个通道,将应用层的Win32 API 与内核层的Native API 串联起来。可执行文件运行时,通过调用kernel32 的API 转 移 到ntdll.dll 和notskrnl.exe,最后通过SSDT 检索调用Native API 函数。通过HOOK 系统服务描述表中函数的地址,用自定义的函数地址替换原函数地址,实现可执行文件的拦截处理,具体原理如图6 所示。
图6 可执行文件可信度量
具体实现逻辑代码如下。
(1)编写sys 驱动程序,以服务方式注册到操作系统,实现驱动自动加载。
(2)在驱动中修改SSDT 内存保护机制[4]。在内核中修改内存,可以修改CR0 寄存器,关闭写保护属性实现,也可以使用内存描述符表(Memory Descriptor List,MDL)方式修改内存。前者只支持32 位,后者32 位和64 位都支持。使用MDL 修改内存具体流程如下:首先,调用MmCreateMdl 函数分配足够大的MDL 结构映射给指定的缓冲区;其次,调用MmBuildMdlForNonPagedPool 函数更新MDL 对物理内存的描述;最后,调用MmMapLockedPages函数将MDL中描述的物理页面映射到虚拟内存中,并返回映射地址。
(3)修 改SSDT 表,KeServiceDescriptorTable→ServiceTableBase[XX]=HKFun。
(4)在HKFun 函数中,实现可执行文件摘要值的计算和比对,并将结果返回给应用层。
本文在Windows XP 系统上实现了基于“软能力”的操作系统可信度量与恢复,实现了从MBR阶段到可执行文件运行的可信链建立,确保了操作系统运行环境的可信。在解决系统完整性保护方面,该技术可以起到基础保护作用,但从信息系统安全的整体角度来看,需与其他安全技术相结合(如防火墙、入侵检测),才能使整个信息系统更加安全、可信。
目前,该软件功能已经得到验证,但在使用中有一些不足,后期需要改进。
(1)摘要值比对算法优化问题。当摘要值数量庞大时,检索时间会较长,目前使用的是二分法查找。
(2)Grub 引导代码不能识别所有的文件系统,目前支持的类型包括NTFS、FAT12、FAT16、FAT32、EXT2 以及EXT3。
(3)驱动控制模块实现过程中,由于SSDT HOOK 的不稳定性,现在使用较多的是通过回调函数PsSetCreateProcessNotifyRoutineEx实现进程拦截。