Linux 2.6内核下LKM安全性研究
2011-06-05熊盛武
徐 敏 ,熊盛武
(武汉理工大学 湖北 武汉 430070)
可加载内核模块[1](Loadable Kernle Module(LKM))作为对Linux宏内核结构的一种改进,它可以在不需要重新编译内核下被动态加载,作为内核级代码存在于内核空间,能够访问内核的重要数据结构。通常情况下模块通过合理修改系统的控制转移地址或添加门来和系统联系成一个整体,如果是恶意模块,它就可以进行多种非法操作,留下系统级后门。
1 LKM攻击方法
1.1 LKM系统调用劫持
在Linux中劫持系统调用的思想是修改程序执行过程中跳转的目的地址。在Linux 2.4.18内核以前,是直接对sys_call_table[2]表进行修改,sys_call_table表是保存所有系统调用函数地址的指针数组,直接用自定义的函数地址替换原来的地址,即可实现对系统调用的劫持。在Linux2.4.18内核以后,为了解决这个安全问题,sys_call_table表不能直接导出,利用中断描述符表IDT及字符设备文件/dev/kmem依然可以查找到sys_call_table表的地址,可以通过sIDT指令获取到中断向量表的地址,然后通过读取/dev/kmem来定位到该地址,然后通过调用read函数或者mmap函数的方式来读取出0×80中断描述符的内容,然后从其中可以提取出sys_call_table表的地址。2.6内核采用被称为“快速系统调用”的sysenter指令来完成从用户态到内核态的快速切换方法,这是一种不检查特权级的系统调用,在实际情况下,发生系统调用时的特权检查工作会浪费许多时间且没有必要,由于通过INT$0×80指令进入系统调用时,其门描述符的描述符特权级DPL为3,而系统调用在正常情况下也是从用户态进入内核态,故进入之前的权限当前特权级CPL也是3,权限提高前后级别不变,则CPU检查门描述符的DPL和调用者的CPL就没有必要。……
