Linux内核v5.4安全特性
发布日期:2020年2月18日
分类:博客、Chrome OS、Debian、内核、安全、Ubuntu、Ubuntu服务器
引言
Linux内核v5.4于2019年11月下旬发布。尽管假期耽误了时间,但迟到总比不到好!;) 以下是我发现的一些有趣的安全相关特性。
waitid() 新增 P_PIDFD 模式
Christian Brauner 继续他的 pidfd 工作,为 waitid() 添加了一个关键模式:P_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 许可协议授权。
评论 (2)
Chris — 2020年5月18日 @ 10:29 pm
感谢 Kees 总结每个内核版本的所有安全相关内容。我一直很喜欢这些文章。也许我(和其他人?)应该早点说出来,因为现在……我错过了 v5.{5,6} 的条目 :-) 但我想你只是忙于编写实际代码来改进内核的安全方面,这同样很好,所以——也感谢你!
kees — 2020年5月26日 @ 2:52 pm
是的,我有点落后了。目前正在努力修复。:) 感谢你的耐心!