沒有人能說服軟體開發者卡米拉·舍夫奇克"新的就是更好的"——她剛剛修復了Enlightenment E16(一款老牌Linux窗口管理器)中一個存在了20年的缺陷。她告訴我們,她之所以偏愛E16,部分原因正是這款軟體已經是一個真正意義上"完成"的產品。
對於不熟悉E16的讀者來說,它是Enlightenment的長期維護分支DR16,這款Linux窗口管理器於1997年首次進入開源軟體社區,E16版本則於1999年推出,至今仍由舍夫奇克等一批忠實開發者持續維護。她在自己撰寫的缺陷分析文章中提到,自己是少數仍在使用和維護這款老舊窗口管理器的"鐵桿愛好者"之一。
今年21歲的舍夫奇克在她的部落格中解釋說,這個缺陷是她在德國薩爾大學擔任研究生助教期間,趕製課程幻燈片時偶然發現的。
"我有幾份用LaTeX排版的PDF講義和練習題。有一次我在Atril中打開其中一份,整個桌面直接卡死了。"她寫道。這種情況反覆出現,直到她找到了根本原因:每當E16嘗試截斷她正在處理的文件那個過長的名稱時,系統就會掛起。
經過深入排查,舍夫奇克發現E16在實現窗口標題截斷算法時,沒有設置疊代次數上限。缺少這個上限,居中省略號的搜索過程就可能在截斷點之間無限循環,導致桌面在尋找合適標題的過程中徹底凍結。
"任何WM_NAME足夠長、導致居中省略號搜索進入過沖狀態的窗口都會觸發這個問題。"舍夫奇克解釋說。
她針對2024年8月發布的E16 1.0.30版本提交了修復補丁,做出了三項改動以防止問題再次發生:將疊代次數上限設為32次、防止負值修正產生退化重疊,以及防範除以零的錯誤。
如果20年前的代碼中存在這類缺陷,那現代代碼里又潛藏著什麼
如果這個缺陷出現在現代窗口管理器或桌面環境中,可能會成為一種拒絕服務攻擊途徑。雖然它不會破壞數據或鎖定伺服器,但仍然會造成極大的不便。
"毫無疑問,類似的缺陷正潛伏在驅動現代桌面環境和窗口管理器的數百萬行代碼之中。"舍夫奇克在接受採訪時表示。
不過,她對那些現代桌面環境和窗口管理器本就存有幾分偏見。她認為,這些產品所遵循的現代軟體開發理念,從根本上是適得其反的,對用戶而言也更不安全。
"我覺得我們有點偏離初衷了,"她說,"我們遠遠不夠願意承認:軟體在某個時刻是可以達到完成狀態的。"
E16就是個例子:在其數十年的生命周期里確實發布了新版本,但那些更新大多是缺陷修復和少量基礎調整,而非堆砌一大堆不必要的新功能。
"我們一直在交付本不必要交付的不穩定性。"舍夫奇克直言不諱。她建議那些總想追最新版本的用戶或管理員停下來,選擇留在近期版本或長期支持版本上,尤其是對於那些歷來缺陷較多的軟體,比如網頁瀏覽器。
"由能力出眾的開發者維護的老舊軟體,其私有代碼庫中的缺陷數量會單調遞減。"舍夫奇克在部落格中寫道。
這一邏輯同樣適用於擁有更大用戶群體的大型項目的長期支持版本:安於現有功能、持續跟進安全補丁、關注缺陷數量(希望能)持續下降,這樣的策略可能比升級到包含你不需要的新功能、同時引入一堆新缺陷的最新版本要安全得多。
Q&A
Q1:E16窗口管理器的桌面凍結缺陷是什麼原因造成的?
A:E16在實現窗口標題截斷算法時,沒有設置疊代次數上限。當窗口名稱過長時,居中省略號的搜索邏輯會在截斷點之間無限循環,導致桌面完全卡死無法響應。這個缺陷存在了大約20年,直到開發者舍夫奇克在日常使用中偶然觸發並追查到根本原因。
Q2:舍夫奇克是如何修復E16桌面凍結缺陷的?
A:她針對E16 1.0.30版本提交了一個補丁,主要做了三項修改:將疊代次數上限限制為32次,防止負值修正導致退化重疊,以及防範潛在的除以零錯誤。這三項改動共同堵住了導致無限循環的漏洞,從根本上解決了桌面凍結的問題。
Q3:舍夫奇克對現代軟體開發方式有什麼看法?
A:她認為現代軟體開發過於追求不斷堆疊新功能,反而忽視了穩定性。她建議用戶留在近期版本或長期支持版本上,而不是一味追新,並指出由有能力的開發者長期維護的成熟軟體,其缺陷數量會隨時間持續減少,安全性反而更有保障。






