Linux v4.18 内核安全技术深度解析

本文详细介绍了Linux内核v4.18版本中的多项安全改进,包括算术溢出检测辅助工具、内存分配参数优化、可变长度数组移除及Kconfig编译器检测功能,旨在提升系统安全性和稳定性。

Linux v4.18 中的安全特性

先前版本:v4.17

Linux内核v4.18于上周发布。以下是我发现的一些有趣的安全相关细节:

分配溢出检测辅助工具

C语言使用中的众多危险方式之一是缺乏处理算术溢出的强大原语。开发者不能简单地将一系列计算包装在try/catch块中以捕获可能溢出(或下溢)的计算。相反,C语言会愉快地将值回绕,导致各种缺陷。一段时间前,GCC添加了一组单操作辅助工具,可以高效检测溢出,因此Rasmus Villemoes建议在内核中实现这些工具(带有回退机制)。虽然仍需要开发者显式使用,但比在每个计算之前进行开放编码的类型敏感边界检查要可靠得多。作为这些例程的首次使用,Matthew Wilcox为常见的大小计算创建了包装器,主要用于内存分配期间。

从内存分配参数中移除开放编码的乘法

内核中的一个常见缺陷是内存分配大小计算期间的整数溢出。如上所述,C语言没有提供太多保护,因此需要开发者正确处理。为了减少这些错误的频率,并受到Silvio Cesare发现的几个缺陷的启发,我对内核进行了初步扫描,将内存分配期间的开放编码乘法转换为它们的双因子API对应物(例如,kmalloc(a * b, GFP...) -> kmalloc_array(a, b, GFP...)),或使用新的溢出检查辅助工具(例如,vmalloc(a * b) -> vmalloc(array_size(a, b)))。这里还有很多工作要做,因为通常分配大小会在变量中提前计算,而不是在分配参数中计算,并且溢出发生在比内存分配更多的地方。更好的做法是在未预期回绕的溢出处引发异常(例如,Emese Revfy的size_overflow GCC插件)。

可变长度数组移除,第二部分

如前所述,可变长度数组(VLA)继续从内核中移除。对于v4.18,我们继续得到了一群可爱的人的帮助:Andreas Christoforou、Antoine Tenart、Chris Wilson、Gustavo A. R. Silva、Kyle Spiers、Laura Abbott、Salvatore Mesoraca、Stephan Wahren、Thomas Gleixner、Tobin C. Harding和Tycho Andersen。几乎所有剩余的VLA移除都已排队等待v4.19,但看起来最后一个(在加密子系统深处)直到v4.20才会落地。我非常期待能够全局地将-Wvla添加到内核构建中,这样我们就可以摆脱VLA启用的一类缺陷,如堆栈耗尽和堆栈保护页跳转。消除VLA还简化了从grsecurity移植stackleak GCC插件的工作,因为它不再需要挂钩和检查VLA创建。

Kconfig编译器检测

虽然不严格是安全相关,但Masahiro Yamada对内核的Kconfig子系统进行了巨大改进,使得内核构建配置现在知道您正在使用什么编译器(以及其他内容),因此配置不再与编译器功能分离。例如,在过去,即使编译器不支持,也可以选择CONFIG_CC_STACKPROTECTOR_STRONG,随后构建会失败。或者在其它情况下,配置会静默降级到可用的内容,可能导致令人困惑的内核镜像,其中编译器会改变配置的含义。现在,编译器不可用的配置在Kconfig中 simply 不可选择。这使得配置更加一致,尽管在某些情况下,更难发现某些配置缺失的原因(例如,CONFIG_GCC_PLUGINS不再提示您需要安装插件开发包)。

目前就这些!如果您认为我遗漏了什么,请告诉我。请继续关注v4.19;合并窗口已打开。:)

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


评论 (2)

2条评论

可变长度数组移除,第二部分 - 这个内核强化功能对KPI会有什么影响,即kmalloc(m*n,GFP_XXX)分配m个大小为n的项目内存,或直接调用API kmalloc_array(m, bn, GFP…)。 评论由 Raju Tiwari — 2018年8月28日 @ 4:04 am

我不确定我明白您的意思。您是指内核页表隔离(Kernel Page Table Isolation)吗?那将完全无关。正常(无错误)的kmalloc()kmalloc_array()调用者将获得相同的内存分配——只是在后一种情况下会捕获乘法溢出。 评论由 kees — 2018年10月18日 @ 1:35 pm

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