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