UMN事件新進展:190個中發現42個“壞補丁” 仍有大量補丁需審核
4 月20 日,全世界都知道了明尼蘇達大學(UMN)進行的一項研究計劃,該計劃就是故意提交包含錯誤的補丁納入到Linux 內核中,甚至還根據該計劃提交了一份研究論文。目前論文已經被撤回,UMN 也公開發文致歉,UMN 提交的很多補丁都已經被重新審核。
DJRPhoto36 / Flickr
這篇研究論文並不是最近事件的直接原因,而是UMN 的另一位開發者發布的一個源於實驗性靜態分析工具的錯誤補丁引起的。這個錯誤補丁引起了內核社區開發者的懷疑,隨後整個事情被迅速點燃。
4 月22 日,Linux 基金會技術顧問委員會(TAB)發布了一份簡短的聲明,指出除了UMN 等個別事項,最近的補丁似乎是真誠地提交的。同時,Linux 基金會和技術諮詢委員會給UMN 的研究人員發了一封信,概述了應該如何處理這種情況。
該信沒有公開發布,但ZDNet 顯然從某個地方得到了一份副本。除其他事項外,信中要求完全公開作為UMN項目的一部分而發送的錯誤補丁,並要求撤回這項工作所產生的論文。
4 月24 日作為回應,UMN 的研究人員發布了一封公開信,向社區道歉。幾天之後,他們以PDF 文件匯總了他們在“hypocrite commits”項目中的工作。總共有5 個補丁是從2 個sock-puppet 賬戶提交的,其中1 個補丁是普通BUG 修復,只是錯誤地從錯誤帳號發送的。而剩下4 個補丁中,其中1 個試圖插入BUG,而另外3 個本身就存在BUG。這三個都沒有被維護者接受,儘管拒絕的原因不一定是有關的BUG。
補丁的重新審查
UMN 活動引起的關注的一個直接結果是,人們對其開發者失去了信任,加上某些方面希望採取某種懲罰性行動。因此,當整個事件爆發時,首先發生的事情之一是Greg Kroah-Hartman 發布了一個190 補丁系列,以恢復他能找到的UMN 的許多補丁。事實上,這並不是所有的補丁;他提到了另外68 個需要人工審查的補丁清單,因為它們不容易恢復。
碰巧的是,這些“容易恢復”的補丁也需要人工審查;一旦最初的憤怒情緒過去,就沒有什麼動力和願望去恢復那些實際上沒有錯誤的補丁。在過去的一周裡,這種審查過程一直在進行,涉及到一些開發人員的努力。大多數可疑的補丁被證明是可以接受的,即使不是很好,也已經從恢復列表中刪除了;42 個補丁仍將被從內核中撤出。
對於這42 個補丁,還原背後的原因各不相同。在某些情況下,這些補丁適用於舊的、可能是未使用的驅動程序,而且沒有人願意去適當地審查它們。在其他情況下,預期的變化做得很差,將以更好的方式重新實現。還有一些補丁包含了嚴重的錯誤;這些肯定需要被恢復(而且一開始就不應該被接受)。
但你如果觀察下UMN 提交的補丁,你就會發現一些共同點。首先幾乎所有的補丁都解決了某種真正的(即使是晦澀難懂的)問題;寫補丁是有理由的。雖然這些補丁中有許多顯示出對代碼的理解程度很低,因此包含了錯誤,但似乎不太可能有任何一個是惡意的。
這就是說,”惡意”有多種定義。對一些相關的開發者來說,發布未經驗證的實驗性靜態分析工具的補丁而不披露其性質是一種惡意行為。這是另一種形式的實驗,涉及未經同意的人類。至少,這是對內核開發社區有效工作所需的信任的一種侵犯。
在190 個補丁發現42 個“壞補丁”,意味著壞補丁率為22%。同時,還有一份沒有恢復乾淨的補丁清單。這個名單還沒有公開發布,但Kroah-Hartman確實從其中的七個子集開始。他還指出,TAB將在所有這些補丁的審計完成後公佈一份完整的報告。
吸取的教訓
從這一系列事件中得到的關鍵教訓之一顯然是:不要把自由軟件開發社區作為你的實驗性工具的一種免費驗證服務。內核開發者很高興看到新工具的產生,並且–如果這些工具能帶來好的結果–就使用它們。他們也會幫助測試這些工具,但他們不太樂意成為缺乏適當審查和解釋的工具啟發的補丁的接受者。
另一個教訓是我們已經知道的:內核維護者(以及許多其他自由軟件項目的維護者)工作過度,沒有時間正確審查經過他們手中的每一個補丁。因此,他們不得不依賴向他們提交補丁的開發者的可信度。可以說,當這種信任被很好地安置時,內核開發過程是勉強可持續的;如果進入的補丁一般來說不能被信任,那麼它將無法維持下去。
推論是進入內核的代碼往往不像我們所想的那樣得到很好的審查。讓人欣慰的是,相信每一行被合併的代碼都經過了高質量的內核開發人員的仔細審查。有些代碼確實得到了這種審查,但不是所有的代碼。例如,考慮一下5.12 開發週期(一個相對較小的周期),它在十週的時間裡向內核添加了超過 50 萬行的代碼。仔細審查50 萬行代碼所需的資源將是巨大的,因此,不幸的是,其中許多行在被合併之前只得到了粗略的審查而已。
最後一個教訓是,人們可能會認為內核正面臨著被比UMN的研究人員擁有更多技能和資源的人插入惡意補丁的可怕風險。這可能是事實,但事情的簡單真相是,正規的內核開發者繼續以這樣的速度插入錯誤,惡意行為者應該沒有什麼必要增加更多。
2月份發布的5.11內核,到5.11.17為止,在穩定更新中已經積累了2281個修復。如果我們做一個(過於簡單的)假設,即每個修復都會修正一個原始的5.11補丁,那麼進入5.11的補丁中有16%(到目前為止)被證明是有錯誤的。這並不比UMN補丁的比率好多少。