内核代码保护

问题

由于对采用冯诺依曼结构的现代计算机来说,代码和数据存储在同一地址空间,因此大多数现代计算机都有被更改内核代码的威胁。而传统保护内核代码安全的方法有以下两类: 一类是由操作系统本身自带的或是其他研究者以系统补丁的方式提供的一些保护机制。这些方法大多是利用底层硬件(段页表表项的权限位,NX-bit等)对一些重要的区域进行保护.虽然这些方法在一定程度上能有效地保护内核,但在面对内核级rootkit威胁时其应用范围很有限。 另外一类方法是通过检测代码一致性的方法来判断内核代码是否被修改。这些类方法独立于操作系统正常功能之外,基于十分复杂的策略,其系统往往十分庞大。而且,严格的说,这些方法并没有起到保护的作用,它们更多的是采用一种检测的方法,没有做到主动防御的工作。另外,这些系统虽然能够检测到对内核的修改,但是对攻击者修改内核代码的具体行为一无所知,对事后的入侵分析和恢复也不能提供任何有价值的线索。

方法

该系统提供了一种保护内核的新方法。该方法通过采用哈佛存储体系结构,使得指令和数据在物理地址上分离开,从而使得在系统启动后,所有对内核代码的非法操作都重新导向到用来承担非法操作的影子区域。这种方法在操作系统层面执行,而且在攻击者获得系统操作最高特权级时也能保护内核。除此之外,该方法还能记录所有尝试更改内核代码的非法操作,对入侵分析能够提供有效信息。攻击者不会发现他们的恶意攻击已经被欺骗和记录。该方法利用了一些硬件特性并且只产生了非常小的工作负荷。 图片一比较了冯诺依曼体系结构和哈佛体系结构的存储结构差异。图片二展现了采用新方法的系统结构模型。

实验

在本试验中,将修改后的Rootkit adore-ng 0.56安装在内核为Linux 2.6.11的Fedora Core 4上。在没有本文的保护机制下,在rootkit成功安装之后系统就不能正常工作了。而在同一机器上,在使用本文方法修改过内核的Fedora Core 4上,Rootkit adore-ng 0.56安装成功后系统仍然正常工作,没有出现任何错误。通过System.map找到影子区域的地址(kernel_mirror),再查看其内容,发现影子区域内存单元的内容已经全部被修改为‘0’字符,这说明Rootkit试图对内核代码进行的修改被导向了影子区域,而正常的内核代码未受影响,试验表明本文的保护机制是有效的,而且对操作系统的正常功能没有影响,工作负荷也很小。

总结

在本系统中,通过在当前操作系统上采用虚拟化的哈佛存储体系结构,使得整个内核地址空间的指令存取和数据操作在物理上分离开,从而有效地防止内核空间遭受代码注入攻击,增强了Linux内核的安全性。该虚拟化过程被详细介绍,它抵抗攻击的有效性以及对当前操作系统的影响被全面地评价和分析。而且实验结果表明,这种新方法是有效且实用的。

资助:本项目得到中国重点基础研究基金973项目和国家自然科学基金资助。