我們能從明尼蘇達大學事件吸取什麼教訓?
4 月 20 日,全世界都知道了明尼蘇達大學(UMN)進行的一項研究計劃,該計劃涉及提交有意的錯誤補丁以納入 Linux 內核。從那時起,由這項工作產生的一篇論文被撤回了,各種信件來來回回,來自 UMN 的許多補丁被審計。顯然,現在是時候對情況進行更新了。
LCTT 譯註:明尼蘇達大學「偽君子提交」這件事引發了開源和技術社區的很多爭議,我們也一直關注此事,本文是 LWN 編輯對事件後繼發展的總結和觀點。
關於這項研究的論文的撰寫並不是最近事件的直接原因;相反,它是由 UMN 的另一位開發者發布的一個源於實驗性靜態分析工具的錯誤補丁引起的。這導致內核社區的開發者懷疑,提交故意惡意補丁的工作仍在進行。情況顯然不是這樣的,但當整個故事變得清晰時,討論已經全面進行了。
LCTT 譯註:提交「實驗性靜態分析工具的錯誤補丁」的開發者也是 UMN 「偽君子提交」研究團隊的成員,只是按該團隊的說法,「偽君子提交」研究已經結束,最近引發爭議的補丁來自另外一個項目。
老話仍然適用:不應該把那些可以充分解釋為無能的東西歸結為惡意。
4 月 22 日,Linux 基金會技術顧問委員會(TAB,寫作本文的 LWN 編輯是該委員會的成員)發表了一份簡短的聲明,指出,除其他事項外,最近的補丁似乎是真誠地提交的。同時,Linux 基金會和 TAB 給 UMN 的研究人員發了一封信,概述了應該如何處理這種情況;該信沒有公開發布,但 ZDNet 顯然從某個地方得到了一份副本。除其他事項外,信中要求完全公開作為 UMN 項目的一部分而發送的錯誤補丁,並要求撤回這項工作所產生的論文。
作為回應,UMN 的研究人員發布了一封公開信,向社區道歉,幾天後又發布了他們作為「偽君子提交」項目的一部分所做工作的總結。總共有五個補丁是從兩個 sock-puppet 賬戶提交的,但其中一個是普通的 bug 修復,被錯誤地從這個錯誤的賬戶發送。在剩下的四個補丁中,其中一個是試圖插入一個 bug,但是它本身沒插入成功,所以這個補丁實際上是有效的;另外三個(1、2、3)包含真正的 bug,這三個都沒有被維護者接受,儘管拒絕的原因不一定是有關的 bug。
LCTT 譯註:根據 UMN 團隊發布的總結:
- 第一個補丁是以「偽君子提交」而發出的,但是後來實際檢查發現實際解決了問題,於是 UMN 團隊就沒有阻止該補丁被合入。
- 第二個補丁沒有合入,但是內核維護者說之前有個別人的類似實現的補丁合併過,後來發現有問題而被別人撤銷了。
- 第三個補丁沒有合入,內核維護者發現了一個問題而沒有接受,但是其實該補丁還有另外一個問題並沒有被發現。
- 第四個補丁沒有合入,和上一個類似,內核維護者沒有發現有意放入的缺陷,而是找到另外的編碼問題,因此沒有合入。
- 第五個補丁是有效的補丁,但不是這個項目的,使用了錯誤的郵箱發出的。
論文本身已被撤回,不會按原計劃在 5 月提交。希望大家可以認為 UMN 在短期內不會再進行類似的研究了。
LCTT 譯註:在原文下面有不少評論認為這個研究方嚮應該繼續下去,只是方式方法需要改善。
補丁的重新審查
UMN 活動引起的關注的一個直接結果是,人們對其開發者失去了信任,加上某些方面希望採取某種懲罰性行動。因此,當整個事件爆發時,首先發生的事情之一是 Greg Kroah-Hartman(GKH)發布了一個由 190 個部分組成的補丁系列,以撤銷他能找到的儘可能多的 UMN 的補丁。事實上,這並不是所有的補丁;他提到了另外 68 個需要人工審查的補丁清單,因為它們不容易撤銷。
碰巧的是,這些「容易撤銷」的補丁也需要人工審查;一旦最初的憤怒過去,就沒有什麼願望去恢復那些實際上沒有錯誤的補丁。在過去的一周里,這種審查過程一直在進行,一些開發人員在為之努力。大多數可疑的補丁被證明是可以接受的(即使不是很好),已經從撤銷列表中刪除了;如果本文作者的計數是正確的,仍有 42 個補丁將被從內核中撤出。
對於這 42 個補丁,撤銷背後的原因各不相同。在某些情況下,這些補丁適用於舊的、可能是未使用的驅動程序,而且沒有人願意去適當地審查它們。在其他情況下,其希望實現的變更做得很差,將以更好的方式重新實現。而有些補丁包含了嚴重的錯誤;這些肯定需要被恢復(而且一開始就不應該被接受)。
不過,看一下全套的 UMN 補丁,印證了一些我們的早期印象。首先,幾乎所有的補丁都解決了某種真正的(即使是晦澀難懂的且難以解決)問題;為之寫一個補丁是有理由的。雖然這些補丁中有許多顯示出對代碼的理解程度很低,因此包含了錯誤,但似乎其中任何一個修復程序的意圖都不大可能是惡意的。
也就是說,「惡意」有多種定義。對一些相關的開發者來說,發布未經驗證的實驗性靜態分析工具的補丁而不披露其性質是一種惡意行為。這是另一種涉及未經同意的人類的實驗形式。至少,這是對內核開發社區有效工作所需的信任的一種侵犯。
LCTT 譯註:如果研究涉及到人類,為了避免人類受到傷害,需要取得人類同意,這就是研究需要得到 IRB 許可的原因。UMN 認為 「偽君子提交」 不是針對人類的研究,給予了 IRB 免除許可。在這個事件中,有人對 UMN IRB 的意見也很大,而且懷疑 IRB 是否有能力對計算機相關研究給出有效判斷。
這 190 個補丁中有 42 個壞補丁,壞補丁比率是 22%。很有可能,對幾乎任何一個內核開發者的 190 個補丁進行詳細審查,都會發現一些回想起來並不是一個好主意的補丁。但願這個比率不會接近 22%。但必須說的是,所有這些補丁都被整個內核的子系統維護者所接受,這不是一個好的結果。也許這比最初的「偽君子提交」的研究人員所尋找的結果更有意思。他們故意插入 bug 的努力失敗了,但卻在無意中增加幾十個 bug。
同時,還有一份不能幹凈地撤銷的補丁清單。這個名單還沒有公布,但 GKH 是從其中的七個子集開始的。他還指出,TAB 將在所有這些補丁的審計工作完成後公布一份完整的報告。到目前為止,這些補丁中還沒有任何一個在主線上被撤銷;這似乎有可能在 5.13 合併窗口結束時發生。
吸取的教訓
從這一系列事件中得到的關鍵教訓之一顯然是:不要把自由軟體開發社區作為你的實驗性工具的一種免費驗證服務。內核開發者很高興看到新工具的產生,並且 —— 如果這些工具能帶來好的結果 —— 就使用它們。他們也會幫助測試這些工具,但他們不太樂意成為缺乏適當審查和解釋的工具產生的補丁的接受者。
另一個教訓是我們已經知道的:內核維護者(以及許多其他自由軟體項目的維護者)工作壓力過度,沒有時間正確地審查經過他們手中的每一個補丁。因此,他們不得不依賴向他們提交補丁的開發者的可信度。可以說,當這種信任得到妥善建立時,內核開發過程是勉強可持續的;如果通常無法信任進入的補丁時,那麼它將無法維持下去。
推論 —— 也是我們已經知道的 —— 是進入內核的代碼往往不像我們所想的那樣得到很好的審查。我們希望相信每一行被合併的代碼都經過了高質量的內核開發人員的仔細審查。有些代碼確實得到了這種審查,但不是所有的代碼。例如,考慮一下 5.12 開發周期(一個相對較小的周期),它在十周的時間裡向內核添加了超過 50 萬行的代碼。仔細審查 50 萬行代碼所需的資源將是巨大的,因此,不幸的是,其中許多行在被合併之前只得到了粗略的審查而已。
最後一個教訓是,人們可能傾向於認為內核正面臨著被具有比 UMN 研究人員所展示的更多技能和資源的行為者插入惡意補丁的可怕風險。這可能是事實,但事情的簡單真相是,正規的內核開發者繼續以這樣的速度插入錯誤,惡意行為者應該沒有什麼必要增加更多。2 月份發布的 5.11 內核,到 5.11.17 為止,在穩定更新中已經積累了 2281 個修復。如果我們做一個(過於簡單的)假設,即每個修復都會修正一個原始的 5.11 補丁,那麼進入 5.11 的補丁中有 16%(到目前為止)被證明是有錯誤的。這並不比 UMN 補丁的比率好多少。
所以,這也許是我們從整個經歷中得到的真正教訓:內核處理流程的速度是它最好的屬性之一,我們都依賴它來儘可能快地獲得功能。但是這種速度可能與嚴肅的補丁審查和低數量的錯誤不相容。在一段時間內,我們可能會看到處理變得有點慢,因為維護者覺得有必要更仔細地審查變化,特別是那些來自新的開發人員。但是,如果我們不能將更謹慎的處理流程制度化,我們將繼續看到大量的 bug,而這些 bug 是否是故意插入的,其實並不重要。
via: https://lwn.net/SubscriberLink/854645/334317047842b6c3/
作者:Jonathan Corbet 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive