Dobësia rrënjësore në paketën e veglave të menaxhimit të paketave Snap

Qualys ka identifikuar cenueshmërinë e tretë të rrezikshme këtë vit (CVE-2022-3328) në programin snap-confine, i cili vjen me flamurin rrënjë SUID dhe thirret nga procesi snapd për të krijuar një mjedis të ekzekutueshëm për aplikacionet e shpërndara në paketa të pavarura në formatin snap. Dobësia lejon një përdorues lokal të paprivilegjuar të arrijë ekzekutimin e kodit si rrënjë në konfigurimin e paracaktuar të Ubuntu. Problemi është rregulluar në versionin snapd 2.57.6. Përditësimet e paketës janë lëshuar për të gjitha degët e mbështetura të Ubuntu.

Është interesante se cenueshmëria në fjalë u prezantua gjatë procesit të rregullimit të një cenueshmërie të ngjashme të shkurtit në kufizimin e parakohshëm. Studiuesit ishin në gjendje të përgatisnin një shfrytëzim pune që siguron qasje rrënjësore në Ubuntu Server 22.04, i cili, përveç cenueshmërisë në snap-confine, përfshin gjithashtu dy dobësi në procesin me shumë rrugë (CVE-2022-41974, CVE-2022-41973) , që lidhet me anashkalimin e kontrollit të autoritetit gjatë transmetimit të komandave të privilegjuara dhe punës së pasigurt me lidhje simbolike.

Dobësia në snap-confine shkaktohet nga një kusht race në funksionin must_mkdir_and_open_with_perms(), i shtuar për të mbrojtur kundër zëvendësimit të drejtorisë /tmp/snap.$SNAP_NAME me një lidhje simbolike pasi të keni kontrolluar pronarin, por përpara se të telefononi sistemin e montimit thirrje për të lidhur-montuar direktoritë në të për një paketë në formatin snap. Mbrojtja e shtuar ishte riemërtimi i drejtorisë /tmp/snap.$SNAP_NAME në një drejtori tjetër në /tmp me një emër të rastësishëm nëse ekziston dhe nuk është në pronësi të rrënjës.

Kur shfrytëzonin operacionin e riemërtimit të drejtorisë /tmp/snap.$SNAP_NAME, studiuesit përfituan nga fakti që snap-confine krijon gjithashtu një drejtori /tmp/snap.rootfs_XXXXXX për rrënjën e përmbajtjes së paketës snap. Pjesa "XXXXXX" e emrit zgjidhet rastësisht nga mkdtemp(), por një paketë e quajtur "rootfs_XXXXXX" mund të vërtetohet në funksionin sc_instance_name_validate (d.m.th. ideja është që $SNAP_NAME do të vendoset në "rootfs_XXXXXX" dhe më pas operacioni i riemërtimit do të rezultojë në mbishkrimin e dosjes /tmp/snap.rootfs_XXXXXX me rrënjën snap).

Për të arritur përdorimin e njëkohshëm të /tmp/snap.rootfs_XXXXXX dhe riemërimin /tmp/snap.$SNAP_NAME, u lansuan dy raste të snap-confine. Pasi instanca e parë të krijohej /tmp/snap.rootfs_XXXXXX, procesi do të bllokohej dhe një instancë e dytë do të fillonte me emrin e paketës rootfs_XXXXXX, duke bërë që drejtoria e përkohshme e instancës së dytë /tmp/snap.$SNAP_NAME të bëhet direktoria rrënjësore /tmp/snap .rootfs_XXXXXX e të parës. Menjëherë pas përfundimit të riemërtimit, instanca e dytë u rrëzua dhe /tmp/snap.rootfs_XXXXXX u zëvendësua me manipulimin e kushteve të garës, si kur shfrytëzohej cenueshmëria e shkurtit. Pas zëvendësimit, bllokimi i ekzekutimit u hoq nga shkalla e parë dhe sulmuesit fituan kontrollin e plotë mbi direktorinë rrënjësore të parakohshme.

Hapi i fundit ishte krijimi i një lidhjeje simbolike /tmp/snap.rootfs_XXXXXX/tmp, e cila u përdor nga funksioni sc_bootstrap_mount_namespace() për të lidhur-montuar direktorinë reale të shkrueshme /tmp në çdo direktori në sistemin e skedarëve, që nga thirrja e mount() ndjek simbolet përpara montimit. Një montim i tillë bllokohet nga kufizimet e AppArmor, por për të anashkaluar këtë bllok, shfrytëzimi përdori dy dobësi ndihmëse në multipathd.

Burimi: opennet.ru

Shto një koment