引言
本地内核提权(Local Privilege Escalation, LPE)是攻防对抗中权限提升的终极路径之一。从最初触发内核崩溃的PoC,到能稳定绕过KASLR、SMEP等防护机制并获取root shell的完整利用,中间横跨内存泄露、堆风水布局、执行流劫持、权限切换等多个技术环节。
在实战场景中,单一利用路径往往受内核版本、编译选项、防护机制影响而失效。本文以三个经典Linux内核漏洞为样本,提出同源利用思想——基于同一漏洞根因,并行设计三条独立利用向量,同时构建标准化的“五星完整版”提权工程框架,实现从崩溃触发到稳定提权的全链路闭环。
一、内核提权的通用技术范式
1.1 标准提权四阶段链路
完整的内核提权利用并非单次漏洞触发即可完成,而是遵循固定的工程化链路:
稳定内存泄露:绕过KASLR地址随机化,获取内核基址、堆地址、栈地址等关键信息,是所有后续操作的前提;
防护机制绕过:针对SMEP(内核态禁止执行用户态代码)、SMAP(内核态禁止访问用户态数据)、堆隔离等防护,设计对应绕过方案;
堆风水布局:通过堆喷精确控制slab分配,让可控对象占据漏洞释放后的内存槽位,实现对象劫持;
执行流劫持与权限提升:通过函数指针篡改、ROP链、页表篡改等方式,在内核态执行commit_creds(prepare_kernel_cred(0)),完成UID清零提权。
1.2 同源利用思想的核心价值
同源利用指针对同一个漏洞根因,挖掘多条独立的利用路径,分别指向不同的内核对象、执行流劫持方式与防护绕过手段。其价值体现在三点:
容错性:单一路径被防护阻断时,其余路径仍可完成提权;
适配性:不同内核版本、不同发行版的内核配置差异,可通过不同路径兼容;
隐蔽性:多路径随机切换,降低防护设备的特征检测概率。
下文三个漏洞均采用“一漏洞三同源”的设计,形成完整的利用矩阵。
二、三大经典内核漏洞的原理与同源利用
2.1 CVE-2016-0728:密钥环引用计数溢出UAF
漏洞核心原理
该漏洞存在于Linux内核密钥管理子系统keyrings,影响3.8及以上版本内核。当进程调用keyctl_join_session_keyring加入同名会话密钥环时,函数存在引用计数泄漏:子进程加入密钥环后退出,密钥环的引用计数只增不减。通过循环fork子进程反复加入,可让32位引用计数溢出回绕,此时调用KEYCTL_REVOKE会触发对象释放,形成释放后使用(UAF)漏洞。
原始PoC仅通过循环调用KEYCTL_JOIN_SESSION_KEYRING无法稳定触发,必须借助fork子进程的生命周期完成引用计数泄漏,这是多数公开脚本的常见错误。
三条同源利用路径
同源1:user_key对象覆盖 → cred结构体直写
利用UAF释放的slab槽位,喷射user_key内核对象,篡改key的数据指针指向当前进程的cred结构体。通过keyctl_update原语向该地址写入0,直接清零UID、GID等权限字段,无需劫持执行流即可完成提权。该路径最短、稳定性最高,是首选利用向量。
同源2:msg_msg堆喷 → 信息泄露 + ROP提权
通过msgsnd喷射msg_msg对象占据释放的内存,利用keyctl_read读取被覆盖的对象数据,从中提取内核指针以泄露内核基址。随后构造完整ROP链,绕过SMEP执行提权函数。该路径适配性强,可应对多数开启SMEP的内核版本。
同源3:file结构体覆盖 → f_op函数指针劫持
批量打开/dev/null生成大量file内核对象,堆喷覆盖UAF内存。篡改文件操作表f_op指针,将read回调指向提权gadget。后续调用read触发内核态回调执行,完成权限提升。该路径可规避key子系统的访问检测,隐蔽性更强。
2.2 CVE-2014-0038:x32 ABI下recvmmsg任意写原语
漏洞核心原理
漏洞源于x32兼容ABI的compat_sys_recvmmsg系统调用:函数直接接收用户态传入的timeout指针,并在内核态修改其指向的值,却未对指针地址做合法性校验。普通64位调用有完整边界检查,而x32调用路径遗漏校验,最终形成内核任意地址单字节写原语,影响3.4及以上开启x32 ABI的内核。
三条同源利用路径
同源1:逐字节覆写cred结构体
通过/proc/pid/status或侧信道定位当前进程的task_struct,计算cred结构体偏移。利用任意字节写原语,逐字节将uid、euid、suid等字段清零。该路径无需执行流劫持,不依赖内核符号,兼容性极强。
同源2:VDSO页植入shellcode
VDSO是内核映射到用户态的可执行页,通过任意写原语将提权shellcode写入VDSO页。随后触发clock_gettime等VDSO调用,让内核态执行流跳转到植入的代码,完成commit_creds调用。该路径可绕过SMEP,且无需泄露大量内核地址。
同源3:篡改PTE页表项
定位目标内核页对应的页表项(PTE),通过任意写修改PTE的Present、R/W、User位,将内核物理页映射为用户态可读写。随后直接在用户态修改内核内存中的cred字段,无需进入内核态即可完成提权。
2.3 PTY TIOCSPGRP:竞态条件下的tty结构体UAF
漏洞核心原理
漏洞位于TTY子系统的TIOCSPGRP ioctl处理逻辑:PTY主从设备共享tty_struct结构体,但ioctl加锁时错误地使用了主设备的锁而非实际操作对象的锁。并发执行ioctl与close操作时,tty结构体被释放后仍可能被引用,触发竞态UAF。
原始PoC常因未正确解锁PTY、未获取从设备路径而无法稳定触发,需通过unlockpt与ptsname_r完成规范的PTY初始化。
三条同源利用路径
同源1:tty_operations函数表劫持
竞态触发UAF后,批量打开PTY设备喷射tty_struct对象,占据释放的slab槽位。篡改结构体中的ops指针指向伪造的函数表,将ioctl回调替换为提权函数。再次调用ioctl时即可劫持执行流,完成内核态提权。
同源2:termios结构越界读 + 栈ROP
通过覆盖termios终端属性结构,构造越界读原语泄露内核栈地址。随后利用栈溢出布置ROP链,通过TIOCSLCKTRMIOS ioctl触发栈溢出,执行ROP链绕过SMEP完成提权。
同源3:线路规程ldisc_ops劫持
篡改tty结构体中的线路规程操作表ldisc_ops,将read等回调指向可控地址。通过TIOCSETD切换线路规程触发回调执行,可绕过SMAP限制直接执行用户态payload,适配性更广。
三、五星完整版提权脚本的工程化设计
3.1 标准化代码骨架
所有提权脚本统一采用四层结构,保证可读性与可维护性:
temp区:存放全局临时变量、重试计数、泄露地址等运行时数据;
sep区:定义利用路径枚举与全局路径变量,实现多路径切换;
sample区:存放ROP链、shellcode、堆喷数据等payload样本;
tuple区:定义参数元组结构体,统一管理堆喷数量、竞态次数、符号偏移等可调参数。
3.2 核心能力增强
自动重试与路径切换:单一路径失败后自动切换下一同源路径,最多重试5轮,大幅提升成功率;
环境自检:执行前检测内核版本、防护机制、x32 ABI支持等环境信息,自动选择最优初始路径;
异常捕获:内置信号处理与超时机制,避免内核panic导致系统挂死,保证批量测试的稳定性。
3.3 批量测试与迭代流程
工程化提权脚本的验证遵循严格的闭环流程:
静态编译:统一使用gcc -static -O2编译,消除依赖差异,批量生成二进制;
隔离测试:单脚本单次执行,记录执行ID,每轮测试后重启靶机重置内核环境,避免残留影响;
日志归集:统一抓取dmesg输出、进程返回值、提权结果、内存泄露地址等信息,形成结构化日志;
有效筛选:过滤出可稳定触发漏洞、完成地址泄露、实现代码执行的有效脚本;
定向迭代:仅针对有效脚本微调堆喷尺寸、释放时序、ROP偏移、路径优先级等参数;
最终固化:调试稳定后归档正式版本,留存所有调试参数与注释。
3.4 从崩溃到稳定泄露的改造思路
多数原始PoC仅能触发内核崩溃,距离实战提权的核心差距在于稳定的信息泄露。改造要点包括:
将无序堆喷改为精确slab尺寸喷射,提高对象命中率;
增加泄露验证逻辑,通过地址掩码判断是否读取到有效内核指针;
对竞态漏洞增加触发成功率统计,动态调整竞态循环次数。
四、现代内核防护下的对抗思路
随着内核安全机制的演进,KASLR、SMEP/SMAP、堆随机化、CFG等防护已成为标配,同源利用框架正是应对防护升级的有效手段:
应对KASLR:每条同源路径均内置独立的信息泄露原语,避免单一泄露点被封堵;
应对SMEP/SMAP:三条路径分别采用内核ROP、VDSO执行、页表映射三种不同绕过方案,覆盖绝大多数防护组合;
应对堆隔离:组合使用user_key、msg_msg、file、tty等多种内核对象喷射,突破slab分类隔离的限制;
应对检测:多路径随机执行,避免固定调用序列被行为检测识别。
五、总结与展望
Linux内核提权技术的演进,本质是漏洞原语与防护机制的持续对抗。从单一崩溃PoC到多路径工程化利用,从手工调参到批量自动化验证,提权技术的工程化程度不断提升。
同源利用思想与标准化五星框架的价值,在于将零散的漏洞利用技巧沉淀为可复用、可迭代的工程体系。无论是经典漏洞的复现,还是新漏洞的快速利用开发,这套体系都能显著缩短从原理验证到实战落地的周期。
对于防御方而言,理解提权利用的通用链路与同源设计思路,也有助于针对性地加固关键内核子系统、完善内存安全检测机制,构建更纵深的内核安全防护体系。