Linux内核v4.12安全特性深度解析
Linux内核v4.12的安全特性
发布日期:2017年7月10日
分类:Chrome OS, Debian, 内核, 安全, Ubuntu, Ubuntu-Server
作者:kees @ 凌晨1:24
以下是Linux内核上周发布的v4.12版本中一些有趣安全特性的快速总结:
x86只读与固定位置GDT
通过内核内存基地址随机化,攻击者仍可通过"sgdt"指令获取每CPU基地址,因为该指令会暴露每CPU GDT(全局描述符表)的位置。为解决这一问题,Thomas Garnier将GDT移至固定位置。同时,为防范攻击者利用内核漏洞直接 targeting GDT,他还将其设置为只读。
用户拷贝整合
在强化用户拷贝(hardened usercopy)功能上线后,Al Viro仔细审查了所有用户拷贝例程,并将各架构的uaccess代码整合为单一实现。各架构代码功能高度相似,消除冗余合情合理。在此过程中,他发现了多个架构中未处理的边缘情况(通过整合得以修复),并使强化用户拷贝适用于所有剩余架构。
PowerPC上的ASLR熵系统控制
Michael Ellerman继续扩展ASLR熵系统控制的架构支持,实现了PowerPC所需计算。这使得用户空间可选择增加内存布局使用的熵值。
LSM结构只读化
James Morris利用__ro_after_init使LSM(Linux安全模块)结构在启动后变为只读。这消除了它们作为攻击者理想目标的风险。由于内核各处都会调用这些钩子,这曾是攻击者劫持内核执行的首选方法。(类似目标过去是系统调用表,但早已设为只读。)注意:CONFIG_SECURITY_SELINUX_DISABLE会移除此保护,请确保该配置保持禁用状态。
x86默认启用KASLR
许多发行版已通过CONFIG_RANDOMIZE_BASE和CONFIG_RANDOMIZE_MEMORY在x86上启用KASLR(内核地址空间布局随机化),Ingo Molnar认为该功能已足够成熟,可默认启用。
64位系统上扩展栈金丝雀至64位
CONFIG_CC_STACKPROTECTOR使用的栈金丝雀值在x86上最为强大,因为每个任务的值不同。(其他架构对所有任务使用单一金丝雀。)虽然x86(及其他架构)上选择的第一个金丝雀是完整的unsigned long,但后续为x86每个任务选择的金丝雀被截断为32位。Daniel Micay修复了此问题,现在x86(及未来支持每任务金丝雀的架构)为栈保护器显著增加了熵值。
扩展堆栈间隙
Hugh Dickens在多人协助下改进了内核对堆栈碰撞的缓解措施。这是防范Stack Clash攻击的临时措施。进一步的强化需编译器在大型栈扩展时生成"栈探针"。栈上的任何可变长度数组或alloca()使用需生成机器代码以触及这些区域内的每个内存页,让内核知悉栈正在扩展,但以单页粒度进行。
以上就是全部内容;如有遗漏,请告知。v4.13合并窗口已开启!
编辑: Brad Spengler指出我未提及只读LSM结构与CONFIG_SECURITY_SELINUX_DISABLE的问题。现己补充。
©️ 2017, Kees Cook。本作品采用知识共享署名-相同方式共享4.0国际许可协议进行许可。
分类:博客(152)、Chrome OS(49)、Debian(117)、嵌入式(8)、通用(33)、健康(3)、Inkscape(8)、内核(37)、kernel.org(6)、多媒体(33)、网络(27)、逆向工程(15)、安全(130)、Ubuntu(179)、Ubuntu服务器(109)、车辆(2)、漏洞(12)、Web(14)
搜索:
链接:
- Outflux
-
fediverse
归档:
(按月选择的归档列表,从2005年1月至2023年10月)
元数据:
- 登录
- 文章RSS
- 评论RSS
- WordPress.org
由WordPress提供技术支持
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码