Linux v5.3 安全特性解析:堆内存初始化、CR4/CR0 锁定与更多内核加固

本文详细介绍了Linux内核v5.3版本中的多项安全增强特性,包括堆内存初始化选项、pidfd_open()系统调用、全局启用-Wimplicit-fallthrough警告、x86 CR4与CR0寄存器位锁定、kfree()健全性检查、arm64默认启用KASLR以及硬件安全漏洞披露流程文档化。

Linux v5.3 中的安全特性

Linux 内核 v5.3 发布了!虽然这篇博客文章来得稍晚,但现在终于完成了!:) 以下是我发现的一些有趣的安全相关特性:

堆变量初始化

在持续清除内核中“未初始化”变量的工作中,Alexander Potapenko 添加了新的“init_on_alloc”和“init_on_free”启动参数(以及相关的 Kconfig 默认值),用于在分配时(即所有 kmalloc() 实际上变为 kzalloc())、释放时(即所有 kfree() 实际上变为 kzfree())或两者同时进行时对堆内存进行清零。在大多数工作负载下,前者的性能影响似乎低于 1%(如果可测量的话)。然而,“init_on_free”选项成本更高,但具有减少堆内容在释放后的存活时间的优点(这可能对某些释放后使用攻击或侧信道攻击有用)。每个人都应启用 CONFIG_INIT_ON_ALLOC_DEFAULT_ON=1(或使用“init_on_alloc=1”启动),更偏执的系统构建者应添加 CONFIG_INIT_ON_FREE_DEFAULT_ON=1(或在启动时使用“init_on_free=1”)。如果发现导致性能问题的工作负载,可以调整初始化覆盖范围。

添加 pidfd_open()

Christian Brauner 通过创建下一个需要的系统调用继续他的 pidfd 工作:pidfd_open(),它接受一个 pid 并返回一个 pidfd。这对于尚未使用 CLONE_PIDFD 的进程创建以及可能未挂载 /proc 的情况非常有用。

全局启用 -Wimplicit-fallthrough

Gustavo A.R. Silva 完成了内核中剩余的少量隐式 fallthrough 修复,从而允许在所有内核构建中全局启用 -Wimplicit-fallthrough。这将防止任何新的这种不良代码模式再次进入内核。在识别和修复了数百个隐式 fallthrough 后,大约十分之一缺少 break 语句,这远高于我的预期,使得这项工作更加合理。

x86 CR4 和 CR0 锁定

在最近的漏洞利用中,使攻击者生活更轻松的步骤之一是通过找到写入 CPU 控制寄存器的方法来禁用 CPU 保护,如 Supervisor Mode Access(和 Execute)Prevention(SMAP 和 SMEP)。例如,CR4 控制 SMAP 和 SMEP,禁用这些功能将使攻击者能够再次从内核代码访问和执行用户空间内存,从而为攻击提供更大的灵活性。CR0 控制 Write Protect(WP),禁用后攻击者将能够写入只读内存,如内核代码本身。攻击一直使用内核的 CR4 和 CR0 写入函数来进行这些更改(因为获得该级别的执行控制更容易),但现在内核将尝试“锁定”CR4 和 CR0 中的敏感位,以避免它们被禁用。这迫使攻击者在未来进行更多工作来实施此类寄存器更改。(我希望 KVM 也能强制执行这一点,这将实际保护客户内核免受所有更改受保护寄存器位的尝试。)

额外的 kfree() 健全性检查

为了避免损坏的指针在释放时做出疯狂的事情(如最近的漏洞利用中所见),我添加了额外的健全性检查,以验证 kmem 缓存成员资格并确保对象实际上属于内核 slab 堆。提醒一下,每个人都应使用 CONFIG_SLAB_FREELIST_HARDENED=1 进行构建。

arm64 默认启用 KASLR

正如内核地址空间布局随机化(KASLR)在 x86 上默认启用一样,现在 KASLR 也在 arm64 上默认启用。但值得注意的是,为了从此设置中受益,用于此类 arm64 系统的引导程序需要支持 UEFI RNG 函数或通过“/chosen/kaslr-seed”设备树属性提供熵。

硬件安全漏洞披露文档

由于硬件缺陷的长尾问题持续存在,需要在内核社区中保密报告,因此记录了一个明确定义的流程。这将让不熟悉如何处理事情的供应商遵循既定的最佳实践,以在 embargo 解除之前开发缓解措施。此流程的最新(和 HTML 渲染)版本应始终可在此处获得。

这些是我关注的内容。如果还有其他我应该添加的内容,请告诉我!Linux v5.4 即将到来……

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

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