Linux内核v4.12安全特性深度解析:从GDT固定到KASLR默认启用

本文详细介绍了Linux内核v4.12版本中的多项安全增强特性,包括x86架构的GDT固定与只读保护、用户拷贝功能统一、PowerPC的ASLR熵控制、LSM结构只读化、KASLR默认启用、64位栈保护金丝雀扩展及堆栈间隙防护等。

Linux内核v4.12安全特性解析

发布日期:2017年7月10日
分类:Chrome OS, Debian, 内核, 安全, Ubuntu, Ubuntu-Server

以下是Linux内核v4.12版本中一些有趣安全特性的快速总结:

x86只读与固定位置GDT

通过内核内存基地址随机化,攻击者仍可能通过“sgdt”指令推断出每CPU基地址,因为它会暴露每CPU GDT的位置。为解决此问题,Thomas Garnier将GDT移至固定位置。此外,为降低攻击者利用内核漏洞直接针对GDT的风险,他还将其设置为只读。

用户拷贝功能统一

在强化用户拷贝功能落地后,Al Viro决定仔细检查所有用户拷贝例程,并将每架构的用户访问代码统一为单一实现。各架构的代码功能上非常相似,因此消除冗余是有意义的。在此过程中,他发现了多个架构中未处理的边缘情况(通过统一得到修复),并使强化用户拷贝在所有剩余架构上可用。

PowerPC上的ASLR熵系统控制

Michael Ellerman继续扩展ASLR熵系统控制的架构支持,实现了PowerPC所需的计算。这允许用户空间选择增加用于内存布局的熵。

LSM结构只读化

James Morris使用__ro_after_init使LSM结构在启动后变为只读。这消除了它们作为攻击者理想目标的可能性。由于钩子从内核的各种位置调用,这曾是攻击者劫持内核执行的首选方法。(类似的目标曾是系统调用表,但早已设置为只读。)请注意,CONFIG_SECURITY_SELINUX_DISABLE会移除此保护,因此确保该配置保持禁用。

x86默认启用KASLR

由于许多发行版已通过CONFIG_RANDOMIZE_BASECONFIG_RANDOMIZE_MEMORY在x86上启用KASLR,Ingo Molnar认为该功能已足够成熟,可以默认启用。

64位系统上栈保护金丝雀扩展至64位

CONFIG_CC_STACKPROTECTOR使用的栈保护金丝雀值在x86上最强大,因为它每个任务都不同。(其他架构对所有任务使用单一金丝雀。)虽然x86(和其他架构)上选择的第一个金丝雀是一个完整的无符号长整型,但后续为x86每个任务选择的金丝雀被截断为32位。Daniel Micay修复了此问题,现在x86(以及未来获得每任务金丝雀支持的架构)显著增加了栈保护器的熵。

扩展堆栈/堆间隙

Hugh Dickens在多人输入下改进了内核的缓解措施,防止堆栈和堆相互冲突。这是一个临时措施,有助于防御Stack Clash攻击。额外的强化需要编译器在進行大栈扩展时生成“栈探测”。栈上的任何可变长度数组或alloca()使用都需要生成机器代码来触摸这些区域中的每个内存页,以让内核知道栈正在扩展,但以单页粒度进行。

以上就是本次更新的内容;如果我遗漏了任何内容,请告知。v4.13合并窗口已开放!

编辑: Brad Spengler指出我未能提及只读LSM结构与CONFIG_SECURITY_SELINUX_DISABLE的问题。现已添加。

© 2017, Kees Cook。本作品采用知识共享署名-相同方式共享4.0国际许可协议进行许可。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计