kernel从小白到大神(四)
字数 2857 2025-08-22 18:37:22

Linux Kernel Exploitation 高级利用技术详解

一、内核堆保护机制分析

1. Hardened freelist (CONFIG_SLAB_FREELIST_HARDENED=y)

  • 保护原理:类似glibc 2.32的tcache fd异或保护
  • 未保护时:slub中free object的next指针直接存储下一个free object地址
  • 保护后:next指针存储三个值的异或结果:
    • 当前free object地址
    • 下一个free object地址
    • kmem_cache指定的随机值
  • 影响:防止泄露内核线性映射区地址

2. Random freelist (CONFIG_SLAB_FREELIST_RANDOM=y)

  • 功能:随机化SLAB空闲列表顺序
  • 防护目标:防止利用空闲链表的攻击和信息泄露

3. Hardened Usercopy (CONFIG_HARDENED_USERCOPY=y)

  • 检查机制
    • 读取数据长度是否超出源object范围
    • 写入数据长度是否超出目的object范围
  • 应用场景:copy_to_user()/copy_from_user()等API
  • 绕过方法:通过内核空间数据拷贝作为跳板

4. Static Usermode Helper (CONFIG_STATIC_USERMODEHELPER=y)

  • 功能:所有用户空间请求定向到固定路径
  • 配置要求:必须指定CONFIG_STATIC_USERMODEHELPER_PATH

二、关键内核结构体利用

1. msg_msg结构体 (GFP_KERNEL_ACCOUNT)

消息队列基础

  • 系统调用
    • msgget:创建消息队列(msq_queue)
    • msgsnd:发送消息
    • msgrcv:接收消息
    • msgctl:控制操作

核心结构体

struct msg_msg {
    struct list_head m_list;  // 双向链表
    long int m_type;         // 消息类型
    size_t m_ts;             // 消息大小
    struct msg_msgseg *next; // 消息段单链表
    void *security;
};

分配机制

  • 基本结构体大小0x30,剩余部分存储数据
  • 超过一个页大小(4KB)时使用msg_msgseg扩展
  • 分配路径:
    ksys_msgsnd() -> do_msgsnd() -> load_msg() -> alloc_msg()

接收模式

  1. MSG_COPY模式

    • 不释放堆块
    • 使用copy_msg()复制消息
    • 无size检查漏洞
  2. 正常模式

    • 使用list_del()从队列脱链
    • 调用free_msg()释放所有消息

2. sk_buff结构体 (size>=512)

结构特点

struct sk_buff {
    union {
        struct {
            struct sk_buff *next;
            struct sk_buff *prev;
        };
        // ...
    };
    unsigned char *head, *data;
    unsigned int truesize;
    refcount_t users;
};

分配机制

  • 从独立的skbuff_fclone_cache或skbuff_head_cache申请
  • 数据包使用常规kmalloc分配
  • 附带skb_shared_info结构体(320字节)
  • 最小可利用object为512字节

释放机制

调用链:
kfree_skb() -> __kfree_skb() -> skb_release_all() -> skb_release_data() -> skb_free_head()

3. pipe_buffer结构体 (kmalloc-1k | GFP_KERNEL_ACCOUNT)

管道基础

  • 父子进程通信机制
  • pipe()创建读写两端(fd[0]读, fd[1]写)

核心结构体

  1. pipe_inode_info (kmalloc-192):

    • 管理管道状态
    • bufs指针指向pipe_buffer数组
    • 可泄露堆地址
  2. pipe_buffer (kmalloc-1k):

    struct pipe_buffer {
        struct page *page;
        unsigned int offset, len;
        const struct pipe_buf_operations *ops;
        unsigned int flags;
        unsigned long private;
    };
    
    • ops指向全局函数表,可泄露.text地址

利用技术

  1. 数据泄露

    • pipe_inode_info->bufs泄露堆地址
    • pipe_buffer->ops泄露内核基址
  2. RIP劫持

    • 控制pipe_buffer->ops
    • close时触发release函数指针
    • RDI=管道本体, RSI=当前pipe_buffer地址
    • 可构造栈迁移:mov rsp, rsi

三、高级利用技术实战

1. 2024网鼎杯pwn3解法

  • 漏洞类型:UAF+任意大小chunk分配
  • 利用步骤
    1. 喷射pipe_buffer结构体
    2. 利用read泄露.text地址
    3. 篡改ops布局ROP链
    4. 通过close触发控制流劫持

