Linux v4.19 安全特性解析
Linux内核v4.19于2018年10月22日发布。以下是该版本中一些有趣的安全相关改进:
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国际许可协议进行许可。