Chunk Extend & Overlapping

1. 概述

Chunk Extend and Overlapping(堆块扩展与重叠) 并不是一种独立的漏洞成因,而是通过Off-by-OneOff-by-Null堆溢出(Heap Overflow) 修改堆块元数据后,所达到的核心利用状态

在glibc的ptmalloc机制中,一旦实现了堆块重叠,就意味着你可以用一个受控的堆指针去读写另一个本不属于它的堆块,从而彻底瘫痪堆管理器的安全机制。

Chunk Extend(堆块扩展)是攻击手段,Chunk Overlapping (堆块重叠)是造成的漏洞状态。

Extend是把边界画大,Overlapping是两个指针撞车。

2. Chunk Extend(堆块扩展)

Chunk Extend(堆块扩展) 是堆漏洞利用(Heap Pwn)中的一种核心攻击手法。其基本原理是通过漏洞(溢出)强行改大一个堆块(Chunk)的size元数据,使得该堆块在名义上的边界向后延伸,进而吞并了相邻的一个或多个堆块

这种技术成功欺骗了堆管理器(ptmalloc),是将底层物理溢出转化为高层逻辑控制(如 Chunk Overlapping)的关键桥梁。

2.1 Chunk extend核心原理

ptmalloc分配器中,堆块在内存中是连续分布的,每个堆块(chunk)的头部都有一个size字段,用于标识该堆块的大小,并作为堆管理器寻找“下一个堆块”的唯一物理依据:下一个chunk的地址=当前chunk的地址+当前chunk的size值。

假设程序连续分配2个堆块,ptmalloc的初始状态布局:

  • Chunk A:实际大小0x30字节(正在使用)。其末尾紧邻Chunk B;
  • Chunk B:实际大小0x40字节(正在使用)
内存地址:   [ 0x602000 ]               [ 0x602030 ]
堆块状态:   [ Chunk A (Size: 0x31) ]   [ Chunk B (Size: 0x41) ]
           (注: 0x31 中的 1 代表前一个块在使用,下同)

通过修改size属性,触发Chunk extend:

假设Chunk A存在堆溢出或Off-by-One漏洞。攻击者向Chunk A写入数据时发生越界,直接改写了Chunk B的头部:

  • 修改size值:攻击者将Chunk B的size字段值由0x41强制改为0x61;
  • 触发Chunk extend:在ptmalloc的视角里,Chunk B的物理大小已经变成了0x60,即边界向后延伸了0x20字节,将原本不属于自己的内存区域(比如后续的Chunk C等)强行划给了自己。
内存地址:   [ 0x602000 ]               [ 0x602030 ]
堆块状态:   [ Chunk A (Size: 0x31) ]   [ Chunk B (Size: 0x61) !Modified! ]

                                       |<------- 虚拟边界延伸至 0x602090 ------->|

2.2 Chunk extend后续利用链

堆块扩展只是漏洞利用的其中一种手段而已,攻击者通常会结合其他技术(释放与重新分配)达成目的:

  • 1. 释放被扩展的堆块:攻击者调用了free(B),ptmalloc检查其size 为0x691,便会将这个名义上大小为0x60的“伪造大堆块”放入对应的空闲链表(如Unsorted Bin或Tcache);
  • 2. 重新申请大内存:攻击者接着调用malloc(0x80)(实际需要0x90空间)。ptmalloc发现刚才释放的0x60堆块完美符合要求,于是把原Chunk B的指针重新返回给用户;
  • 3. 达成 Chunk Overlapping(堆块重叠):攻击者持有一个可以读写0x60字节空间的指针。由于这个空间覆盖了原Chunk B及其后面的Chunk C,攻击者可以通过这个新指针直接篡改Chunk C中的敏感数据(如C++虚表、函数指针、对象结构体);

2.3 现代Glibc的安全检查与绕过

现代Glibc引入了多种完整性校验,直接修改size字段会导致程序触发malloc_printerr崩溃。

Free阶段:下一个堆块的PREV_INUSE检查:

  • 当free(B)被调用时,堆管理器为了防止Double Free或内存损坏,会根据物理公式计算出下一个堆块的地址:下一个chunk = B + 修改后的size(0x60);堆管理器会检查Next Chunk的size字段,确保其PREV_INUSE标志位为1(代表前一个块,即B,正在使用);
  • 绕过方法:攻击者在伪造B的size时,必须保证扩展后延伸到的那个内存位置(即B + 0x60处)的数据具有合法的size结构,且其最低位(AMP标志位中的P位)为1。

malloc阶段:Tcache计数与size检查:

  • 如果堆块被放入了Tcache,部分现代Glibc(如Glibc 2.31+)在malloc弹出堆块时,会检查该Tcache链表对应的size索引是否与当前堆块的实际size匹配;
  • 绕过方法:利用Unsorted Bin进行扩展。由于Unsorted Bin属于双向链表,对size的大小分类检查相对宽松,只要能绕过释放时的“下一块”校验,就能成功触发后向合并或切分。

3. Chunk Overlapping(堆块重叠)

Chunk Extend是制造堆块重叠最常见的手法。其核心是通过溢出,将一个空闲中(Free)或使用中(Allocated)的相邻堆块的size字段改大。

Chunk Overlapping(堆块重叠) 是堆漏洞利用(Heap Pwn)中的一种核心状态。它指的是两个或多个不同的堆指针,在同一时间指向了互相重叠(甚至完全相同)的内存区域

在正常的堆管理中,每个malloc得到的指针所拥有的内存空间是独立的、互不干扰的。一旦发生了Chunk Overlapping,就意味着你可以通过操作指针A,去直接读取或篡改指针B中的数据

Chunk Overlapping并不是一个直接的编码错误,而是攻击者利用Off-by-OneOff-by-NullHeap Overflow等漏洞修改了堆块的元数据(Metadata,如Size字段),从而欺骗了堆管理器(ptmalloc)导致的。

当被扩展后的 Chunk B 被释放并重新申请时,Chunk Overlapping就正式形成了。

这是一种内存布局被破坏的状态,导致程序可以通过指针A去读写指针B的数据。

4. 漏洞利用过程

Chunk Extend利用过程:

  • 触发溢出:利用 Chunk A 的 Off-by-One 漏洞,将相邻 Chunk B 的首部 size 字段由 0x31 修改为 0x61(假设 PREV_INUSE 保持为 1);
  • 欺骗管理器:此时在堆管理器的视角里,Chunk B 的大小变成了 0x60。这意味着 “新 B”的范围包含了原来的 B 和 C
  • 释放与重叠:当我们 free(B) 时,堆管理器会把这个大小为 0x60 的“大堆块”放入 Bin(如 Tcache 或 Unsorted Bin)中;

Chunk Overlapping(堆块重叠)利用流程:

  • 重新申请:攻击者向系统申请一个 0x60 大小的堆块;
  • 获取指针:系统将刚才那个被污染的“大 B”分配给攻击者,返回指针 P_new;
  • 内存重叠:此时,P_new指向的内存空间不仅包含了原 Chunk B,还完整覆盖了原 Chunk C
  • 任意读写
    • 写控制:通过往 P_new 写入数据,可以直接覆盖 Chunk C 里的敏感数据(如 C++ 虚函数表指针、劫持结构体里的指针);
    • 读泄露:如果原 Chunk C 是个包含 flag 或指针的块,直接读取 P_new 对应偏移的数据即可实现 信息泄露(Leak Address)

5. 漏洞实例

CVE-2021-3156(又称Baron Samedit) 是2021年由Qualys研究团队披露的一个存在于Sudo核心程序中的本地提权漏洞。该漏洞属于基于堆的缓冲区溢出(Heap-based Buffer Overflow),底层成因是Off-by-One堆溢出。任何本地普通用户,在不需要密码、即使不在sudoers配置文件中的情况下,利用此漏洞都可以100%成功提权至Root权限。该漏洞在Sudo代码中隐藏了近10年之久。

漏洞的核心发生在Sudo处理命令行参数的转义机制中(特别是使用sudoedit -s模式时)。

逻辑漏洞的代码逻辑:

  • 1. 正常逻辑下的安全过滤:当用户正常执行sudo时,Sudo默认会检查是否有特殊字符,并在反斜杠 \ 后面进行处理;
  • 2. 代码中的矛盾跳过:如果命令是以sudoedit -s 启动,Sudo的主代码会设置一个标志位(Flags),表明参数已经被转义过了,在后续步骤中跳过某些过滤;
  • 3. 漏洞函数set_cmnd()的错误逻辑:set_cmnd()函数中,Sudo重新对参数进行拷贝并去除转义的\
免责声明:

1. 一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。

2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。

3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
觉得有帮助可以赞赏本文哦~万分感谢!
文章:Chunk Extend & Overlapping
作者:沛旗
链接:https://www.peiqiblog.com/article/11397/
版权声明::本博客站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0协议
转载请注明文章地址及作者哦~
暂无评论

发送评论(禁止发表一切违反法律法规的敏感言论) 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