Linux 内核是一个不断迭代的代码库,截至 2021 年,其代码行数已超过 3000 万行。然而,由于用户通常不会运行最新的顶层 Linux 内核,因此从用户的角度来看,它也是一个非常分散的代码库,这对安全性有重要影响。一致的安全属性(跨内核版本、处理器架构、编译器版本)是grsecurity一个重要目标,但顶层通常不会将添加的预防性安全检查或功能向后移植到旧支持的内核,并且这些措施的状态没有很快被最终用户采用,实际上,必须是有经验的专注于安全的内核开发人员才能确定他们自己系统的状态。
__compiletime_object_size()/__builtin_object_size() 的历史 __builtin_object_size()在2005年Arjan van de Ven编写的FORTIFY_SOURCE补丁中首次使用。它最初关注的是FORTIFY_SOURCE在用户级中也涵盖的典型的str*和mem* api。2009 年,在研究 FORTIFY_SOURCE 在内核中的实际覆盖范围时,我将 Arjan 的工作扩展到对更多函数执行检查,并增加了它对一些 [k|v]malloc 对象大小的编译时知识,发现它只检测了约 30% 的涵盖 API 实例,不过从安全角度来看,是不太可能出现被攻击的。
这些 str* 和 mem* API 的覆盖范围是在 2017 年 7 月为 4.13 内核提交“include/linux/string.h: add the option of fortified string.h functions ”,但没有提及早期的工作,或者任何使用一些动态分配对象大小的改进知识,将其有效覆盖率降低到我最初调查的 30% 以下。
2009 年 Arjan van de Ven 通过提交“x86: Use __builtin_object_size() to validate the buffer size for copy_from_user()”为 x86 顶层添加了用于 copy__*_user 的 __builtin_object_size()。这个Linux 2.6.34的初始版本只覆盖了copy_from_user,仅从 2013 年 10 月开始涵盖 copy_to_user,其中 Jan Beulich 为 Linux 3.13 提交了"x86: Unify copy_to_user() and add size checking to it "。它看到了许多重构,最终通过 Al Viro 在 2017 年 3 月为 4.12 版本的 Linux 提交"generic ...copy_..._user primitives"产生了一个独立于架构的变体。