安全研究机构 Calif 发布了 OpenBSD 中一个漏洞的详细信息,该漏洞可追溯到约37年前的原始 BSD 源代码。共享内存附加计数器被定义为有符号16位短整型。反复派生携带共享内存附加记录的进程,可使该计数器超过其最大值32,767,从而回绕为负值。这种整数溢出可通过竞争条件导致释放后使用。结合内核中另一处越界写入,攻击者可实现本地权限提升至root。相关问题已在勘误026和018中修复。
研究人员描述了一条攻击路径,可在启用 KARL、SMAP 和 SMEP 的 OpenBSD 上实现本地root,且无需利用信息泄露漏洞。该方法包括映射127个System V共享内存段,将其解除映射,并派生259个进程以使附加计数回绕。随后利用堆整理和竞争条件来对齐分配、破坏一个组播结构,最终通过覆写一个可预测的内核指针获得内核代码执行权限。
该攻击依赖于一个写入任意地址(write-what-where)原语:写入操作来自 TAILQ_REMOVE,写入内容为被设为内核态可访问的用户空间内存,写入位置为可预测的内核指针。OpenBSD 的 KARL 会随机化函数和数据地址,但内核内存分配器仍然是确定性的,这使得某些早期启动阶段的分配成为可靠目标。
为降低类似攻击风险,作者建议采取安全断链(safe-unlinking)等措施,即在执行断链写入前检查双向链表的不变量,若不变量被破坏则中止或触发panic。Calif 表示,其会定期向开源项目报告漏洞,并通常附带建议的补丁。
来源: Hacker News · 由HeadlinesBriefing整理摘要