Linux内核v4.19安全特性深度解析:L1TF防御、文件保护与寄存器清理

本文详细介绍了Linux内核v4.19版本中的多项安全增强特性,包括L1终端故障防御机制、受保护文件创建限制、系统调用寄存器清理以及可变长度数组移除等关键技术改进。

Linux内核v4.19于今日发布。以下是我发现的一些有趣的安全相关特性:

L1终端故障(L1TF)

尽管看似遥远,L1TF的修复实际上在v4.19合并窗口初期就已落地。与其他推测执行漏洞修复类似,许多人参与了这项工作,范围相当广泛:包括裸机、虚拟机等。LWN对L1TF漏洞有详细报道,内核关于L1TF防御的文档同样详尽。我喜欢裸机解决方案的简洁性:当页表条目应标记为无效时,不仅更改“Present”标志,还会反转地址部分,因此即使忽略“Present”标志的推测查找也会落入未映射区域。

受保护常规文件和FIFO文件

Salvatore Mesoraca在/tmp目录中为FIFO和常规文件实现了O_CREAT限制。这类似于现有的符号链接限制,在粘滞位全局可写目录(如/tmp)中,当打开用户与现有文件(或目录)所有者不匹配时生效。当程序使用O_CREAT打开FIFO或常规文件且存在此类用户不匹配时,会视为同时使用了O_EXCL:由于文件已存在而被拒绝,内核希望保护程序免于向不同用户拥有的文件写入可能敏感的内容。随着符号链接和硬链接竞争条件的消除,这已成为更常见的攻击向量。

系统调用寄存器清理(arm64)

攻击者影响内核中潜在推测执行漏洞的一种方式是通过“未使用”的寄存器内容将信息泄漏到内核中。大多数系统调用仅接受少量参数,因此可以清理所有其他调用约定定义的寄存器,而不是保留它们在用户空间中的任意内容。事实证明,清理寄存器非常快速。与x86上的类似工作类似,Mark Rutland在arm64上实现了完整的寄存器清理系统调用包装器。

可变长度数组移除(第3部分)

如第1部分和第2部分所述,内核继续移除VLA。虽然CONFIG_THREAD_INFO_IN_TASK和CONFIG_VMAP_STACK覆盖了堆栈耗尽攻击的大部分问题,但并非所有架构都具有这些功能,因此消除VLA确保我们在所有内核架构和配置中排除几类漏洞。这是一条漫长的道路,随着剩余VLA移除工作在下个内核中落地,这将成为一个4部分的传奇。在v4.19中,多人继续帮助解决这个问题:Arnd Bergmann、Kyle Spiers、Laura Abbott、Martin Schwidefsky、Salvatore Mesoraca和我本人。

移位溢出辅助函数

Jason Gunthorpe注意到,虽然内核最近获得了add/sub/mul/div辅助函数来检查算术溢出,但我们没有左移的任何内容。他添加了check_shl_overflow()来完善工具箱,Leon Romanovsky立即使用它来解决RDMA中的溢出问题。

编辑:我首次发布时忘了提到下一个特性:

可信架构支持的RNG初始化

内核中的随机数生成器从其许多熵源(包括任何架构特定源,例如x86的RDRAND)种子化其池。由于许多人由于无法审计其操作而不愿信任架构特定源,来自这些源的熵未计入RNG初始化,初始化希望收集“足够”的熵后才声称已初始化。然而,由于某些系统在启动时未生成足够的熵,在RNG变得可用之前需要一段时间来收集足够的系统熵(例如来自中断),这可能会阻止用户空间启动(例如systemd希望获取早期熵)。为了帮助这些情况,Ted T’so引入了一个切换选项,以完全信任架构特定熵(即RNG在获取架构特定熵后立即被视为完全初始化)。要使用此功能,可以使用CONFIG_RANDOM_TRUST_CPU=y构建内核(或使用“random.trust_cpu=on”启动)。

目前就这些;感谢阅读。v4.20的合并窗口已打开!祝我们好运。:)

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

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