PWN-kernel-堆(UAF heap_overflow freelist劫持 offbynull arbitary_heap_free unlink page_level )
字数 1796 2025-08-20 18:18:15
Linux内核堆利用技术详解
1. Use After Free (UAF)
基本原理
UAF是指释放后的内存被错误地继续使用。在内核中,当释放的内存被重新分配给其他敏感结构体时,可以通过修改这些结构体实现提权。
利用场景
- cred结构体提权:当cred结构体(大小0xa8/0xe0)被释放后,新创建的线程可能会重用这块内存。
- tty_struct劫持:通过劫持tty_operations中的函数指针控制执行流。
关键点
- 新版本内核中cred_jar设置了SLAB_ACCOUNT标记,不会与其他相同大小的slab合并
- 需要绑核避免CPU切换导致的kmalloc-cache-cpu切换问题
- 通过/dev/ptmx喷射tty_struct结构体
防御机制
- KASLR、SMEP、SMAP保护
- cred_jar隔离
2. Heap Overflow
基本原理
通过堆溢出覆盖相邻内存中的敏感数据结构。
利用方法
- 修改cred结构体:溢出覆盖相邻的cred结构体,修改uid/gid
- seq_operations劫持:溢出覆盖seq_operations中的函数指针
关键点
- 需要精确控制溢出长度和内容
- 通过/proc/self/stat喷射seq_operations结构体
- 需要绕过KASLR泄露内核基址
3. Arbitrary Address Allocation (freelist劫持)
基本原理
通过修改freelist指针实现任意地址分配,然后在该地址写入恶意数据。
利用方法
- modprobe_path提权:修改modprobe_path指向恶意脚本
- 伪造tty_operations:实现任意代码执行
关键点
- 需要能够泄露堆地址
- 需要关闭SMAP保护或找到内核中的写入点
- 通过创建格式错误的文件触发modprobe_path执行
4. Off By Null
基本原理
单字节NULL溢出漏洞,可以修改相邻内存块的元数据或内容。
利用方法
- page级UAF:通过溢出修改相邻page结构
- pipe_buffer劫持:构建任意读写原语
关键点
- 需要精确的堆布局控制
- 通过setsockopt喷射页级内存
- 利用pipe机制构建读写原语
5. Kernel Unlink
基本原理
利用内核链表操作中的unlink操作实现任意地址写。
利用方法
- simple_xattr利用:通过伪造链表节点修改敏感数据
- modprobe_path修改:实现提权
关键点
- 需要physmap区域的有效地址
- 需要控制prev/next指针
- 适用于有链表解链操作的结构体
6. Cross-Cache Overflow & Page-level Heap Fengshui
基本原理
跨cache溢出和页级堆风水技术,用于绕过cache隔离。
利用方法
- setsockopt申请页:通过PF_PACKET socket分配大块内存
- 页级UAF:释放后重新分配敏感结构体
- pipe_buffer利用:构建任意读写原语
关键点
- 需要创建隔离的命名空间
- 需要精确控制堆布局
- 通过clone减少fork噪音
防御技术
- KASLR:内核地址空间布局随机化
- SMEP:禁止内核执行用户空间代码
- SMAP:禁止内核访问用户空间内存
- KPTI:内核页表隔离
- SLAB隔离:敏感结构体使用独立cache
调试技巧
- 使用
cat /proc/slabinfo查看slab使用情况 - 通过
sudo slabtop动态监控slab分配 - 使用
cat /proc/kallsyms查找关键符号地址 - 绑核避免多核干扰:
sched_setaffinity - 使用
qemu-system-x86_64配合-monitor none参数调试
实战案例
- cred_jar可合并情况:直接修改cred结构体
- cred_jar不可合并:通过tty_struct劫持控制流
- modprobe_path提权:修改路径指向恶意脚本
- page级UAF:通过pipe_buffer构建任意读写
- Off By Null+堆风水:构建复杂利用链
以上技术需要根据具体漏洞场景和环境保护机制灵活组合使用,实际利用中还需要考虑稳定性、成功率等因素。