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