Linux 5.10 終于拋棄了造成了安全隱患的老函數(shù)
Linus Torvalds 開(kāi)啟了 Linux 內(nèi)核的又一個(gè)開(kāi)發(fā)周期,宣布 5.10-rc1 發(fā)布了,而且這一次還有一個(gè)歷史性的轉(zhuǎn)折:新內(nèi)核標(biāo)志著一個(gè)幾十年前的函數(shù)的落幕,這個(gè)函數(shù)在被發(fā)現(xiàn)會(huì)導(dǎo)致安全漏洞后早已成為多余的函數(shù)。
隨著長(zhǎng)達(dá)兩周的,每一次新的 Linux 內(nèi)核迭代發(fā)布前的合并窗口的關(guān)閉,Torvalds 在 Linux 內(nèi)核郵件列表上分享了他的感想,他認(rèn)為“事情似乎相當(dāng)順利”。
“合并窗口”是 Linux 新內(nèi)核發(fā)布過(guò)程中的一個(gè)關(guān)鍵部分,在此窗口期間,每天有多達(dá) 1000 個(gè)由開(kāi)發(fā)者社區(qū)提交的補(bǔ)丁被合并到 Torvalds 管理的主線倉(cāng)庫(kù)中。而審查過(guò)程會(huì)確保每個(gè)補(bǔ)丁都能實(shí)現(xiàn)理想的變化。
這一次,Torvalds 提請(qǐng)大家注意移除了一個(gè)叫 set_fs() 的尋址函數(shù),這個(gè)函數(shù)可以追溯到 Linux 的最初版本。“對(duì)我來(lái)說(shuō),這是最有趣的變化,set_fs() 被移除了,”他寫(xiě)道,“這不是一個(gè)巨大的變化,但很有趣,因?yàn)?set_fs() 指定用戶空間副本是否真正進(jìn)入用戶空間或內(nèi)核空間的這個(gè)模式,幾乎可以追溯到 Linux 的最初版本。”
正如 Torvalds 所解釋的那樣,set_fs() 函數(shù)可以通過(guò)取消用戶空間和內(nèi)核空間之間的分界來(lái)覆蓋地址空間。該函數(shù)在管理英特爾早期 x86 處理器時(shí)被廣泛使用,以控制非特權(quán)代碼可以訪問(wèn)的虛擬地址范圍。
然而,2010 年,“常見(jiàn)漏洞和暴露”(CVE)詳細(xì)披露了 set_fs() 帶來(lái)的安全問(wèn)題。通過(guò)繞過(guò)某些訪問(wèn)限制,證實(shí)該函數(shù)能夠“覆蓋任意內(nèi)核內(nèi)存位置”和“獲得特權(quán)” —— 在某些情況下,這可以讓用戶空間覆蓋內(nèi)核數(shù)據(jù)。
鑒于該工具的安全缺陷,包括 x86、PowerPC、s390 和 RISC-V 在內(nèi)的一些架構(gòu)已經(jīng)取消了地址空間覆蓋功能。但是,正如 Torvalds 寫(xiě)道:“我們?nèi)匀涣糁?set_fs(),因?yàn)椴⒉皇敲總€(gè)架構(gòu)都已經(jīng)轉(zhuǎn)換為新的世界秩序。”
除了這個(gè)久違的歷史補(bǔ)救之外,5.10-rc1 版本和大多數(shù)內(nèi)核版本一樣,還伴隨著無(wú)數(shù)的變化。Torvalds 統(tǒng)計(jì)了近 1700 人的近 1.4 萬(wàn)次提交,改動(dòng)范圍從支持自動(dòng)駕駛汽車和機(jī)器人的 Nvidia SOC 芯片到支持任天堂 Switch 控制器。
統(tǒng)計(jì)結(jié)果表明。大約新增了 70.4 萬(wàn)行代碼和刪除了 41.9 萬(wàn)行代碼,這使得 5.10-rc1 的大小與 Linux 有史以來(lái)最大的內(nèi)核 5.8 相當(dāng)。“這看起來(lái)是一個(gè)比我預(yù)期的更大的版本,雖然合并窗口比 5.8 的窗口小,但也小不了多少,”Torvalds 說(shuō),“而 5.8 是我們有史以來(lái)最大的版本。”
按照 Linux 典型的時(shí)間表,5.10-rc1 之后將有幾個(gè)星期時(shí)間來(lái)提交修復(fù)問(wèn)題的補(bǔ)丁,在預(yù)計(jì) 12 月發(fā)布穩(wěn)定內(nèi)核之前,將發(fā)布幾個(gè)候選版本。