竟把Linux内核攻陷了!
统的安全防线是建立在内核至高权限掌控的基础之上,无论是杀毒软件,沙箱,还是防火墙都运行在内核态。要突破安全包围,必须获得内核级权限的执行能力,才能和这些安全防护正面PK。 我们常常听到的Android系统ROOT和iOS系统的越狱就是内核攻击的典型应用。 获得内核权限以后,攻击者可安装rootkit级木马病毒,实现文件隐藏、进程隐藏、通信隐藏等高级木马功能,对系统危害极为严重。 内核0day漏洞,在APT攻击中是核武器级别的存在,地下网络安全交易市场价值巨大。 进入内核的四种方式 实际上,我们的程序每时每刻都在往返于用户空间和内核空间,只不过这些进出的大门都被操作系统提前安排好了,进入内核后该去哪里执行什么代码,是操作系统说了算,由不得我们自己的程序做主。 从用户态空间进入内核,有四种方式: 中断: 中断分为两种:硬中断和软中断 硬中断:硬件设备向CPU发起的中断信号 软中断:CPU执行int指令触发,早期的操作系统中实现系统调用就是通过这种方式,如Windows上的 int 2e,Linux上的 int 80 不管是硬中断还是软中断,CPU遇到以后都会保留当前执行的现场上下文,进入内核去执行中断处理函数。这些函数记录在中断描述符表IDT中,由操作系统初始化系统的时候预先安排。 异常: 异常是CPU在执行指令的过程中出现的问题,如除法指令的除数为0,访问的内存地址无效等等。 异常和中断处理逻辑类似,也是通过记录在IDT中的异常处理函数来执行,同样由操作系统初始化系统的时候预先安排。 系统调用: 系统调用大家应该就很熟悉了,我们要实现文件系统访问、网络I/O、进程线程使用、内存分配释放等等行为,都需要借助操作系统提供的编程接口来实现,这些接口叫做:系统调用。 前面提到,早期的x86架构下的CPU,没有专门的系统调用机制,操作系统们都使用软中断的形式来进入内核完成系统调用。 后来,因为系统调用是一个很高频的需求,软中断的方式效率有些低下,CPU加入了专门的系统调用机制,这包括一些专用的寄存器和一些专用的系统调用指令。如sysenter(x86)、syscall(x64)、swi(arm)。 通过系统调用进入内核后,该转向哪里执行也是操作系统提前安排好了,由不得应用程序做主。 开发驱动程序: 最后一种进入内核的方式就是开发驱动程序了,但加载驱动本身就需要极高的权限,所以这一点就不详述了。 以上就是通过正规途径,让我们的程序进入内核态运行的方式,可见,一旦进入内核态,执行流就进入了操作系统提前设置好的代码,攻击者没办法胡来。 有正规途径,当然就有不正规途径,也就是通过形形色色的漏洞攻击系统内核,从而使我们的程序进入内核态执行,这也是这篇文章的重点。 下面列举一些常见的攻击手法。 零地址攻击 学过C语言的朋友都知道,零地址,也就是NULL,在C语言中代表着空指针。 一些没有经验的程序员在写一些接口函数时,往往容易忘记检查指针参数是否是NULL,而导致程序的崩溃异常。 以32位操作系统为例,进程的地址空间是: (编辑:济南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |