Checkpoint提出Safe-Linking保护技术,让漏洞利用变得更加困难

关卡公司 提交 安全链接保护机制,这使得很难创建操纵执行 malloc 调用时分配的缓冲区指针的定义或修改的漏洞。 安全链接并不能完全阻止利用漏洞的可能性,但它会以最小的开销使某些类别的漏洞利用的创建变得非常复杂,因为除了可利用的缓冲区溢出之外,还需要找到另一个导致信息泄露的漏洞堆在内存中的位置。

已为 Glibc (ptmalloc)、uClibc-NG (dlmalloc)、gperftools (tcmalloc) 和 Google TCMalloc 准备了实现安全链接的补丁,并且还建议升级 Chromium 中的保护(在
自2012年以来,Chromium已经内置了MaskPtr保护技术,旨在解决同样的问题,但Checkpoint的解决方案表现出了更高的性能)。
建议的补丁已被批准在 XNUMX 月版本中交付 Glibc 3.32 默认情况下将启用安全链接。 uClibc-NG 支持安全链接 进入 包含在版本 1.0.33 中并默认启用。 gperftools 的变化(旧的 tcmalloc) 公认,但将在未来版本中作为选项提供。

开发人员 TCMalloc (new tcmalloc) 拒绝接受 改变,理由是性能严重下降,并且需要添加大量测试来定期检查一切是否按预期工作。 Checkpoint工程师测试表明,Safe-Linking方法不会导致额外的内存消耗,执行堆操作时的性能平均仅降低0.02%,最坏情况下降低1.5%(作为对比,开销成本Chromium 中使用的方法估计为“低于 2%”)。 包容性
安全链接会导致每次调用 free() 时执行 2-3 条额外的汇编指令,每次调用 malloc() 时执行 3-4 条指令。 不需要运行初始化和随机值生成阶段。

Checkpoint提出Safe-Linking保护技术,让漏洞利用变得更加困难

安全链接不仅可用于提高各种堆实现的安全性,还可用于向使用放置在缓冲区本身旁边的指针单链表的任何数据结构添加完整性控制。 该方法实现起来非常简单,只需要添加一个宏并将其应用于指向代码中下一个块的指针(例如,对于 Glibc 正在改变 只需几行代码)。 该方法归结为以下变化:

+#define PROTECT_PTR(pos, ptr) \
+ ((__typeof (ptr)) ((((size_t) pos) >> 12) ^ ((size_t) ptr)))

+#define REVEAL_PTR(ptr) PROTECT_PTR (&ptr, ptr)

- 下一个p = p->fd;
+ nextp = REVEAL_PTR (p->fd);
...

该方法的本质是利用ASLR地址随机化机制(mmap_base)中的随机数据来保护Fast-Bins和TCache等单链表。 在将该值应用于指向列表中下一个元素的指针之前,它会执行掩码转换并检查页面对齐情况。 该指针被“(L >> PAGE_SHIFT) XOR (P)”运算的结果替换,其中 P 是指针的值,L 是存储指针的内存位置。

Checkpoint提出Safe-Linking保护技术,让漏洞利用变得更加困难

在系统中使用时 ASLR (地址空间布局随机化)带有堆基地址的L位的一部分包含随机值,这些值用作编码P的密钥(通过12字节页面的4096位移位操作提取)。 这种操作降低了漏洞利用中指针劫持的风险,因为指针不是以其原始形式存储的,并且替换它需要了解堆分配。 此外,补丁代码还包含对块对齐的额外检查,这不允许攻击者用未对齐的值替换指针,并且需要了解对齐的位数,这在 64 位系统上还允许阻止15 次攻击尝试中有 16 次没有考虑对齐情况。

该方法可有效防止使用部分指针重写(更改低字节)、完全指针重写(重定向到攻击者的代码)以及更改未对齐地址处的列表位置的攻击。 作为一个例子,它表明在 malloc 中使用安全链接将允许最近阻止利用 已确定 由同一漏洞研究人员 CVE-2020-6007 在飞利浦 Hue Bridge 智能灯中,由缓冲区溢出引起并允许您获得对设备的控制。

来源: opennet.ru

添加评论