Tvrtka Qualys otkrila je treću opasnu ranjivost (CVE-2022-3328) u alatki snap-confine, koja se isporučuje s SUID root oznakom i poziva proces snapd za stvaranje izvršnog okruženja za aplikacije distribuirane u samostalnim paketima u snap formatu. Ova ranjivost omogućuje lokalnom nepovlaštenom korisniku da izvrši kod s root pravima u zadanoj konfiguraciji Ubuntu-a. Problem je ispravljen u izdanju snapd 2.57.6. Ažuriranja paketa objavljena su za sve podržane grane Ubuntu-a.
Zanimljivo je da je spomenuta ranjivost nastala tijekom ispravljanja slične ranjivosti iz veljače u snap-confine. Istraživačima je uspjelo pripremiti radni exploit koji omogućuje root pristup na Ubuntu Server 22.04, gdje su osim ranjivosti u snap-confine uključene i dvije ranjivosti u procesu multipathd (CVE-2022-41974, CVE-2022-41973) vezane uz zaobilaženje provjere ovlaštenja prilikom prenošenja privilegiranih naredbi i nesigurnog rada s simboličkim vezama.
Ranjivost u snap-confine uzrokovana je stanjem utrke u funkciji must_mkdir_and_open_with_perms(), koja je dodana kao zaštita od supstitucije direktorija /tmp/snap.$SNAP_NAME s simboličkom vezom nakon provjere vlasnika, ali prije poziva na sustavni poziv mount za bind-montiranje direktorija za snap paket. Dodana zaštita svodila se na preimenovanje direktorija /tmp/snap.$SNAP_NAME u drugi direktorij u /tmp s nasumičnim imenom, ako on postoji i ne pripada korisniku root.
Prilikom iskorištavanja operacije preimenovanja direktorija /tmp/snap.$SNAP_NAME, istraživači su iskoristili činjenicu da snap-confine također stvara direktorij /tmp/snap.rootfs_XXXXXX za korijenski sadržaj snap paketa. Dio 'XXXXXX' u imenu nasumično se odabire pomoću mkdtemp(), ali paket s imenom 'rootfs_XXXXXX' može proći provjeru u funkciji sc_instance_name_validate (tj. ideja je da ime $SNAP_NAME preuzme vrijednost 'rootfs_XXXXXX', a operacija preimenovanja će nadjačati direktorij /tmp/snap.rootfs_XXXXXX s korijenom snap).
Kako bi se omogućila istovremena upotreba /tmp/snap.rootfs_XXXXXX i preimenovanje /tmp/snap.$SNAP_NAME, pokrenuta su dva primjerka snap-confine. Kada je prvi primjerak stvorio /tmp/snap.rootfs_XXXXXX, proces se blokirao, a drugi primjerak s imenom paketa rootfs_XXXXXX se pokrenuo, što je dovelo do toga da je privremeni direktorij /tmp/snap.$SNAP_NAME drugog primjerka postao korijenski direktorij /tmp/snap.rootfs_XXXXXX prvog. Odmah nakon izvršenja preimenovanja, drugi primjerak je neočekivano završio, a /tmp/snap.rootfs_XXXXXX je zamijenjen manipulacijom sa stanjem utrke, slično iskorištavanju ranjivosti iz veljače. Nakon zamjene, blokada izvršenja prvog primjerka je uklonjena, a napadači su dobili punu kontrolu nad korijenskim direktorijem snap.
U zadnjem koraku je stvorena simbolička poveznica /tmp/snap.rootfs_XXXXXX/tmp, koja se koristila funkcijom sc_bootstrap_mount_namespace() za bind-montiranje dostupnog za pisanje stvarnog direktorija /tmp u bilo koji direktorij FS, budući da poziv mount() slijedi simboličkim vezama prije montiranja. Takvo montiranje je blokirano ograničenjima AppArmor, ali su za obilaženje ove blokade u exploit uključene dvije pomoćne ranjivosti u multipathd.
Izvor: opennet.ru
