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"產生了一個獨立于架構的變體。