上周五,Linux 之父 Linus Torvalds 在內核郵件列表上用很犀利的言辭抨擊了 Google Pixel 安全團隊的開發(fā)者 Kees Cook,引起了大家廣泛地討論。
事情的起因在于 Google Pixel 安全團隊的開發(fā)者 Kees Cook 向 Linus 遞交了加固 usercopy 的 pull request,但是 Linus Torvalds 認為這種請求是極其愚蠢的,因為他認為此類的加固觸及到了 Linux 的核心,會導致內核出現(xiàn)混亂。而且他認為安全人員的很多行為都是讓人難以接受的,解決安全問題的核心在于調試和修復 bug,而不是應該像安全人員那樣靠殺死機器或終止運行來解決問題。
對此,Rober Graham 對 Linus torvalds 的言論表示贊同,他認為我們應該關注郵件的中心思想而不是激烈的言辭,他表示 Linus Torvalds 在郵件中要表達的意思有兩點:
對內核進行大的改動應該在小的迭代步驟中進行,而且每一次都應該徹底調試;
次要的安全問題不是重大的緊急情況,他們不允許繞過的規(guī)則比 bug 或功能多。
去年曾經有一些安全固化的代碼被添加到內核中,以防止一類緩沖區(qū)溢出 / 越界的問題,此代碼沒有解決任何特定 0day 的漏洞,但它能預防一類未來的潛在漏洞,這個代碼可以說是有 bug 的,但是不能說它是罪惡的,因為所有的代碼都會有 bug。
在 Linus Torvalds 看來,當檢測到溢出 / 越界訪問時,代碼將終止用戶模式進程或內核,那么可以說這個代碼罪惡的。Linus 認為它應只產生警告,讓有問題的代碼繼續(xù)運行。但殺死這些東西將會使得 bug 變得更加糟糕,它會導致內核的災難性故障,如果我們的車上運行著 Linux 的 多個副本,那么這種災難將會危及我們的生命,而警告雖然會把這些 bug 顯示出來,但不會造成災難性的后果。在經過僅僅一年之后,當 bug 得到修復時,代碼的默認行為會被改變并消除錯誤的代碼,從而防止 bug 被利用。
簡而言之,在內核中進行大的改變應該在小而可管理的步驟中進行,固化代碼在 Linux 的 25 年歷史中都沒有出現(xiàn)過,所以在非緊急的情況下,沒必要立即進行,更不用說繞過 Linus 提出的開發(fā)流程了。
再者,大多數(shù)的安全人員不是開發(fā)人員,他們實際上并不知道很多事情是如何運行的,邊界檢查被他們定義為一種用來防止緩沖區(qū)溢出的安全功能,但實際上它是一種調試功能,開發(fā)人員都知道知道這一點,但是安全“專家”往往不知道,而做出這些內核變化的往往是不懂這一點的安全人員,他們沒有意識到內核的變化會在現(xiàn)有的代碼產生大量的 bug,而且殺死錯誤代碼也是極其不恰當?shù)男袨椤?/p>
由此可見,雖然 Linus 的語氣有點不友善,但是他的說法是合理的,他是一個講道理的人,他并沒有試圖阻止對內核的改變,也并沒有阻止在安全上的提升,他只是想告訴人們,對內核進行大的改動需要用傳統(tǒng)的方式,而不是采取一刀切的方法,與功能和 bug 相比,安全的地位并沒有比他們高。