-
-
[翻译]Linux4.13中的新安全特性
-
发表于: 2017-9-11 22:09 3426
-
Linux4.13中的新安全特性
本文简要概括一下最新发布的Linux内核v4.13的一些有趣的新安全特性。
安全文档ReSTification
我们已经切换到用ReST排版内核文档,并且我也注意到,到目前为止Documentation/security/目录树并未转换过来。我借机将其中一些重新排版,并按Jon Corbet的建议划分为终端用户文档(主要是关于如何使用Linux安全模块)和开发者文档(主要是关于如何使用各种内部API)。还有一大批这样的文档亟待更新,故希望通过增加“曝光率“,以期大家更多的关注。
CONFIG_REFCOUNT_FULL
自从Peter Zijlstra在v4.11中引入refcount_t API,Elena Reshetova(以及Hans Liljestrand和Davis Windsor)已经有计划、有步骤地用refcount_t替代atomic_t引用计数器。至于v4.13,已有将近125个已被转换,未来将会有更多。然而,一些网络模块、子系统模块的维护者担忧refcount_t的性能。为了缓和这些担忧以及持续推进更换进程,我添加了一个“未审核的“refcount_t(与早期的atomic_t完全一样)作为默认选项。现在,完整审核过的CONFIG_REFCOUNT_FULL已经可用了。我们计划对于v4.14及其后续版本,内核将会开发针对特定架构、性能与atomic_t相当的refcount_t。
CONFIG_FORTIFY_SOURCE
Daniel Micay新开发的glibc的FORTIFY_SOURCE,将会在编译和运行时检查常用数组函数(例如strcpy,strcmp)和内存函数(如memcpy,memcmp)的溢出。其想法是,既然编译器知道这些函数的大多数参数的缓冲区大小,那么便可以在编译器内检查缓冲区溢出问题。进行编译时,所有变量的大小已经确定,如果检查出有缓冲区溢出风险,便可立即终止编译,从而降低了缓冲区溢出风险。如果仅有一些参数大小确定(输出变量的大小在编译时即确定,而输入变量的大小直到运行输入数据时方能确定),增加的运行时检查将进一步截住缓冲区溢出危险。添加后,发现仍有少量泄露,我和Daniel紧急修复了这一小问题。
我注意到其中有趣的一点,该保护机制只检查整个对象的大小,例如(via_builtin_object_size(…,0))。如果结构内是字符串,当前的CONFIG_FORTIFY_SOURCE只会阻止你在外部随意复制,但是对于在结构内部的溢出,它也无能为力。接下来。我们将进一步增强其保护能力。然而,在许多情况下,内核总是有意地跨域复制数据,这意味着高等级的行为难以修正。
前置NULL栈警惕标志
Rik van Riel和Daniel Micay改变了定义在64位系统上的栈警惕标志的前导字节为0的实现。该机制明确了对字符串函数(如,strcpy)的溢出防范,这将有效阻止对NULL字节的读取、写入操作。与此同时,也将触发栈警惕标志(Stack Canary)的检查。这将使随机数熵由64bits降低到56bits,不过,权衡利弊之下,这样做还是·值得的。
IPC重构
为了部分地支持IPC结构层通过randstruct插件随机化,Manfred Spraul和我重新组织了IPC在内核中跟踪调用的实现内部层次。结果的分配变得更小、更易于处理。
Randstruct gcc插件
我把grsecurity的randstruct gcc插件移植过了。该插件允许结构层在每次构建起来后随机化,有效地防范针对敏感结构域在内核内存位置的攻击。通过将周围的事物活动起来(即随机化),使得攻击者在挂载有效攻击前将花费大量精力。
不幸的是,由于开发周期短促,目前只能通过手动模式开启该功能。V4.14将会开启自动模式,随机化所有仅含有函数指针的结构。
自从v4.10到现在的v4.13,我们对randstruct进行了大量的修订,大多数是grsecurity完成的,这些新奇的功能,既不像新添加的驱动,如whitelisted cross-struct casts,又不是在上游测试中发现的corner case on ARM。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- 通过 SWD 读写 STM32 固件 21668
- [翻译]我的创业产品如何被 2.2 W 美金收购 ? 7803
- [原创] 20 年征文 | 看雪之路 4479
- [翻译]使用 TensorFlow 机器学习自动化 RF 侧信道攻击 14475
- [翻译]固件分析--工具、方法技巧浅析(下) 20085