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()
接收模式
-
MSG_COPY模式:
- 不释放堆块
- 使用copy_msg()复制消息
- 无size检查漏洞
-
正常模式:
- 使用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]写)
核心结构体
-
pipe_inode_info (kmalloc-192):
- 管理管道状态
- bufs指针指向pipe_buffer数组
- 可泄露堆地址
-
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地址
利用技术
-
数据泄露:
- 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. 调试配置
# 启用调试符号
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");
}
六、扩展研究方向
-
新型堆分配器利用:
- SLUB分配器深入分析
- GFP标志对堆布局的影响
- per-CPU缓存的利用技术
-
硬件特性利用:
- Intel PT/ETrace利用
- 内存缓存侧信道攻击
- 预执行漏洞利用
-
防御机制突破:
- KASLR绕过技术
- 控制流完整性绕过
- 堆隔离机制突破
-
自动化利用技术:
- 堆布局自动化分析
- 符号执行辅助利用
- 机器学习辅助漏洞利用