2. D3CTF2022_d3kheap解法(CVE-2021-22555)

  • 保护绕过

    • 堆喷msg_msg与sk_buff组合利用
    • 一次UAF完成泄露和劫持
  • 利用步骤

    1. 喷射msg_msg构造UAF对象
    2. 使用sk_buff篡改mts实现越界读
    3. 泄露堆地址后替换为pipe_buffer
    4. 泄露内核基址并构造ROP

3. RWCTF2023体验赛解法

  • 关键技术

    1. 内核密钥管理(user_key)泄露基址
    2. pipe_buffer泄露堆地址
    3. 劫持pipe_buffer->operations
  • user_key利用细节

    • 通过篡改user_key_payload->datalen实现溢出读
    • 释放后rcu_head指向user_free_payload_rcu()
    • 泄露内核.text地址

四、防御与绕过技术总结

1. 常见防护机制

防护机制 防护目标 绕过方法
Hardened freelist 防止堆地址泄露 需获取随机值或泄漏
Random freelist 防止堆布局预测 通过特定对象喷射
Hardened Usercopy 防止越界拷贝 内核空间拷贝跳板
SMEP/SMAP 防止用户空间执行 ROP/JOP链构造

2. 高级利用模式

  1. 组合喷射技术

    • msg_msg + sk_buff组合布局
    • pipe_buffer + user_key组合泄露
  2. 多阶段利用

    • 第一阶段:信息泄露(堆地址/内核基址)
    • 第二阶段:对象篡改(函数指针/控制结构)
    • 第三阶段:控制流劫持(ROP/栈迁移)
  3. 稳定化技术

    • CPU核心绑定
    • 堆状态稳定化喷射
    • 竞争条件精确触发

五、开发环境配置建议

1. 调试配置

# 启用调试符号
echo 0 > /proc/sys/kernel/kptr_restrict
echo -1 > /proc/sys/kernel/perf_event_paranoid

# 关闭KASLR
nokaslr 添加到内核启动参数

2. 关键开发工具

  • 调试工具

    • gdb + pwndbg
    • crash工具
    • perf工具
  • 漏洞利用框架

    • KROP工具链
    • KernelSploit框架
    • QEMU模拟环境

3. 保护检测脚本

void check_protections() {
    printf("Hardened freelist: %s\n", 
        check_config("CONFIG_SLAB_FREELIST_HARDENED") ? "ON" : "OFF");
    printf("Random freelist: %s\n",
        check_config("CONFIG_SLAB_FREELIST_RANDOM") ? "ON" : "OFF");
    printf("Hardened usercopy: %s\n",
        check_config("CONFIG_HARDENED_USERCOPY") ? "ON" : "OFF");
}

六、扩展研究方向

  1. 新型堆分配器利用

    • SLUB分配器深入分析
    • GFP标志对堆布局的影响
    • per-CPU缓存的利用技术
  2. 硬件特性利用

    • Intel PT/ETrace利用
    • 内存缓存侧信道攻击
    • 预执行漏洞利用
  3. 防御机制突破

    • KASLR绕过技术
    • 控制流完整性绕过
    • 堆隔离机制突破
  4. 自动化利用技术

    • 堆布局自动化分析
    • 符号执行辅助利用
    • 机器学习辅助漏洞利用
