研究人员成功破解OpenBSD系统中的根攻击链漏洞,这一漏洞已有37年历史
原创
骨哥说事
骨哥说事
骨哥说事
2026年10月17日 11:34
上海
去阅读
| *声明:*文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 |
防走失:https://gugesay.com/
不想错过任何消息?设置星标↓ ↓ ↓
跨越时代的漏洞攻击链
在网络安全领域,有些漏洞如同沉睡的巨人,静静地躺在代码深处,数十年未被发现。安全公司Calif的研究人员近日揭示了一个令人震惊的发现:他们在OpenBSD系统中成功构建了一个本地权限提升漏洞利用链,其核心漏洞可以追溯到大约37年前的原始BSD源代码。更令人关注的是,这一攻击链成功绕过了OpenBSD引以为傲的多重安全防护机制,包括KARL(内核地址随机化链接)、SMAP(主管模式访问预防)和SMEP(主管模式执行预防)三大硬件级保护。
历史溯源:37年的代码遗产如何成为安全突破口
共享内存攻击计数器的历史包袱
漏洞的根源可以追溯到1988年的原始BSD源码。在代码的深处,共享内存附件计数器shm_nattch被定义为有符号16位short类型,其最大值为32,767。OpenBSD作为BSD的衍生系统,继承了这一数据类型且从未进行过扩展。
历史代码的延续性:研究人员Andrew Griffiths在技术报告中指出:\"这个漏洞可以在原始BSD源代码中追溯到大约37年前。\"这种代码遗产的连续性问题揭示了开源系统长期维护中的一项重大挑战。
技术背景:共享内存机制的演进
SysV共享内存是Unix系统中进程间通信的重要机制,允许不相关的进程共享内存段。然而,设计初期的内存和硬件限制导致了许多早期选择在今天看来可能存在问题。这个16位有符号整数计数器就是这样一个历史遗留的技术债务。
漏洞利用链的技术架构
第一阶段:整数溢出实现计数器回绕
Calif研究人员设计了精妙的攻击序列,以实现这一历史漏洞的利用:
- 映射127个SysV共享内存段,并通过
munmap()解除映射 - 分叉259个进程,推动共享内存附件计数超过其最大值32,767
- 计数器回绕至-32,643,完成整数溢出攻击
第二阶段:堆布局与竞态条件利用
研究人员使用系统统计信息进行堆布局,通过sysctl(KERN_MALLOCSTATS)监控分配的页面数量。然后在一个进程中使用IPC_RMID,同时在辅助进程中附加新的共享内存段以赢得竞态条件。
第三阶段:出界写入与权限转义
攻击链的高潮涉及到一个复杂的权限提升过程:
- IP套接字对齐:对齐IP套接字分配并将
IP_MULTICAST_TTL设置为非默认值2 - 关键结构分配:分配持久的16字节
struct ip_moptions结构,其最后字包含两个16位计数器:imo_num_memberships和imo_max_memberships - 出界写入:触发条件-1出界写入以覆盖这两个成员计数器
- 权限切换:通过
close()函数遍历组成员,触发修改PTE自指映射的原子递减操作 - 内核代码执行:覆盖可预测的内核指针以执行内核代码
安全机制的突破:如何绕过三大防护壁垒
KARL(内核地址随机化链接)的局限性
OpenBSD的KARL机制会在内核启动时重新链接内核二进制文件,以随机化函数和数据地址。然而,研究人员发现了一个关键弱点:\"内核的内存分配器仍然是确定性的。\"
漏洞原因:启动时分配器和最佳适合分配器都缺乏基址随机化。因此,早期启动结构(包括网络接口处理程序中的函数指针)在相同硬件的不同重新启动中都位于相同地址。攻击者无需信息泄露漏洞即可确定这些地址。
硬件保护机制的挑战
攻击链中最令人印象深刻的是它成功规避了现代硬件提供的安全保护:
SMAP(主管模式访问预防)绕过:通过在PTE级别修改页面权限,攻击成功将用户空间内存映射转换为内核可访问的映射,从而绕过SMAP的隔离保护。
SMEP(主管模式执行预防)规避:通过类似的技术机制,攻击者使得用户空间代码可以在内核权限下执行,绕过了SMEP的执行保护界限。
攻击链的核心创新:Write-What-Where原语
研究人员从更高层面总结了这个漏洞最终获得代码执行的方式:\"这个漏洞最终通过一个Write-What-Where原语获得代码执行,其中Write由TAILQ_REMOVE引起,What是我们通过绕过SMAP/SMEP而变得主管模式可访问的用户空间内存映射,Where是一个可预测的内核指针位置。\"
这种原语的实现代表了高端漏洞利用技术的重要突破,它能够直接将精心构造的值写入特定的内核内存位置。
修复与安全防护建议
OpenBSD的官方修复方案
两个漏洞已被OpenBSD项目分别修复:
- Errata 018:9月14日发布的可靠性修复,针对shmat(4)附加函数中的整数溢出
- Errata 026:9月30日发布的安全修复,针对引用计数使用后释放漏洞
这些修复通过syspatch工具提供,支持所有系统架构,OpenBSD 7.8也接收了整数溢出修复。
Calif提出的四层加固建议
除了上述两个补丁外,Calif提出了四个层次的系统加固建议:
1. 安全取消链接: 借鉴FreeBSD和NetBSD的实现,在取消链接内存写入前检查双向链表不变性
2. 页面表自参考映射随机化: 通过随机字节选择PML4插槽,在启动时安装递归条目
3. 内核分配器随机化: 通过随机化基址和运行时分配顺序使内核分配器非确定性
4. 编译器边界检查: 利用数组边界消除器和分配令牌等编译器特性
技术意义与行业影响
历史代码审查的重要性
这个案例强调了长期运行系统的历史代码审计的价值。虽然OpenBSD以其代码审计文化而闻名,但仍有37年历史的漏洞潜伏在系统深处。这提醒我们,即使是最严谨的安全项目也可能遗漏历史遗留问题。
AI时代的安全挑战
研究人员在技术报告中警示:\"在AI辅助漏洞发现的时代,针对整个漏洞类别进行缓解与增加攻击复杂性变得更加关键。\"这一立场反映了安全社区对AI可能加速漏洞发现的普遍关注。
开源安全的协作模式
Calif的工作体现了安全研究公司与开源项目之间理想的协作模式:他们报告漏洞、提供补丁建议、协助修复过程,并展示适当的负责任披露时间线。这种协作有助于提高整个开源生态系统的安全性。
实践建议与安全更新
修复状态检查
用户应立即检查系统更新并应用以下补丁:
- OpenBSD 7.9:已修复于errata 018和errata 026
- OpenBSD 7.8:已接收整数溢出修复
防御性加固
OpenBSD管理员应考虑实施Calif建议的部分防御措施,特别是在高安全环境中运行的系统。虽然KARL提供了基本保护,但结合其他防御层可以创建更强大的安全态势。
网络安全的长远思考
这一37年历史的漏洞的发现和利用向我们展示了网络安全领域的深层挑战:
- 技术债务的累积效应:历史设计决策的长期影响可能远超预期
- 深度防御的重要性:没有任何单一安全机制是完美的
- 安全研究的持续性:即使是经过严格审计的系统也可能存在长期潜伏的漏洞
- 开源协作的价值:负责任披露和厂商协作对于维护系统安全至关重要
OpenBSD作为安全至上的操作系统,通过其快速响应和补丁发布,再次证明了其在安全承诺方面的专业精神。同时,Calif的研究工作展示了深度安全研究在识别和修复复杂漏洞链中的关键作用。
对于广大IT从业者和安全研究人员,这一案例提醒我们:安全防御必须与时俱进,而历史代码审计必须持续进行。在网络安全领域,今天的防御创新必须考虑明天可能被发现的攻击技术。毕竟,最好的防御不仅来自预见未来的攻击,更来自理解历史的教训。
参考资料:
- The Hacker News: Researchers Demonstrate OpenBSD Root Exploit Chaining 37-Year-Old Shared-Memory Bug
- Calif Research: Big Fish: Exploiting a 37-Year-Old Kernel Bug in OpenBSD
- GitHub: Calif OpenBSD Exploit Code and Analysis
- OpenBSD Errata 018
-
OpenBSD Errata 026
-
END -
感谢阅读,如果觉得还不错的话,动动手指给个三连吧~
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论