一款漏洞利用PoC可通过串联两个内核漏洞,在OpenBSD系统上获取root权限,其中核心漏洞的历史可追溯至37年前的BSD原始源代码。
安全公司Calif的研究人员表示,该漏洞之所以长期未被修复,是因为系统中名为shm_nattch的共享内存挂载计数器采用了16位有符号整数类型。
2026年10月16日,Calif正式发布该漏洞利用代码,而OpenBSD早在发布前就已完成两个漏洞的修复工作。本次公开的研究仅涉及本地提权利用方法,目前未观测到相关漏洞在真实攻击中被活跃利用。
Part01
双漏洞链实现本地提权
第一个漏洞存在于System V共享内存处理逻辑中。本地用户可通过反复派生绑定共享内存记录的子进程,让shm_nattch计数器的值超过32767的上限,溢出后变为负值,触发整数溢出问题,进而引发竞态条件,最终导致内核出现UAF漏洞。第二个漏洞可实现条件越界写入,让研究人员有足够能力控制内存破坏流程,将其转化为root权限获取路径。
Calif开发的利用PoC会首先映射127个共享内存段,随后移除这些映射。PoC会派生259个子进程,强制让计数器发生溢出回绕。完成这一步后,PoC会调整内核堆内存布局,通过sysctl(KERN_MALLOCSTATS)接口监控内存分配器的运行数据。
PoC会启动一个进程,通过IPC_RMID指令将一个共享内存对象标记为待删除状态,同时启动辅助进程在精准的时间点尝试挂载新的内存段。一旦成功抢占这个竞态窗口,内核就会出现内存分配大小混淆的问题。
接下来,研究人员将IP套接字对象布置在已释放内存的附近,调用IP_MULTICAST_TTL创建一个持久的struct ip_moptions结构体对象,通过第二个漏洞的越界写入能力修改这个结构体中的两个成员计数器。关闭套接字会触发计数器的原子修改操作,改变OpenBSD的自引用页表映射关系,让用户空间的内存映射对内核态可见,PoC就可以覆写一个地址可预测的内核指针。
完成指针覆写后,PoC就可以在内核态执行代码,修复被修改的指针,最终打开root权限shell。这套漏洞利用链可以在开启KARL、SMAP、SMEP等OpenBSD原生防护机制的环境下成功运行,不需要单独的信息泄露漏洞辅助。
KARL机制会在系统启动时随机化内核代码和数据的加载地址,但Calif研究人员发现,在相同硬件上,内核内存分配器的部分数据地址仍然可以预测。系统启动早期生成的对象会加载到固定位置,让PoC可以精准定位lo0和enc0接口的ioctl处理函数指针。
Part02
官方已发布内核补丁
OpenBSD已经通过Errata 018补丁修复了整数溢出漏洞,通过Errata 026补丁修复了引用计数导致的UAF漏洞。OpenBSD 7.9版本的勘误页面已经列出了适配所有架构的两个漏洞修复方案。
amd64、i386、arm64架构的用户可以通过syspatch工具获取二进制更新包。管理员需要安装所有可用补丁并重启系统,确保修复后的内核正式生效。
Part03
PoC源码已公开
Calif研究人员还提出了更广泛的防护优化建议,包括为链表添加安全脱链检查、随机化页表映射位置、降低内核内存分配的可预测性。编译器层面的数组边界检查、内存分配隔离等特性,也可以提升同类内存漏洞的利用难度。
本次漏洞的PoC源代码已经对外公开。Calif在代码仓库中说明,该研究属于其MAD Bugs安全研究项目的成果。
这一案例说明,老旧设计缺陷可能在被广泛信任的操作系统代码中隐藏数十年之久。此前安全行业还曾披露过存在27年历史的OpenBSD认证漏洞,以及时间更早的OpenBSD NFS双重释放漏洞。
参考来源:
37-Year-Old Kernel Flaw Exploited to Gain Root Access on OpenBSD — PoC Released
https://cybersecuritynews.com/37-year-old-kernel-openbsd-flaw/