一种基于哈佛体系结构的内核代码保护方法

文档序号:6482232阅读:188来源:国知局
专利名称:一种基于哈佛体系结构的内核代码保护方法
技术领域
本发明属于计算机安全领域,具体是Linux操作系统中一种保护内核代码的 方法。
背景技术
计算机操作系统向下管理硬件资源,向上为应用程序提供接口,在计算机 系统中扮演着重要角色。为了更好的利用底层硬件资源以及更好的为上层软件 提供服务,操作系统正变得日益复杂,最直接的体现就是操作系统代码的日益 复杂。例如当前最流行的两个操作系统Linux和Windows XP的内核代码分别为 430万行和4000万行。如此纷繁复杂的操作系统内核代码必定存在一些漏洞, 由此带来的安全隐患严重影响了计算机系统的安全性。
传统的保护内核代码的办法是基于段和页权限位的保护机制,另外还有一 些较为复杂的反病毒软件,这些防御措施大多试图阻止攻击者,挫败任何非法 操作,但是它们仅仅能够有效地防止一般的攻击者和低权限用户对内核的修改。 随着黑客技术特别是Rootlat技术的发展,攻击者们已经把触角伸入到了操作系 统的内核。操作系统的内核代码面临着严重的烕胁,而传统的保护机制并不能 很好的保护操作系统内核代码的安全。
针对现有内核代码保护存在的问题,我们提出了一种新的解决方法。在介 绍这种方法之前,我们有必要了解以下相关的背景知识。 哈佛体系结构
哈佛体系结构最早来源于Harvard Mark I计算机。与传统的冯诺依曼体系结构相比,哈佛体系结构中指令和数据的总线和物理存储都是分开的(如图1所 示)。这种方式的优势在于能够在一个时钟周期内同时读取指令和数据,相当于 减少了执行每一条指令所需的时钟周期。
由于哈佛体系结构中指令和数据分开存放,有各自的数据总线,因而在CPU 外部需要大量的数据线与存储器连接,不便于CPU的设计;另外,在哈佛内存 体系结构下,数据和指令需要明确分开处理,对程序员来说编程不够方便。由 于这些原因,哈佛体系结构现在已经很少看到。但是,在CPU的内部,通过采
用指令和数据分离的Cache以及TLB能够有效提高CPU指令执行的效率。可以 说哈佛体系结构的设计思想在当前的主流CPU中依然存在。 X86 CPU/Linux上的地址翻译
Linux在X86上的地址翻译过程使用了多级页表,这里只讨论最后一步,即 由线性地址到物理地址的转换过程。
CPU每产生一个线性地址,MMU就通过页表找到这个线性地址对应的物理 地址。页表的每一个表项称之为PTE (Page Table Entry,即页表项)。由于页表 位于主存中,如果需要的PTE表项不在高速缓存中将会导致一次额外的访存操 作,这个代价是非常大的。CPU的设计人员试图消除这样的开销,在MMU中 包含了一个关于PTE的小缓存,称为TLB (Translation Lookaside Buffer,旁路 转换缓冲,或称为页表缓冲)。
有了 TLB以后,MMU对线性地址和物理地址的转换速度得到了很大的提 升。有TLB之后的CPU对某个线性地址的访问如图2所示。 TLB和CPU流水线
虽然现在CPU的结构越来越复杂,但是一般来说指令在CPU中的执行过程
可以大致分为五个相对独立而义相互联系的过程取指、译码、执行、访存和写回。为了提高CPU执行指令的并行度,流水线的这五个过程应该要能够互不
干扰地运行,但是取指和访存这两个阶段都要访问内存,而内存在某一时刻却只能允许进行一次内存访问。为了能够让这两个阶段能够充分并行,设计者们
在CPU的内部引入了数据Cache和指令Cache,以及数据TLB (D-TLB)和指令TLB (I-TLB〉。这其实是一种哈佛体系结构的设计思想。这样CPU可以在取指和访存阶段两个阶段并行地进行地址翻译或者物理内存访问。CPU在取指阶段进行内存访问时,它会在指令TLB中寻找其指令的线性地址所对应的物理地址,而在访存阶段进行内存访问时,就会在数据TLB中寻找数据线性地址对应的物理地址(如图3所示)。

发明内容
本发明针对现有内核代码保护存在的问题,结合在虚拟化方面的研究,提出了一种基于虚拟化哈佛内存体系结构的方法。它将哈佛体系结构在安全方面的优势通过虚拟化技术融入到当前通用的、基于冯诺依曼体系结构的操作系统上,分离了操作系统对内核代码的指令操作和数据操作,从根本上防止了内核代码被修改。除此之外,本发明并没有试图完全阻止非法操作,而是巧妙的将这些操作重定向,这种方法能够"愚弄"任何试图篡改内核的操作,给他们造成操作已经成功的假象,攻击者不会察觉他们的操作已经失败而且还被记录了下来。
本发明运行于操作系统层,是一个轻量级的系统,采用引导非法操作的办法,能较好地保证内核代码的安全,还能够记录恶意操作的结果。对操作系统带来的性能损失很小,部署也非常方便。
本发明主要由如下儿部分构成第一部分是创建影子区域。影子区域页中也有一份内核代码,从而需要确定内核代码页和其影子页的映射关系。第二部分是建立内核代码页的双重地址映射机制。但双重映射机制建立后还不足以保护内核代码。第三部分是建立双重映射的保障机制。这样的保护机制一直能够
存在于系统中,持续的保护内核代码。系统的整体设计如图4所示。
1. 创建影子区域
在操作系统初始化的时候,向内核申请一段区域作为内核代码页的影子区域,为了不浪费内核空间,必须保证申请的这段区域的大小和内核代码区大小完全一致。申请成功之后,将内核代码拷贝一份,放入这个影子区域中。可以看到,每一个内核页在影子区域中都有一个内容完全一致的页面与之对应,我们将影子页域中的这一页称为原内核代码页的影子页。
建立影子区域的目的是要给攻击者造成假象,如果攻击者需要读内核代码页的内容,我们给他提供的就是真实的内核代码;如果是攻击者要篡改内核代码,那么影子区域就记录下来了这些篡改,而且对操作系统没有任何影响。
2. 建立内核代码页的双重地址映射机制
系统初始化时建立起了--个和内核代码页完全一致的代码区域。这个区域就是影子区域,所有针对内核代码的恶意操作都被导向到这里。我们用一个指针常量指向这个影子区域。这样, 一个内核代码页到影子页的一一映射已经形成。任何一个内核代码页的页号加上一个固定的值(影子区域首地址与内核代码首地址之差)就可以得到它对应的影子页的页号。
有了影子区域和内核代码的映射,我们可以确定任一内核代码页所对应的影子页的页号,从而在攻击者试图读写或者篡改某个内核代码页的内容时将这些恶意操作导向到其对应的影子页中。
本发明采用的方法是利用CPU上的两个TLB来实现这一点。因为一般的CPU的TLB有两个,分别为取值和数据操作过程中的地址翻译过程提供页表项的缓存,分别为I-TLB (指令TLB)和D-TLB (数据TLB)。在针对内核代码页的取指操作的地址翻译过程中,我们提供的页表项是原始的页表中的页表项;而在数据操作的地址翻译过程中,我们提供的则是修改过以后的页表项,这将会导致对内核代码的数据操作实际上是在影子区域中进行,保护了原始的内核代码。这种双重地址映射机制类似于哈佛内存体系结构的地址翻译过程,所以又称之为虚拟的哈佛内存体系结构。
针对内核代码的双重映射机制的建立也在系统启动时完成,位于影子区域的创建之后。图5说明了本发明的保护机制建立起来后对内核代码访问时的地址翻译过程。但是,双重映射机制的建立还不足以保护内核代码,本发明的第3部分就是用来保障这样的保护机制一直能够存在于系统中,持续的保护内核代码。
3.建立双重地址映射的保障机制
系统正常启动后,虚拟的哈佛内存体系结构就已经建立。这种双重地址映射机制需要修改后的页表项一直驻留于D-TLB中。 一般来说,Lmux内核代码页的页表项由于设置了 Global位,是不会被置换出TLB的。但是为了做到万无一失,需要确保在内核代码的页表项被换出TLB的情况下能够尽快的重新建立起虚拟的哈佛内存体系结构。
为了做到这一点,需要修改页错处理程序,在对内核代码卩(的操作出现页错的时候,重新建立起"双重"地址映射即虚拟哈佛内存体系结构,就像系统刚启动时-一样。其重新建立的过程与第2部分的过程相同。


图l:冯诺依曼体系结构和哈佛体系结构的差异图2: CPU访问内存过程中地址转换图3:流水线不同阶段的地址翻译图4:系统原型图
图5:对内核代码访问时的地址翻译过程
具体实施例方式
本发明的方法对硬件没有过多的要求,虽然是一种虚拟化技术,但是并不
需要CPU硬件虚拟化技术的支持,所以本发明的实验平台可以是一台普通配置
的计算机。如下表所示。
表1实验的软硬件配置
CPU操作系 内存 统内核所需软件和RPM包
Pentium4FcdoraLinux VersionGcc Version 4.0.0
512MB
3.00GHZCore 42.6.11-1.1369一FC4kernel-2.6.11-1.1369-FC4.src.rpm
本发明方法的实现需要重新编译内核。由于Fedora Core 4本身没有源码包,所以为了搭建起本发明的保护机制,首先必须安装当前操作系统的内核源码包。然后在当前的内核源码上进行修改,重新编译得到所需的内核。
在软硬环境基础上搭建实验的测试环境有四个步骤安装内核源码包,修改内核源码,重新编译内核,从新内核启动。1.安装内核源码包
在修改内核之前,必须要看到当前运行内核的源码树。FC4默认安装时没有包含内核源码包,/i:/usr/src/目录下看不到内核源码树。所以修改内核之前,首先要做的是安装内核源码包。具体安装过程不再详细介绍。2.修改内核源码
本发明的实施最主要是通过修改内核代码来完成的,其实现主要包括两个部分。第一部分主要是为了在系统启动时在内核代码区域建立起哈佛内存体系结构,它使得操作系统从启动时开始就能够较好保证内核代码的安全性。第二部分的主要是为了防止由于内核代码页的PTE被冲刷出TLB而引起的保护机制
的失效。这是对第一部分的补充,也是本发明能够持续保护操作系统的保障。其实现主要包括两个部分,下面将分别说明。(1)系统实现的第一部分
(a) 系统初始化时,在内核中分配一块与内核代码区大小相同的连续物理内存,作为内核代码的影子区域(P—D),并用一个只读的全局指针变量kernel—mirror指向它。然后把所有的内核代码都拷贝一份放入这个区域中。这个物理地址空间中所有页帧与内核代码空间中的页帧一一对应。内核代码页的第一个物理页帧的页号为text一start,影子区域的第一个物理页帧的页号为mirror—start,内核代码中物理页帧号为pfo所对应的影子页的页号为shadow(pfh)=pfn+(mirror—start-text—start)。
(b) 在操作系统的页表中,将所有内核代码页所对应的PTE中的物理页号pfh部分暂时改为这些页在对应的影子页页号(shadow(pfo)), R/W位改为1,并将这些PTE都导入到D-TLB中(读取某个页面上的一个字节即可让这个页面的PTE项被导入到D-TLB中)。
(c) 将页表中所有被修改的PTE的物理地址字段的值改回原始内容(pfh),并且将R/W位改为0 (只读)。这一部分的伪代码描述如下:
CreatKernelShadow(); 〃创建影子区域While(PagelnKemel) 〃遍历内核代码页
Modify(pte); 〃修改代码页对应的PTE项,将对应的影子页页帧号填入LoadToTlb(pte); 〃将修改后的PTE项导入D-TLB中Recover(pte); 〃恢复被修改的PTE项,并修改其权限为只读
(2)系统实现的第二部分
(a) 修改页错处理程序(page fault handler),加入以下功能判断页错类型,如果是由于试图写代码区引起的页错,则进入下一步。
(b) 重复第一部分的(b)和(c)。这一部分的伪代码描述如下
If(WriteKernelCode) 〃判读页错类型
While(PagelnKernel) 〃遍历内核代码页,再次建立起保护机制
Modify (pte);
LoadToTlb(pte);
Recover(pte);
3. 重新编译内核
完成了对内核的修改之后,接下来就是要编译新的内核源码,得到新的内核镜像。这一步骤很简单,但是需要较长的时间。这样生成了新的内核镜像文件后,主机重新启动时就能够从新的内核启动。
4. 从新内核启重启电脑,发现Grub的启动项里多了一项,这一项就是新内核的启动项。
选择新的内核,进入实现了虚拟化哈佛内存体系结构的系统中。
权利要求
1.一种工作在操作系统层的内核代码保护机制首先,在操作系统初始化的时候,向内核申请一段区域作为内核代码页的影子区域,申请成功之后,将内核代码拷贝一份,放入这个影子区域中。可以看到,每一个内核页在影子区域中都有一个内容完全一致的页面与之对应,称之为影子页。建立影子区域的目的是要给攻击者造成假象,如果攻击者需要读内核代码页的内容,我们给他提供的就是真实的内核代码;如果是攻击者要篡改内核代码,那么影子区域就记录下来了这些篡改,而且对操作系统没有任何影响。在建立了影子区域之后,一个内核代码页到影子页的一一映射已经形成。任何一个内核代码页的页号加上一个固定的值(影子区域首地址与内核代码首地址之差)就可以得到它对应的影子页的页帧号。有了内核代码页和影子区域之间的映射,就可以确定任一内核代码页所对应的影子页的页帧号,从而在攻击者试图读写或者篡改某个内核代码页的内容时将这些恶意操作导向到其对应的影子页中。本发明利用CPU上的两个TLB(Translation Lookaside Buffer,即旁路转换缓冲,或称为页表缓冲;里面存放的是一些PTE,即页表项),通过操纵它们的内容(内核代码页对应的PTE项)来实现这种双重地址映射机制(又称为虚拟的哈佛内存体系结构)。双重映射机制的建立还不足以保护内核代码,还需要保障这样的保护机制一直能够存在于系统中,持续的保护内核代码。这个过程通过在操作系统的页错处理程序中添加功能代码来完成。它能够保证在保护机制意外失效的情况下尽快的重新建立起这种保护机制。
2.如权利1所述,本发明所建立的内核代码保护机制的功能有在系统运 行期间,保护内核代码不被篡改,持续的保证内核代码的安全性;记录恶意操作的结构,保存在一个无害的区域,为安全人员对入侵的分析和取证提供有用 的信息。
3.如权利1或2所述的内核代码保护机制,其特征在于不同于传统的"阻挡"策略,本发明所采用的防御手段是"疏导"。通过重 定位非法操作的方法来进行防御,攻击行为得到的反馈不是操作失败,而是完 全没有反馈。这种做法有着明显的好处攻击者根本无法从我们的系统中获得 任何真实信息,包括其恶意操作是否成功的信息。它实际上被我们的系统所引 导到了一个无害的区域。而其他的一些一味阻止非法操作的防御手段,虽然它 们有效的防御一些威胁,但是攻击者在知道所用方法无效的情况下会获取失败 过程中的一些信息去选择其他可能的手段对系统进行攻击。在这一点上,本发 明的保护机制有着天然的优势。本发明属于轻量级实现,容易部署,且对操作系统各方面的影响很小。本 发明的保护机制在操作系统层实现,且代码量较少,实现起来很容易,只需给 系统的内核源码打上补丁然后重新编译内核即可。另外,本发明没有过多的增 加页错处理的时间,又充分利用了底层硬件的特性,因而对操作系统性能的损 耗非常小。另外,本发明提出的方法具有较高的安全性。由于保护机制的启动与操作 系统的启动同步进行,而保障机制也一直存在,所以本发明能够从操作系统启 动时开始,长时间持续的保护内核代码,没有给攻击者留有可乘之机。
全文摘要
本发明属于计算机安全领域,针对现有操作系统在对内核代码保护方面的不足,结合虚拟化技术的研究,提出了一种利用虚拟化哈佛内存体系结构保护内核代码的方法。它通过内核补丁的形式,在基于冯诺依曼体系结构的计算机上实现了虚拟化的哈佛内存体系结构,分离了对内核代码所在内存区域的指令操作和数据操作,从根本上杜绝了内核代码被篡改的可能。本发明能很好地对抗内核级Rootkit对内核代码的威胁,在保证内核代码的完整性的同时还能够记录下非法操作的相关信息,为分析攻击行为提供线索;在性能方面,充分利用指令TLB(Translation Lookaside Buffer,即旁路转换缓冲,或称为页表缓冲)和数据TLB,对操作系统的性能没有明显的影响。
文档编号G06F21/00GK101673332SQ20091004451
公开日2010年3月17日 申请日期2009年10月12日 优先权日2009年10月12日
发明者刘志容, 孙建华, 李兴邦, 浩 陈 申请人:湖南大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1