Linux 内核堆越界(Heap Out-of-Bounds / Heap Overflow)是指对内核动态分配的堆内存(kmalloc/vmalloc/kmem_cache_alloc 等)进行超出其分配边界的读写,会直接破坏内核内存、劫持控制流,常导致提权、崩溃或逃逸。
定义
- 堆越界(OOB):读写位置超出分配对象的有效范围(前越界 / 后越界)。
- 堆溢出(Overflow):写入数据量超过缓冲区容量,属于典型的越界写。
- 内核堆:由 SLUB/SLUB 分配器管理,按对象大小分组(slab),频繁分配小对象。
内核堆分配接口
- 通用分配:kmalloc(size, flags)、kzalloc、kfree
- 缓存分配:kmem_cache_create、kmem_cache_alloc、kmem_cache_free
- 大内存:vmalloc、vfree(非连续物理页)
危害与利用
1. 直接危害
- 内存破坏:覆盖相邻堆对象、slab 元数据(freelist、size)。
- 控制流劫持:覆盖函数指针、跳转表 → 执行任意内核代码。
- 权限提升:本地无权限用户 → root;容器逃逸。
- 拒绝服务:内核 panic、死锁、数据损坏。
2. 典型利用路径
- 覆盖 kfree 时的链表指针,触发 unlink 攻击,篡改任意内存地址。
- 覆盖内核对象中的函数指针(如 file_operations、vm_ops、nft_object)。
- 劫持 ret 或跳转,执行提权 shellcode。
典型内核堆溢出 CVE 案例
1. CVE-2022-0185(文件系统上下文)
- 位置:fs/fs_context.c → legacy_parse_param。
- 成因:无符号整数下溢,绕过长度检查,导致堆越界写入。
- 影响:本地无特权用户可提权至 root,容器逃逸。
- 修复:增加严格长度校验,防止整数下溢。
2. CVE-2025-0927(HFS+ 文件系统)
- 位置:HFS+ B‑tree 键解析代码。
- 成因:信任镜像中的 key_len,未校验目标缓冲区大小,memcpy 越界。
- 利用:挂载恶意 HFS+ 镜像触发溢出,执行内核代码。
3. CVE-2019-14896(Marvell WiFi 驱动)
- 位置:drivers/net/wireless/marvell/libertas/cfg.c → lbs_ibss_join_existing。
- 成因:处理 WiFi 信标帧时,未校验 IE 长度导致堆溢出。
- 影响:远程攻击者可通过恶意 WiFi 帧导致系统崩溃或代码执行。
用堆溢出 Hook 内核函数提权
攻击原理
堆溢出可覆盖内核对象中的函数指针(如struct file_operations中的read/write指针),将其指向恶意代码,当内核调用该函数时,触发 Hook 并执行提权逻辑。

内核防护机制
1. KASAN(Kernel AddressSanitizer)
- 动态检测越界读 / 写、UAF、double-free。
- 为每个内存块分配 影子内存(Shadow Memory),标记可访问范围。
- 越界时打印 heap-buffer-overflow 并 panic。
2. SLUB Debug / Redzone
- 在堆对象前后加入 红区(Redzone),越界会触发检查。
- 启用 slub_debug=P 可强化 poisoning 检测。
3. 其他防护
- KPTI:隔离内核 / 用户页表,降低 Meltdown/Spectre 影响。
- SMEP/SMAP:禁止内核执行用户空间代码、访问用户空间。
- Stack Canary:栈溢出防护(与堆无关,但同属内存安全)。
- ASLR:内核基址随机化,增加利用难度。
开发与防御最佳实践
1. 编码规范
- 强制边界检查:所有 copy_from_user/memcpy/strncpy 必须校验长度 ≤ 目标缓冲区大小。
- 使用安全函数:优先 scnprintf、strlcpy、memdup_user,避免 strcpy/sprintf。
- 整数安全:无符号数运算前校验,防止下溢 / 上溢(如 size + 2 > PAGE_SIZE)。
- 最小权限:内核对象仅暴露必要字段,减少可被利用的函数指针。
2. 编译与配置
- 启用:CONFIG_KASAN(内核地址 sanitizer,检测越界 / Use‑After‑Free)、CONFIG_SLUB_DEBUG、CONFIG_STRICT_KERNEL_RWX、CONFIG_RANDOMIZE_BASE。
- 禁用不必要的驱动与子系统,缩小攻击面。
3. 漏洞修复
- 补丁需同时修复越界写入点与长度校验逻辑,避免引入新漏洞。
- 回归测试覆盖边界值、异常长度、畸形输入场景。

