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是指释放后的内存被错误地继续使用。在内核中,当释放的内存被重新分配给其他敏感结构体时,可以通过修改这些结构体实现提权。

利用场景

  1. cred结构体提权:当cred结构体(大小0xa8/0xe0)被释放后,新创建的线程可能会重用这块内存。
  2. 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

基本原理

通过堆溢出覆盖相邻内存中的敏感数据结构。

利用方法

  1. 修改cred结构体:溢出覆盖相邻的cred结构体,修改uid/gid
  2. seq_operations劫持:溢出覆盖seq_operations中的函数指针

关键点

  • 需要精确控制溢出长度和内容
  • 通过/proc/self/stat喷射seq_operations结构体
  • 需要绕过KASLR泄露内核基址

3. Arbitrary Address Allocation (freelist劫持)

基本原理

通过修改freelist指针实现任意地址分配,然后在该地址写入恶意数据。

利用方法

  1. modprobe_path提权:修改modprobe_path指向恶意脚本
  2. 伪造tty_operations:实现任意代码执行

关键点

  • 需要能够泄露堆地址
  • 需要关闭SMAP保护或找到内核中的写入点
  • 通过创建格式错误的文件触发modprobe_path执行

4. Off By Null

基本原理

单字节NULL溢出漏洞,可以修改相邻内存块的元数据或内容。

利用方法

  1. page级UAF:通过溢出修改相邻page结构
  2. pipe_buffer劫持:构建任意读写原语

关键点

  • 需要精确的堆布局控制
  • 通过setsockopt喷射页级内存
  • 利用pipe机制构建读写原语

5. Kernel Unlink

基本原理

利用内核链表操作中的unlink操作实现任意地址写。

利用方法

  1. simple_xattr利用:通过伪造链表节点修改敏感数据
  2. modprobe_path修改:实现提权

关键点

  • 需要physmap区域的有效地址
  • 需要控制prev/next指针
  • 适用于有链表解链操作的结构体

6. Cross-Cache Overflow & Page-level Heap Fengshui

基本原理

跨cache溢出和页级堆风水技术,用于绕过cache隔离。

利用方法

  1. setsockopt申请页:通过PF_PACKET socket分配大块内存
  2. 页级UAF:释放后重新分配敏感结构体
  3. pipe_buffer利用:构建任意读写原语

关键点

  • 需要创建隔离的命名空间
  • 需要精确控制堆布局
  • 通过clone减少fork噪音

防御技术

  1. KASLR:内核地址空间布局随机化
  2. SMEP:禁止内核执行用户空间代码
  3. SMAP:禁止内核访问用户空间内存
  4. KPTI:内核页表隔离
  5. SLAB隔离:敏感结构体使用独立cache

调试技巧

  1. 使用cat /proc/slabinfo查看slab使用情况
  2. 通过sudo slabtop动态监控slab分配
  3. 使用cat /proc/kallsyms查找关键符号地址
  4. 绑核避免多核干扰:sched_setaffinity
  5. 使用qemu-system-x86_64配合-monitor none参数调试

实战案例

  1. cred_jar可合并情况:直接修改cred结构体
  2. cred_jar不可合并:通过tty_struct劫持控制流
  3. modprobe_path提权:修改路径指向恶意脚本
  4. page级UAF:通过pipe_buffer构建任意读写
  5. Off By Null+堆风水:构建复杂利用链

以上技术需要根据具体漏洞场景和环境保护机制灵活组合使用,实际利用中还需要考虑稳定性、成功率等因素。

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+堆风水 :构建复杂利用链 以上技术需要根据具体漏洞场景和环境保护机制灵活组合使用,实际利用中还需要考虑稳定性、成功率等因素。