欢迎光临
我们一直在努力

linux 内核 堆越界

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. 典型利用路径

  • 触发越界写,覆盖堆对象的 函数指针 或 freelist 指针。
  • 伪造堆元数据,控制后续 kfree/kmalloc 的行为。
  • 堆风水(Heap Feng Shui):分配大量可控对象,控制堆布局。
  • 精确溢出:覆盖目标堆块的元数据(fd/bk 指针、大小、标志)或相邻对象的函数指针。
  • 劫持控制流:
    • 覆盖 kfree 时的链表指针,触发 unlink 攻击,篡改任意内存地址。
    • 覆盖内核对象中的函数指针(如 file_operations、vm_ops、nft_object)。
    • 劫持 ret 或跳转,执行提权 shellcode。
  • 执行 Payload:部署内核 ROP 链,绕过 SMEP/SMAP/KASLR 等防护,执行提权代码。
  • 典型内核堆溢出 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. 漏洞修复
    • 补丁需同时修复越界写入点与长度校验逻辑,避免引入新漏洞。
    • 回归测试覆盖边界值、异常长度、畸形输入场景。

    赞(0)
    未经允许不得转载:171主机测评 » linux 内核 堆越界
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址