Linux v5.6 中的安全特性
先前版本:v5.5。
Linux v5.6 于2020年3月发布。以下是我关注到的各种特性的快速总结:
WireGuard
广泛使用的 WireGuard VPN 长期处于树外状态。在其初始上游 RFC 发布三年半后,Ard Biesheuvel 和 Jason Donenfeld 完成了为 v5.5 内核整理所有加密先决条件的工作。在此版本中,Jason 成功将 WireGuard 本身纳入内核。这是一条曲折的道路,我感谢所有参与人员坚持到底并导航了妥协和替代解决方案。
openat2() 系统调用和 RESOLVE_* 标志
Aleksa Sarai 向内核的 open() 处理添加了许多重要的路径解析“作用域”选项,包括不遍历路径层次结构中的特定点之上(RESOLVE_BENEATH)、禁用 procfs(例如 /proc/$pid/exe)和其他伪文件系统中的各种“魔法链接”解析(RESOLVE_NO_MAGICLINKS),以及将给定查找视为相对于不同根目录发生(如同在 chroot 中,RESOLVE_IN_ROOT)。作为此过程的一部分,很明显无法正确扩展现有的 openat() 系统调用,因此他添加了 openat2()(这是努力编纂“可扩展系统调用”参数的一个好例子)。RESOLVE_* 标志集还涵盖了先前的行为,如 RESOLVE_NO_XDEV 和 RESOLVE_NO_SYMLINKS。
pidfd_getfd() 系统调用
在急需的 pidfd API 的持续增长中,Sargun Dhillon 添加了 pidfd_getfd() 系统调用,这是一种以无竞争方式(或当 /proc 未挂载时)获取进程文件描述符的方法。在此之前,无法始终确保通过 /proc/$pid/fd/$N 打开文件描述符实际上会与正确的 PID 关联。有关此内容的更多详细信息已在 LWN 上撰写。
通过 io_uring 的 openat()
戴着“攻击面减少”的帽子,我个人对 io_uring() 系列 API 持怀疑态度,但我不能否认它们对某些类型工作负载的效用。能够在不实际进行系统调用的开销下管道化读取和写入对性能非常有益。Jens Axboe 添加了 IORING_OP_OPENAT 命令,以便现有的 io_uring 可以打开文件,动态添加到给定 io_uring 的可用读/写目标映射中。虽然 LSM 仍然能够愉快地拦截这些操作,但我对 io_uring 正在成为日益增长的“系统调用多路复用器”保持警惕。当然,我很高兴看到它有一个全面的(尽管是“树外”)测试套件作为 liburing 的一部分。
移除阻塞随机池
在对消除单独熵池以生成随机数进行算法更改后,Andy Lutomirski 移除了阻塞随机池。这显著简化了内核 pRNG 代码,而不损害设计用于获取“加密安全”随机数的用户空间接口。引用 Andy 的话,“此系列不应破坏任何现有程序。/dev/urandom 保持不变。/dev/random 在启动后仍会阻塞,但阻塞次数比以前少。”有关此系列的详细历史和讨论,请参见 LWN。
arm64 对片上 RNG 的支持
Mark Brown 添加了对未来 ARMv8.5 的 RNG(SYS_RNDR_EL0)的支持,从内核的角度来看,这类似于 x86 的 RDRAND 指令。这将提供一种独立于引导程序的方法,为内核的 pRNG 添加熵,用于早期启动随机性(例如堆栈金丝雀值、内存 ASLR 偏移等)。在人们运行在 ARMv8.5 系统上之前,他们可以继续依赖引导程序在 arm64 上提供随机性(通过 UEFI RNG 接口)。
arm64 E0PD
Mark Brown 添加了对未来 ARMv8.5 的 E0PD 功能(TCR_E0PD1)的支持,这会导致从用户空间到内核空间的所有内存访问在恒定时间内故障。这是尝试消除从用户空间探测内核内存布局时任何可能的时间侧信道信号,作为对抗 Meltdown 式攻击的替代方法。期望是 E0PD 将用于替代 arm64 上更昂贵的内核页表隔离(KPTI)功能。
powerpc32 VMAP_STACK
Christophe Leroy 向 powerpc32 添加了 VMAP_STACK 支持,加入了 x86、arm64 和 s390 的行列。这有助于防御依赖于耗尽内核堆栈以与相邻内核堆栈冲突的各种攻击类别。(另一个常见目标,敏感的 thread_info,已在 Linux v5.1 中由 Christophe Leroy 从堆栈底部移开。)
通用页表转储
与 RISCV 添加页表转储(通过 /sys/fs/debug/kernel_page_tables)的工作相关,Steven Price 从多个架构中提取了现有实现,并创建了一个通用页表转储框架(然后重构了所有其他架构以使用它)。我很高兴拥有这个,因为我仍然记得当没有可用的页表转储器用于 ARM 时,在尝试实现上游内核内存保护时延迟了我一段时间。任何使架构更容易正确运行其内核内存保护的事情都让我高兴。
目前就这些;如果您认为我遗漏了什么,请告诉我。接下来:Linux v5.7。
© 2020 – 2022, Kees Cook。本作品根据知识共享署名-相同方式共享 4.0 许可协议授权。
评论 (1)
1 条评论
随着 arm64 架构扩展,我们可能会在架构的早期修订版上看到一些实现——实现可以提供较新架构修订版的一些功能,而无需实现该修订版的所有强制功能。相反,v8.5-RNG 可能不会出现在 v8.5 系统上,因为它是可选的。
评论者:Mark Brown — 2020年9月5日 @ 5:07 am