Linux内核v4.10安全特性深度解析

本文详细介绍了Linux内核v4.10版本中的多项安全增强特性,包括ARM64的PAN模拟、线程信息重定位、链表加固、UEFI随机数种子注入等关键技术,有效提升了系统对抗内存破坏和权限提升攻击的能力。

Linux内核v4.10安全特性

发布日期:2017年2月27日
分类:Chrome OS, Debian, 内核, 安全, Ubuntu, Ubuntu-Server

以下是Linux内核v4.10版本中一些有趣的安全特性快速总结:

ARM64上的PAN模拟

Catalin Marinas引入了ARM64_SW_TTBR0_PAN,功能上等同于ARM的CONFIG_CPU_SW_DOMAIN_PAN。虽然特权执行从不(PXN)在ARM硬件中已有一段时间可用,但特权访问从不(PAN)只有在供应商开始制造ARMv8.1或更高版本CPU时才能在硬件中使用。目前,所有设备仍使用ARMv8.0,这在ARM的安全缺陷缓解方面留下了一个空白,因为CONFIG_CPU_SW_DOMAIN_PAN只能在ARMv7系统上提供PAN覆盖,但在ARMv8.0上没有任何存在。这解决了这个问题,并关闭了arm64系统的一种常见利用方法。

ARM64上的thread_info重定位

正如之前在x86上所做的那样,Mark Rutland已将arm64上的thread_info移出内核堆栈。由于thread_info不再位于堆栈上,攻击者更难找到它,这使得颠覆非常敏感的addr_limit字段变得更加困难。

链表加固

我添加了CONFIG_BUG_ON_DATA_CORRUPTION来恢复v2.6.27(9年前)之前存在的原始CONFIG_DEBUG_LIST行为:如果检测到列表元数据损坏,内核拒绝执行操作,而不是仅仅警告并继续执行损坏的操作。由于链表损坏(通常通过堆溢出)是攻击者获得写任意位置原语的常见方法,如果元数据明显损坏,停止列表添加/删除操作非常重要。

从UEFI种子内核RNG

许多架构的一个问题是找到可行的早期启动熵源来初始化内核随机数生成器。对于x86,这主要通过RDRAND指令解决。然而,在ARM上,解决方案仍然非常依赖于供应商。事实证明,UEFI应该在一组通用API后面隐藏各种供应商特定的事情。EFI_RNG_PROTOCOL调用旨在提供熵,但不能在内核运行时调用。为了将熵引入内核,Ard Biesheuvel创建了一个UEFI配置表(LINUX_EFI_RANDOM_SEED_TABLE_GUID),该表在UEFI引导存根期间填充,并在早期引导期间馈入内核熵池。

ARM64 W^X检测

正如之前在x86上所做的那样,Laura Abbott在arm64上实现了CONFIG_DEBUG_WX。现在,任何危险的arm64内核内存保护将在启动时大声报告。

ARM上的64位get_user()清零修复

虽然修复本身相当小,但我喜欢这个错误是通过对lib/test_user_copy.c中的用户复制测试代码的联合改进发现的。Hoeun Ryu添加了失败时清零测试,我扩展了get_user()/put_user()测试以包括所有大小。单独的任何改进都不会发现ARM错误,但它们一起发现了一个边界情况下的拼写错误。

/proc/$pid/status中的no-new-privs可见性

这是一个微小的变化,但我喜欢能够外部检查进程。在此之前,我无法轻松回答“该进程是否设置了no-new-privs标志?”为了解决这个问题,我在/proc/$pid/status中暴露了该标志,作为NoNewPrivs。

PowerPC上的内核用户空间执行预防

类似于x86上的SMEP和ARM上的PXN,Balbir Singh在CONFIG_PPC_RADIX_MMU=y(默认)下在Power9及更高版本的PPC CPU上实现了保护。这意味着如果内核有一个函数指针被覆盖,它不能再指向用户空间内存中的任意代码。攻击者的能力减少到只能使用可执行内核内存,这在他们的控制下要少得多(并且可见性更有限)。

以上就是全部内容!如果您看到其他需要指出的内容,请告诉我。:) 我已经对v4.11合并窗口的开启感到兴奋了…

编辑:添加了关于Power9上SMEP的说明

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

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