Linux Kernel Exploitation 高级利用技术详解 一、内核堆保护机制分析 1. Hardened freelist (CONFIG_ SLAB_ FREELIST_ HARDENED=y) 保护原理 :类似glibc 2.32的tcache fd异或保护 未保护时 :slub中free object的next指针直接存储下一个free object地址 保护后 :next指针存储三个值的异或结果: 当前free object地址 下一个free object地址 kmem_ cache指定的随机值 影响 :防止泄露内核线性映射区地址 2. Random freelist (CONFIG_ SLAB_ FREELIST_ RANDOM=y) 功能 :随机化SLAB空闲列表顺序 防护目标 :防止利用空闲链表的攻击和信息泄露 3. Hardened Usercopy (CONFIG_ HARDENED_ USERCOPY=y) 检查机制 : 读取数据长度是否超出源object范围 写入数据长度是否超出目的object范围 应用场景 :copy_ to_ user()/copy_ from_ user()等API 绕过方法 :通过内核空间数据拷贝作为跳板 4. Static Usermode Helper (CONFIG_ STATIC_ USERMODEHELPER=y) 功能 :所有用户空间请求定向到固定路径 配置要求 :必须指定CONFIG_ STATIC_ USERMODEHELPER_ PATH 二、关键内核结构体利用 1. msg_ msg结构体 (GFP_ KERNEL_ ACCOUNT) 消息队列基础 系统调用 : msgget:创建消息队列(msq_ queue) msgsnd:发送消息 msgrcv:接收消息 msgctl:控制操作 核心结构体 分配机制 基本结构体大小0x30,剩余部分存储数据 超过一个页大小(4KB)时使用msg_ msgseg扩展 分配路径: ksys_msgsnd() -> do_msgsnd() -> load_msg() -> alloc_msg() 接收模式 MSG_ COPY模式 : 不释放堆块 使用copy_ msg()复制消息 无size检查漏洞 正常模式 : 使用list_ del()从队列脱链 调用free_ msg()释放所有消息 2. sk_ buff结构体 (size>=512) 结构特点 分配机制 从独立的skbuff_ fclone_ cache或skbuff_ head_ cache申请 数据包使用常规kmalloc分配 附带skb_ shared_ info结构体(320字节) 最小可利用object为512字节 释放机制 调用链: kfree_skb() -> __kfree_skb() -> skb_release_all() -> skb_release_data() -> skb_free_head() 3. pipe_ buffer结构体 (kmalloc-1k | GFP_ KERNEL_ ACCOUNT) 管道基础 父子进程通信机制 pipe()创建读写两端(fd[ 0]读, fd[ 1 ]写) 核心结构体 pipe_ inode_ info (kmalloc-192): 管理管道状态 bufs指针指向pipe_ buffer数组 可泄露堆地址 pipe_ buffer (kmalloc-1k): ops指向全局函数表,可泄露.text地址 利用技术 数据泄露 : pipe_ inode_ info->bufs泄露堆地址 pipe_ buffer->ops泄露内核基址 RIP劫持 : 控制pipe_ buffer->ops close时触发release函数指针 RDI=管道本体, RSI=当前pipe_ buffer地址 可构造栈迁移: mov rsp, rsi 三、高级利用技术实战 1. 2024网鼎杯pwn3解法 漏洞类型 :UAF+任意大小chunk分配 利用步骤 : 喷射pipe_ buffer结构体 利用read泄露.text地址 篡改ops布局ROP链 通过close触发控制流劫持 2. D3CTF2022_ d3kheap解法(CVE-2021-22555) 保护绕过 : 堆喷msg_ msg与sk_ buff组合利用 一次UAF完成泄露和劫持 利用步骤 : 喷射msg_ msg构造UAF对象 使用sk_ buff篡改mts实现越界读 泄露堆地址后替换为pipe_ buffer 泄露内核基址并构造ROP 3. RWCTF2023体验赛解法 关键技术 : 内核密钥管理(user_ key)泄露基址 pipe_ buffer泄露堆地址 劫持pipe_ buffer->operations user_ key利用细节 : 通过篡改user_ key_ payload->datalen实现溢出读 释放后rcu_ head指向user_ free_ payload_ rcu() 泄露内核.text地址 四、防御与绕过技术总结 1. 常见防护机制 | 防护机制 | 防护目标 | 绕过方法 | |---------|---------|---------| | Hardened freelist | 防止堆地址泄露 | 需获取随机值或泄漏 | | Random freelist | 防止堆布局预测 | 通过特定对象喷射 | | Hardened Usercopy | 防止越界拷贝 | 内核空间拷贝跳板 | | SMEP/SMAP | 防止用户空间执行 | ROP/JOP链构造 | 2. 高级利用模式 组合喷射技术 : msg_ msg + sk_ buff组合布局 pipe_ buffer + user_ key组合泄露 多阶段利用 : 第一阶段:信息泄露(堆地址/内核基址) 第二阶段:对象篡改(函数指针/控制结构) 第三阶段:控制流劫持(ROP/栈迁移) 稳定化技术 : CPU核心绑定 堆状态稳定化喷射 竞争条件精确触发 五、开发环境配置建议 1. 调试配置 2. 关键开发工具 调试工具 : gdb + pwndbg crash工具 perf工具 漏洞利用框架 : KROP工具链 KernelSploit框架 QEMU模拟环境 3. 保护检测脚本 六、扩展研究方向 新型堆分配器利用 : SLUB分配器深入分析 GFP标志对堆布局的影响 per-CPU缓存的利用技术 硬件特性利用 : Intel PT/ETrace利用 内存缓存侧信道攻击 预执行漏洞利用 防御机制突破 : KASLR绕过技术 控制流完整性绕过 堆隔离机制突破 自动化利用技术 : 堆布局自动化分析 符号执行辅助利用 机器学习辅助漏洞利用