XZ惡意代碼潛伏三年,差點引發核末日?后門投毒黑客身份成謎
整個周末,開源軟件xz被植入后門事件,引發了安全界的軒然大波。
研究人員驚恐地發現,在包括Red Hat和Debian在內的多個廣泛使用的Linux版本中,一款壓縮工具被悄悄植入了惡意代碼!
微軟的安全研究員Andres Freund首次報告了這件事。
他發現,在這款名為xz Utils的工具的5.6.0和5.6.1版本中,都含有惡意代碼。
而且,這段惡意代碼極其復雜難解。
扒著扒著人們發現,這段代碼是由一位名為Jia Tan的用戶(JiaT75),通過四次代碼變更(也即在GitHub上「提交」)的方式,植入到了Tukaani項目中。
這樣,攻擊者即使沒有有效賬號,也可以直接從SSHD訪問系統了。
(SSHD是一個關鍵的二進制文件,負責SSH連接的工作。)
目前,GitHub已經禁用XZ Utils代碼庫,且還未收到漏洞被利用的報告
好在,這個后門已經及時被發現了。目前GitHub已經以違反服務條款為由,禁用了Tukaani項目維護的XZ Utils代碼庫。
然而可怕的是,如果這個后門的漏洞很巧妙,技術很高超,那么xz被廣泛引入各Linux發行版后,這些Linux系統就會輕易被入侵!
這件事情可能導致的可怕后果,讓安全社區對此掀起了經久不息的討論。
一場災難被避免了
好在證據顯示,這些軟件包只存在于Fedora 41和Fedora Rawhide中,并不影響Red Hat Enterprise Linux (RHEL)、Debian Stable、Amazon Linux以及SUSE Linux Enterprise和Leap等主流Linux版本。
但Red Hat和Debian已經報告稱,最近發布的測試版中的確使用了這些被植入后門的版本,特別是在Fedora Rawhide和Debian的測試、不穩定及實驗版本中。
同樣,Arch Linux的一個穩定版本也受到了影響,不過,該版本也并未應用于實際生產系統中。
另外還有一些讀者報告稱,macOS的HomeBrew包管理器中包含的多個應用,都依賴于被植入后門的5.6.1版本xz Utils。目前,HomeBrew已經將該工具回滾至5.4.6版本。
安全公司Analygence的高級漏洞分析師Will Dormann表示,「這個問題實際上并沒有對現實世界造成影響」。
但這主要是因為惡意行為者疏忽了,導致問題被發現的時機很早。就如同上文所提,如果后門沒被及時發現,后果將是災難性的。
Jia Tan是誰?
既然事情解決了,那么問題的焦點就集中在了——Jia Tan究竟是誰?
這位Jia Tan,是xz Utils項目的兩位主要開發者之一,對該項目貢獻良多。
Freund其報告中指出,「考慮到這幾周內的活動情況,這位提交者要么是直接涉及,要么其系統遭受了嚴重的安全威脅。」
不幸的是,種種跡象表明,后一種可能性似乎并不大。
所以,這次xz被植入后門事件,很可能就是Jia Tan的主觀惡意行為。
上周四,有人冒用了這位開發者的名字,在Ubuntu的開發者社區中請求將含后門的5.6.1版本納入正式發布,理由是它修復了一個導致Valgrind工具出錯的問題。
還有人發現,近幾周這位開發者也向他們提出了類似的請求,希望在Fedora 40的測試版本中使用這個帶有后門的工具版本。
「我們甚至還幫助他解決了Valgrind的問題(而現在看來,這個問題正是由他加入的后門引起的),」Ubuntu的維護人員說。
「他已經在xz項目中工作了兩年,添加了各種各樣的測試文件,鑒于這種復雜的操作,我們對xz的早期版本也持懷疑態度,直到后來,它們被證明是安全的。」
后門技術分析
簡單來說,CVE-2024-3094引入的這個后門,是為了在受害者的OpenSSH服務器(SSHD)中注入惡意代碼,從而讓遠程攻擊者(持有特定私鑰)能夠通過SSH發送任意代碼,并在認證步驟之前執行,進而有效控制受害者的整臺機器。
盡管具體的內容仍在分析當中,但初步分析表明,它的設計相當復雜:
- 后門代碼被注入到OpenSSH服務器(sshd進程),因為liblzma(含有惡意代碼)是某些OpenSSH版本的依賴項。
- 后門劫持了RSA_public_decrypt函數,這個函數原本用于驗證RSA簽名。
- 惡意代碼會檢查RSA結構中傳入的公共模數(「N」值),這個模數完全受到攻擊者控制。
- 惡意代碼使用硬編碼的密鑰(采用ChaCha20對稱加密算法)對「N」值進行解密。
- 解密后的數據通過Ed448橢圓曲線簽名算法進行有效性驗證。由于這是一種非對稱簽名算法,后門只包含了公鑰,這意味著只有攻擊者能夠為后門生成有效載荷。此外,這個簽名與主機的公鑰綁定,因此一個主機上的有效簽名不能在其他主機上使用。
- 如果數據有效,該有效載荷將以shell命令的形式被執行。
- 如果數據無效(有效載荷格式不正確或簽名無效),則會透明地恢復到RSA_public_decrypt的原始實現。這意味著,除了攻擊者之外,是無法通過網絡發現易受攻擊的機器的。
「臥薪嘗膽」三年
這次最令人印象深刻的,是攻擊者超乎尋常的耐心和決心。
攻擊者花費了兩年多的時間,通過參與各種開源軟件項目并提交代碼,逐步建立起作為一個可信任維護者的形象,以此來避免被發現。
2021年,一個名為Jia Tan(GitHub用戶名:JiaT75)的用戶創建了GitHub賬戶,并開始為多個項目做出貢獻。
在那一年,Jia Tan共提交了546次代碼,其中對libarchive項目的一次提交尤其引起了人們的關注。
2022年2月6日,Jia Tan在XZ項目中做出了他的第一次正式提交,這次提交增加了對LZMA和LZMA2編碼器的參數驗證功能。
2023年6月27日至28日,Jia Tan對XZ Utils項目進行了一系列關鍵的更改,從而為后續的攻擊做好了準備。
特別是,項目中的一個文件crc64_fast.c,新增了對一種名為ifunc的技術的支持。
根據安全研究員Andres Freund的分析,引入的這種ifunc技術可能是潛在后門功能的一部分,顯示了攻擊者可能利用的一種手段。
此外,值得注意的是,這個重要更新是由項目的原始維護人Lasse Collin引入的,并且他特別提到了另一位貢獻者Hans Jansen對這一更新的貢獻。
2023年7月8日,JiaT75在oss-fuzz項目中提交了一個請求,該項目負責對XZ等多個開源軟件項目進行自動錯誤檢測。這個請求實際上關閉了一種特定的錯誤檢測方式,從而防止oss-fuzz發現XZ項目中潛藏的惡意代碼。
2024年2月15日,JiaT75通過修改XZ項目的配置文件,加入了一個規則來忽略特定的腳本文件build-to-host.m4。
很快,這個腳本就被包含在了項目的正式發布版本中——它會在構建過程中執行,并植入一段負責在受害者電腦上安裝后門的惡意代碼。
2024年2月23日,JiaT75在XZ項目的測試文件夾中加入了兩個含有隱藏后門的測試文件。
2024年2月24日,JiaT75發布了包含惡意腳本文件的新版本5.6.0,也就是說任何使用了這個版本及以后版本的XZ都存在安全風險。
2024年2月27日,這個帶有安全隱患的版本被Fedora采納。
2024年3月9日,JiaT75更新了后門程序,發布了版本5.6.1,Fedora同樣更新了這個版本。
2024年3月29日,安全研究員Andres Freund在oss-security郵件列表上公布了他對XZ項目中發現的惡意行為的詳細分析。
還有更多受害者
雖然惡意代碼僅在XZ項目中被檢測到,但攻擊者賬戶的其他代碼貢獻目前也在調查中。
截至今日,一些項目已經被發現添加了可疑代碼:
libarchive
2021年,JiaT75向libarchive代碼庫提交了一個名為「在使用bsdtar解壓時添加錯誤提示文本」的合并請求,乍看之下似乎沒什么問題。
但仔細一看,這個合并請求中的代碼把原本安全的函數safe_fprintf()換成了更危險的fprintf()函數,這一改動可能會導致字符逃逸的安全漏洞。
oss-fuzz
2023年初,JiaT75把XZ項目在Google的oss-fuzz工具上注冊的主郵箱改為了他個人的Gmail郵箱。
這一行為似乎暗示,他們想要第一時間接收到XZ項目中發現的漏洞報告,以此來及時知曉自己的惡意操作被揭露的情況。
2023年末,他們提交了一個新的合并請求(Pull Request),目的是在XZ項目的fuzzer配置中禁用「間接函數支持(Indirect function support)」。
這一操作似乎可以防止被fuzzer探測到,從而為在XZ項目中植入的后門做好鋪墊。