我認為我們應該停止將 CVE-2024-3094 歸咎於 xz-utils,真正的問題在於 GNU IFUNC 的設計缺陷以及 OpenSSH 連結 SystemD 的決定。IFUNC 是一個過於複雜且危險的工具,它破壞了 RELRO 等安全機制,我們應該將其視為 glibc 的內部介面並避免在其他應用中使用,以防止類似的軟體供應鏈攻擊再次發生。
CVE-2024-3094 是一場險些釀成全球資安災難的 xz-utils 後門事件,若非開發者 Andres Freund 及時發現,全球多數 SSH 伺服器可能已被植入具備 root 權限的後門。本文作者認為,與其檢討惡意代碼如何滲透進原始碼庫,不如正視 GNU IFUNC 機制與 Linux 發行版將 OpenSSH 連結至 SystemD 這兩項設計決策,正是這些技術漏洞為攻擊者提供了完美的溫床。
針對作者將矛頭指向 GNU IFUNC 與 SystemD 的觀點,Hacker News 社群展開了激烈的辯論。部分討論者對作者批評 OpenBSD 開發者的措辭表示強烈不滿,認為 OpenSSH Portable 分支本就是為了相容 Linux 而開發,開發團隊拒絕將 SystemD 作為必要依賴項是基於軟體架構的純粹性與安全性考量。他們指出,這場危機的根源在於 Debian 與 Red Hat 等發行版為了修復自身系統的啟動競爭問題,自行維護了複雜的補丁,這種「自作聰明」的修改才是導致安全漏洞的主因,而非 OpenBSD 團隊不夠利他。
在技術層面上,社群對於 GNU IFUNC 是否為「真兇」持有保留態度。有評論者指出,IFUNC 雖然允許在 main 函數執行前運行任意代碼,但這並非 Linux 系統中唯一的預加載機制。即便沒有 IFUNC,攻擊者仍能透過 LD_PRELOAD 或其他動態連結手段達成目的。更有觀點認為,作者提出的替代方案(如使用函數指針)在安全性上未必更優,因為全局函數指針在進程生命週期中通常是可寫的,而 IFUNC 解析後的跳轉表(GOT)反而可以被設為唯讀。
此外,SystemD 的複雜性再次成為爭論焦點。反對者批評 SystemD 龐大的代碼量與過度耦合的設計,認為這種「廚房水槽」式的架構增加了攻擊面,讓原本應保持簡潔的 SSH 守護進程變得脆弱。然而,支持者則反駁稱 SystemD 經過大規模的壓力測試與維護,在現代雲端運算與容器化環境中已是不可或缺的基礎設施。他們認為將責任歸咎於單一技術工具是「找錯對象」,真正的問題在於軟體供應鏈中對惡意維護者的信任崩潰,這是任何編譯器功能或系統初始化工具都無法單獨解決的人為因素。
最後,有留言者提出更深層的架構反思,將此問題與 PAM(可插拔認證模組)的設計缺陷類比。他們認為,將認證模組以動態庫形式載入到同一個進程空間,本身就是一種缺乏隔離性的設計。相比之下,OpenBSD 的 bsdauth 採用進程級別的模組化設計,對於調試與安全性而言更為友善。整體而言,社群共識傾向於認為這是一場多重因素交織的系統性失敗,而非單一技術特性的過錯。
相關文章
其他收藏 · 0