Linux内核v5.4中的安全技术亮点

本文详细介绍了Linux内核v5.4版本中的多项安全增强功能,包括waitid()的P_PIDFD支持、内核锁定机制、标记内存系统调用ABI、启动熵改进等,提升系统安全性和稳定性。

Linux内核v5.4中的安全技术亮点

Linux内核v5.4于11月下旬发布。假期让我有些耽搁,但迟到总比不到好!;)以下是我发现的一些有趣的安全相关内容:

waitid()获得P_PIDFD支持

Christian Brauner通过向waitid()添加关键模式P_PIDFD继续了他的pidfd工作。这使得通过pidfd回收子进程成为可能,并完成了执行进程生命周期管理的大部分程序所需的接口。(即pidfd可以来自/proc或clone(),并且可以使用waitid()等待。)

内核锁定

经过大约8年的时间,Linux现在可以在“ring 0”(内核内存)和“uid 0”(用户空间中的最高权限级别)之间划清界限。“内核锁定”功能试图枚举用户空间可能读取或修改内核内存(或在内核空间中执行)的所有有意方式(即接口而非缺陷),并禁用它们。虽然Matthew Garrett使内部细节可精细控制,但基本锁定LSM可以设置为禁用、“完整性”(内核内存可读但不可写)或“机密性”(不允许内核内存读取或写入)。除了填补用户空间和内核之间的许多漏洞之外,如果向内核添加可能违反内核完整性或机密性的新接口,现在有一个地方可以放置访问控制,让每个人都满意,并且不需要重新争论“但root具有完全内核访问权限”与“在某些系统配置中不行”之间的古老争论。

标记内存宽松系统调用ABI

Andrey Konovalov(与Catalin Marinas等人)引入了一种在内核中启用“宽松”标记内存系统调用ABI的方法。这意味着在支持指针地址高位(非VMA位)中内存标记(或“版本控制”或“着色”)的硬件上运行的程序可以使用这些地址与内核交互,而不会出现问题。这实际上是教内核在无意义的地方忽略这些高位(即数学比较),并在有意义的地方保留它们(即指针解引用)。

例如,如果用户空间内存分配器返回地址0x0f00000010000000(VMA地址0x10000000,带有例如高位标记0x0f),并且程序在系统调用期间使用此范围,最终对其调用copy_from_user(),如果标记位保留,初始范围检查将失败:“那不是用户空间地址;它大于TASK_SIZE(0x0000800000000000)!”,因此它们在该检查中被剥离。在实际复制到内核内存期间,标记保留,以便当硬件解引用指针时,可以检查指针标记与分配给引用内存区域的预期标记。如果不匹配,硬件将触发内存标记保护。

目前,在具有ADI(应用程序数据完整性)的Sparc M7 CPU上运行的程序可以将其用于硬件标记内存,ARMv8 CPU可以使用TBI(顶部字节忽略)进行软件内存标记,最终将有带有MTE(内存标记扩展)的ARMv8.5-A CPU。

启动熵改进

Thomas Gleixner对启动时熵不足感到厌烦,并促使Linus想出一种合理的方法在现代CPU上添加熵,利用时序噪声、周期计数器抖动,甚至推测执行的变异性。这意味着当某些系统没有足够的熵来服务来自systemd等的getrandom()系统调用时,启动时不应出现神秘的多秒(或多分钟!)挂起。

阻止用户空间写入交换文件

来自“这怎么会这么久没被注意到?”部门,Darrick J. Wong修复了内核,不允许从用户空间写入活动交换文件。没有这个,具有交换文件写入权限的用户(通常是root)可以修改其内容,从而在进程被换回时更改其内存内容。虽然root通常可以使用CAP_PTRACE直接修改运行中的进程,但这是一个漏洞,允许权限较低的用户(例如“磁盘”组中的任何人)在没有所需能力的情况下仍然绕过ptrace限制。

将strscpy()大小限制为INT_MAX

一般来说,如果大小变量最终大于INT_MAX,某个地方的计算已经溢出。即使没有,它可能会碰到附近某处的代码,这些代码无法很好地处理结果。正如在VFS核心和vsprintf()中已经做的那样,我向strscpy()添加了一个检查,拒绝大于INT_MAX的大小。

移除ld.gold支持

Thomas Gleixner移除了对gold链接器的支持。虽然这没有直接的安全好处,但ld.gold一直是奇怪错误的持续来源。具体来说,我注意到它在开发KASLR时很痛苦,最近在稳定使用Clang构建内核时引起问题。移除此链接器支持使未来事情变得更容易。Clang和ld.lld中有足够多的奇怪错误需要修复。;)

禁用Intel TSX

鉴于攻击者使用Intel的事务同步扩展(TSX)CPU功能利用推测缺陷,Pawan Gupta在支持禁用TSX的CPU上默认禁用该功能。

这就是这个版本的全部内容。如果我遗漏了什么,请告诉我。:)接下来是Linux v5.5!

© 2020, Kees Cook。本作品根据知识共享署名-相同方式共享4.0许可协议授权。

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