漏洞概述
2024年3月29日,開發人員Andres Freund在安全郵件列表上報告稱,他在調查SSH性能問題時發現了涉及XZ包中的供應鏈攻擊,分析後發現是SSH使用的上游liblzma庫被植入了後門代碼,可能允許攻擊者通過後門非授權訪問系統。
XZ Utils 是一款用於壓縮和解壓縮.xz 和.lzma 文件的工具集。 XZ Utils 由Lasse Collin 開發,是一個開源項目,廣泛應用於各種操作系統中,受影響開源操作系統可在https://repology.org/project/xz/versions中查詢.xz 文件格式是一種基於LZMA2 壓縮算法的文件格式,它提供了比傳統gzip 更高的壓縮比,同時保持了相對較高的解壓縮速度。 XZ Utils v5.6.0和v5.6.1中tar包的編譯文件被植入惡意命令。在某些特定編譯環境下,惡意命令執行後將替換正常編譯過程中的中間文件為後門文件,最後和其他組件一起編譯到XZ Utils的Liblzma庫文件中。當後門代碼被執行時,將掛鉤(HOOK)SSHD進程中的SSH登錄認證函數。當接收到指定的SSH數據包時,將未授權執行指定的系統命令。
漏洞細節分析1、植入流程目前XZ Utils的Github倉庫(https://github.com/tukaani-project/xz)已無法訪問。筆者分析時使用的版本是從其他鏡像網站下載的xz-5.6.1.tar.gz。初始惡意代碼主要在文件build-to-host.m4中。
這條命令拼接後為:sed 'r\n' ./tests/files/bad-3-corrupt_lzma2.xz | tr '\t \-_' ' \t_\-' | xz -d 2 /dev/null,主要從./tests/files/bad-3-corrupt_lzma2.xz中提取代碼並解壓,最後再執行。
提取出的代碼如下:
這部分代碼執行後,判斷是否為Linux系統,如果不是,則退出。
後面的代碼繼續從./tests/files/good-large_compressed.lzma文件中提取後續代碼,再解壓後執行。
提取的代碼如下:
提取出的代碼較多,主要功能是檢測到環境不適合時就退出,不執行植入後門的邏輯;如果環境合適,則繼續提取./tests/files/下的文件,然後替換編譯的中間過程文件liblzma_la-crc64-fast.o和liblzma_la-crc32_fast.o,最後編譯到XZ Utils的庫文件Liblzma中。
根據以上提取的代碼可知,在如下環境編譯將不會植入後門:
1、不是Linux系統(uname不為Linux)
2、沒有IFUNC.IFUNC是GLIBC中用於覆蓋符號的一個功能
3、不編譯動態庫(sharedobject)
4、不是x86_64,或者targettriple結尾不是linux-gnu
5、編譯器不是GCC,或者鏈接器不是GNUld
6、從測試文件中解壓預編譯的二進製文件
7、修改源碼和構建腳本
此外,指令集擴展檢測函數被替換掉,比原函數多一個參數,作用未知。
2、後門功能被植入後門的Liblzma庫文件被進程加載運行後,將進行一系列環境檢查,檢查通過再執行後門功能,包括:
1、未設置TERM環境變量
2、Argv[0]需要是/usr/sbin/sshd
3、LD_DEBUG、LD_PROFILE未設置
4、需要設置LANG
5、未檢測到調試器
通過以上檢查後,執行後門核心功能,主要功能是掛鉤(HOOK)SSH登錄認證過程中的函數RSA_public_decrypt,未授權執行指定的系統命令。即使用指定SSH證書進行登錄時,從公鑰中提取攻擊負載,然後進一步校驗,最後使用ChaCha20算法解密,將解密後數據作為命令執行。
部分已分析的函數功能如下:
漏洞檢測1、查看本地系統是否安裝了受影響版本的XZ,安全版本為xz5.6.0,xz --version
2、使用Openwall上發布的腳本檢查系統是否被感染後門,後門發現者提供的檢測腳本,判斷SSHD程序依賴的Liblzma庫文件二進制數據中是否包含後門特徵碼,該特徵碼為:
#! /bin/bashset -eu# find path to liblzma used by sshdpath='$(ldd $(which sshd) | grep liblzma | grep -o '/[^ ]*')'# does it even exist?if [ '$path'=='' ]then echo probably not vulnerable exitfi# check for function signatureif hexdump -ve '1/1 '%.2x'' '$path' | grep -q f30f1efa554889f54c89ce5389fb81e7000000804883ec28488954241848894c2410then echo probably vulnerableelse echo probably not vulnerablefi
f30f1efa554889f54c89ce5389fb81e7000000804883ec28488954241848894c2410,對應植入過程中的liblzma_la-crc64-fast.o文件,對應函數為get_cpuid。
解決方案官方暫未更新版本或補丁,建議相關用戶卸載含後門的版本,回退到未包含後門的穩定版本v5.4.6,並及時關注官方新版本更新。
參考鏈接https://www.openwall.com/lists/oss-security/2024/03/29/4
https://access.redhat.com/security/cve/CVE-2024-3094
https://www.openwall.com/lists/oss-security/2024/03/29/4
https://gist.github.com/smx-smx/a6112d54777845d389bd7126d6e9f504
https://avd.aliyun.com/detail?id=AVD-2024-3094
https://github.com/Midar/xz-backdoor-documentation/wikihttps://gist.github.com/keeganryan/a6c22e1045e67c17e88a606dfdf95ae4
https://git.tukaani.org/?p=xz.git;a=summary
文章來源:烽火台實驗室