描述
The kernel is the core component of an operating system, serving as the bridge between software and hardware. Operating at the lowest level of the OS, the kernel's access is so profound that it can be likened to impersonating the system itself, surpassing even the highest privileges of a root user. Kernel security is paramount because a breach at this level allows attackers to act as if they are the system. Vulnerabilities can lead to scenarios like unauthorized data access, system crashes, or the silent installation of rootkits .
1
内核是操作系统的核心组件,作为软件和硬件之间的桥梁。它以操作系统的最低级别运行,内核的权限如此深入以至于它可比拟于操作系统本身,甚至超越最高权限用户root。内核安全是至关重要的,因为一个(操作系统内核级别的)漏洞允许攻击者就好像能以操作系统的名义行事。这些漏洞可能导致未授权访问、系统崩溃或静默安装rootKits(一种恶意软件,它被用来隐藏其他恶意活动,并允许攻击者远程控制受感染的系统)等场景。
Introduction
什么是操作系统内核
独立进程-》 美国各个独立的州
内核-》美国联邦政府
内核负责处理进程间的相互交互以及进程与外部资源的交互(联邦政府处理协调各个州之间的关系以及州与外部的关系)
什么是外部资源
计算领域,共享资源就是我们手头的电脑,即使你在物理世界中没有决定要和别人共享你的电脑,但你电脑上的进程在各种场合下都与外界发生了计算资源共享(就好像是偷偷地替你做了决定)。
仅内核可访问的外部资源
某些敏感操作的指令,需要被保护起来,防止被单个进程无限制使用/滥用。这样的指令只能由有资格的管理者-内核来掌管。
hlt指令 暂时关闭计算机的计算功能(注意不是关闭系统)
in和out指令 直接与硬件外设交互的指令
特殊寄存器 (1)cr3:控制寄存器,控制进程中内存页将虚拟内存地址转换为物理内存地址,它能够直接通过move指令来访问,但注意只能在内核态(模式)下!!(如果用户态就能访问,等于说可以任意控制进程的虚拟内存映射了,如果是黑客,就可能做出破坏内存等恶意行为)
(2)MSR_LSTAR:定义系统调用指令将控制流转移到何处,wrmsr和rdmsr指令用于操作该寄存器
什么使内核如此特别
计算机如何知道是否允许你操作这些仅内核可访问的外部资源?即计算机该如何判断? 比如当我们汇编代码中尝试写MOVE CR3 RAX
特权环模型
CPU在执行过程中,会追踪我们当前执行指令的权限级别,依据是某种环模型,如上图。
该模型原本是为不同访问级别的设备驱动程序设计的
注意不同CPU架构对应的特权模型会有些许差异 ,上面只是x86架构对应的。但“特权层级”的核心思想(权限分级隔离)是计算机体系结构中的通用概念。
3环:对应用户空间,所处权限最低的环,这层不能做诸如设置CR3寄存器等操作,无法与硬件外设交互(不是指能够点击鼠标敲击键盘,而是指能否直接通过底层逻辑来操作硬件),大多指被允许运行用户程序。如果3环要与系统交互,必须通过其他具有更高级权限的环来实现。
0环:就是传统内核模式对应的级别了,几乎任何操作都不受限制,例如可以直接调快CPU时钟周期等,如果稍有不慎,甚至可能烧毁CPU。
-1环:当某些特殊情况下(比如虚拟化技术的出现),导致传统的0环需要根据特殊需求实施一定的权力下放,而最高权限的中心转入其他环即 -1环。
Supervisor模式
“监管者模式 ”(即CPU的特权执行模式 (如x86的0环)),容易与Hypervisor混淆,有些资料会把Hypervisor错误地翻译为监管者模式,影响理解。监管主要体现在操作系统内核 管理硬件资源,用户程序 运行在非特权模式(如x86的3环),需通过系统调用才能请求内核服务。
硬件辅助虚拟化技术对权限层级的重新洗牌
虽然内核权限如此之高,但也有特例,当虚拟化技术兴起后,虚拟机内的操作系统,它们的0环,实际上是没有像物理机的0环那样不受限制的直接操作硬件权限,所以此时0环变成相对的概念。 为了限制VM的内核,不与物理宿主机的0环冲突,20世纪的处理方式是让VM的内核限制在 1环上,而当要让VM的内核在某些高权限操作下又能近似达到0环权限的效果,往往采用软件方式去模拟,但这种方式会带来高开销和高复杂性、兼容性差等问题; 现代的处理方式则是增加了 -1环 ,引入虚拟机监视器 hypervisor模式,能够实现拦截Guest OS即虚拟机内核的敏感操作(比如试图执行MOVE CR3
),并在操作系统中处理这些事务。此时Guest OS的权限看似完整,但实际处于受控的VMX Non-Root模式 。
这种设计机制本质上是硬件与软件的协同 ,通过表面看虽然是“权力下放”,但实际上Guest OS当前的处境就像是时刻被摄像头监控的国王。从管理角度来说,这种方式既给了Guest OS一定的高权限,尽可能不破坏软件方面(操作系统本质上是软件)的原生设计,又确保了物理硬件的安全性。
虚拟化场景下HOST OS内核此时又在哪层?
Host OS的权限实际上取决于虚拟化类型 :
Type 1 Hypervisor(裸机虚拟化):没有传统Host OS ,Hypervisor直接控制硬件 (-1环),特权虚拟机(如Xen的Dom0)运行在受限的VMX Non-Root模式。
Type 2 Hypervisor(宿主机虚拟化): 有传统Host OS,且运行在物理机的0环,但通过内核模块(如KVM)进入VMX Root模式(-1环)管理虚拟机。
Hypervisor 模式
Hypervisor 模式(如 Intel VT-x 的 VMX Root 模式或 AMD-V 的 SVM 模式)是专门为虚拟化技术设计的硬件功能 ,当CPU 不支持或不启用相应的虚拟化扩展选项(如我们经常在安装模拟器或vmware等遇到的VT-x未开启问题),同时不存在虚拟化软件(可通过特定指令如 Intel 的 VMXON
进入 Hypervisor 模式),则硬件虚拟化无法进行,Hypervisor 模式也不存在。当上述条件都不满足时,此时的物理机CPU就回归到传统的传统特权环(Ring 0-3),HOST OS内核就在0环。
Hypervisor 模式存在的本质 ,从大方向来看只有一个:隔离虚拟机(Guest)与物理硬件(以及隔离虚拟机之间),拦截敏感操作 。所以这种设计模式,完美解决了虚拟机与物理硬件之间的权限矛盾,是云计算和现代数据中心的核心技术基础。
Supervisor与Hypervisor的区别
Supervisor(监管模式):是CPU的原生特权层级 (如Ring 0),运行操作系统内核。 Hypervisor(虚拟机监视器):是依赖硬件扩展的虚拟化软件,运行在更高特权层级(如-1环),管理多个虚拟机。Hypervisor的权限由硬件虚拟化扩展赋予 ,根据虚拟化类型可无条件拦截不同对象的所有敏感操作。
比如,同样实现访问磁盘,Supervisor模式下通过驱动程序向磁盘控制器发送指令;而Hypervisor根据虚拟化类型(Type1还是Type2),对不同对象的磁盘访问请求做不同处理,重定向到虚拟磁盘文件或物理设备。
常见场景下不同权限环层级的区别(x86为例)
权限环层级
经典操作系统(无虚拟化)
Type 1虚拟化(Xen/ESXi)
Type 2虚拟化(KVM/VirtualBox)
Ring 3
用户程序photoshop无法直接访问硬件
虚拟机用户程序(VM内的浏览器、办公软件)
宿主机和虚拟机用户程序(Host的终端、VM内的APP)
Ring 2
未使用
未使用
未使用
Ring 1
未使用
未使用
未使用
Ring 0
操作系统内核处理Photoshop的文件写入请求,通过设备驱动操作磁盘
特权虚拟机内核(Xen的Dom0)【无宿主机内核HOST OS】
宿主机内核(Linux内核),但虚拟机操作需通过KVM协调
虚拟化扩展层
无
Hypervisor(Xen,运行在VMX Root模式,类比-1环),监控所有虚拟机,为这些虚拟机提供磁盘和网络虚拟化等
Hypervisor(KVM模块,临时进入VMX Root模式,-1环)
虚拟机内核
无
普通虚拟机内核(DomU,运行在VMX Non-Root的伪Ring 0 ),所有敏感操作都会被Hypervisor拦截
虚拟机内核(运行在VMX Non-Root的伪Ring 0 )
设备驱动位置
内核层(Ring 0,图中Device drivers)
Dom0中(受控Ring 0)
宿主机内核(原生Ring 0)和虚拟机虚拟驱动(伪Ring 0 )
总之:
虚拟化引入的"-1环"是权限金字塔的顶端 ,即使图中未显式绘制,它仍是实际控制硬件的最高层。
虚拟机内核的"伪Ring 0"是权限幻觉 ,所有敏感操作最终由Hypervisor审批。
不同类型的内核架构模型
monolithic kernel
即单片内核模型(也叫宏内核 ),该架构的特性是整个内核程序是一个单一二进制可执行文件,在内核态 以监管者模式(Supervisor Mode)来执行。例子有Linux、FreeBSD 。
内核与设备驱动之间的关系
当我们尝试为某个单片内核模型的硬件设备编写驱动,比如声卡、显卡驱动,通常这些编译完成的驱动都是以模块形式(如.ko)加载到操作系统内核中 的。
microkernel
即微内核 ,设计理念是将尽可能多的功能移到用户空间,仅保留最基本的功能在内核中。它提供实现操作系统所需机制的最精简软件集合,这些机制包括底层地址空间管理、线程管理及进程间通信(IPC)。主要应用于更严格的安全场景,例子有SEL4 。微内核正如它的名字一样更小,且唯一运行在0环,传统操作系统功能 ,如设备驱动、协议栈和文件系统,通常从微内核中剥离,转而运行于更低的环,如3环 ,当他们需要与硬件通信时,得先向0环申请,请求微内核代表他们与硬件通信,但这种方式只在特定场景下使用,由于各方面因素速度很慢,微内核牺牲性能换取安全性和模块化,一般适合特定领域(如航天、车载)。
微内核中设备驱动与硬件如何通信
(1)驱动发起请求
场景:用户态驱动(如USB驱动)检测到设备插入,需读取数据。
操作:驱动调用用户态库函数 (如send_request()
),封装请求 为IPC消息(包含操作类型、缓冲区地址等)。 (2)IPC请求陷入内核
上下文切换: 用户态 → 内核态:触发系统调用(如sys_ipc_send()),CPU从Ring 3切换到Ring 0 。耗时操作:保存用户态寄存器状态,加载内核栈,更新页表(若需要)。
消息验证:微内核检查消息合法性 (如缓冲区是否属于驱动进程)。
(3)内核代理硬件操作
直接硬件访问: 微内核执行inb()/outb()
指令或MMIO
操作,与硬件交互。(如向USB控制器发送DMA传输命令)
中断处理: 硬件完成操作后触发中断,微内核接收中断并转发 给用户态驱动(再次通过IPC )。
(4)结果返回用户态
数据复制: 硬件数据先存入内核缓冲区 ,微内核将其复制到用户态驱动指定的内存区域。 (性能瓶颈:大块数据(如磁盘I/O)需多次复制。)
二次上下文切换: 内核态 → 用户态:恢复驱动进程的寄存器状态,切换回Ring 3 。
hybrid kernel
即[混合内核](Hybrid kernel - Wikipedia ),结合微内核与宏内核架构的优势及特点,例子有WindowsNT、MacOS。它的核心结构仍然像宏内核一样,大部分功能都在0环,然后扩展部分则带有一些微内核架构的味道。
了解不同的内核架构模型,在利用场景中是有帮助的,就好像web漏洞利用的攻击方式、利用条件等都受目标架构影响。
如何在特权环之间切换
(以下描述中的R0,R3等都是指特权环模型中的)
调用syscall时发生了什么
系统启动时,0环的内核会设置寄存器MSR_LSTAR
,指向系统调用处理程序例程(routine),当R3用户空间进程需要与内核交互时,需要调用syscall指令。 (1)当调用syscall指令时:
(2)当内核返回用户空间时:
内核调用适当的指令,如果原来是syscall则此时调用对应的sysret
当前进程权限级别由R0切换到R3
控制流转到rcx寄存器指向的值
R0内核与R3用户空间的关系
回顾之前常用的GDB指令vmmap,显示的虚拟内存地址映射中,用户进程的虚拟内存空间往往在低地址范围内,而内核实际上也有自己的虚拟内存空间,在高地址处,但除了vsyscall
外其他都看不到。另外,实际上这部分是比较过时的优化手段了,用于加速系统调用,现在用的比较少了。
每个进程的页表中,内核部分的映射仅在进程切换到内核态(如系统调用)时生效 。用户态下,这些区域的页表项会被标记为不可访问,因此调试工具(如GDB)无法通过vmmap
显示这些区域。
vsyscall
是早期Linux引入的优化机制,将部分频繁调用的系统调用映射到用户空间固定的高地址,避免上下文切换开销。而正由于这种固定性导致易被攻击者利用,如作为构造ROP的其中一环。现在的方案中一般采用vdso
(Virtual Dynamic Shared Object),以动态库形式映射到用户空间,地址通过ASLR随机化,提高了安全性。
内核漏洞可能的利用方向
来自网络 :远程触发的漏洞(例如“死亡数据包”等),此类情况较为罕见。
来自用户空间 :系统调用(syscall
)和 ioctl
处理程序中的漏洞(从沙箱内部发起的攻击,如沙箱逃逸技术)。
来自设备 :通过连接的硬件设备(如 USB 设备)发起内核漏洞攻击(相关示例参考 )
内核漏洞常见的实现目的
用户空间层面:权限提升、系统中安装一些rootKit来隐藏内核中的恶意行为
获得更多权限攻击系统中的其他部分
历史上经典的内核攻击案例
Environment Setup
需要准备的
编译器: 通常是C/C++类型的,因为要符合linux系统的语言,编写的内核利用程序是在R3层以特定方式与内核交互。
内核
用户空间文件系统
qemu模拟器快速方便的安装方式
主机目录挂载到模拟器
特别是当我们在宿主机中实现漏洞利用开发,将EXP编译时(如果模拟器中没有足够的编译环境),这样做非常有用且方便,可以同时同步编译好的测试EXP到模拟器特定目录中,就可以直接在内部执行编译完成的利用程序。