Spoločnosť Qualys odhalila tretiu nebezpečnú zraniteľnosť (CVE-2022-3328) v utilite snap-confine, ktorá je dodávaná s flagom SUID root a je volaná procesom snapd na vytvorenie spustiteľného prostredia pre aplikácie distribuované v samostatných balíkoch vo formáte snap. Zraniteľnosť umožňuje lokálnemu neoprávnenému používateľovi získať vykonanie kódu s oprávneniami root v predvolenej konfigurácii Ubuntu. Problém bol odstránený vo verzii snapd 2.57.6. Aktualizácie balíkov boli vydané pre všetky podporované vetvy Ubuntu.
Zaujímavé je, že zvažovaná zraniteľnosť bola zavedená počas opravy podobnej zraniteľnosti vo februári v snap-confine. Výskumníkom sa podarilo pripraviť funkčný exploit, ktorý poskytuje root prístup v Ubuntu Server 22.04, kde sa okrem zraniteľnosti v snap-confine podieľajú aj dve zraniteľnosti v procese multipathd (CVE-2022-41974, CVE-2022-41973), ktoré súvisia s obchádzaním overovania oprávnení pri prenose privilegovaných príkazov a nebezpečnou manipuláciou so symbolickými odkazmi.
Zraniteľnosť v snap-confine je spôsobená stavom pretekania vo funkcii must_mkdir_and_open_with_perms(), ktorá bola pridaná na ochranu pred zamenením adresára /tmp/snap.$SNAP_NAME za symbolický odkaz po overení vlastníka, ale pred volaním systémového volania mount na bind-montovanie do neho adresárov pre balík vo formáte snap. Pridaná ochrana spočívala v premenovaní adresára /tmp/snap.$SNAP_NAME na iný adresár v /tmp so náhodným menom, ak existuje a nepatrí používateľovi root.
Pri exploitácii operácie premenovania adresára /tmp/snap.$SNAP_NAME výskumníci využili to, že snap-confine vytvára aj adresár /tmp/snap.rootfs_XXXXXX pre koreň obsahu balíka snap. Časť „XXXXXX“ v názve sa vyberá náhodne pomocou mkdtemp(), ale balík s názvom „rootfs_XXXXXX“ môže prejsť kontrolou vo funkcii sc_instance_name_validate (t.j. cieľom je, aby názov $SNAP_NAME nadobudol hodnotu „rootfs_XXXXXX“ a potom operácia premenovania povedie k prepísaniu adresára /tmp/snap.rootfs_XXXXXX s koreňom snap).
Aby sa dosiahlo súčasné používanie /tmp/snap.rootfs_XXXXXX a premenovanie /tmp/snap.$SNAP_NAME, boli spustené dva inštancie snap-confine. Keď prvá inštancia vytvorila /tmp/snap.rootfs_XXXXXX, proces sa zablokoval a spustila sa druhá inštancia s názvom balíka rootfs_XXXXXX, čo spôsobilo, že dočasný adresár /tmp/snap.$SNAP_NAME druhej inštancie sa stal koreňovým adresárom /tmp/snap.rootfs_XXXXXX prvej. Hneď po vykonaní premenovania sa druhá inštancia havarovala a /tmp/snap.rootfs_XXXXXX sa nahradilo manipuláciou so pretečením, ako pri zneužití februárovej zraniteľnosti. Po nahradení prvej inštancie bola zrušená blokácia a útočníci získali plnú kontrolu nad koreňovým adresárom snap.
Na poslednom kroku sa vytvoril symbolický odkaz /tmp/snap.rootfs_XXXXXX/tmp, ktorý bol použitý funkciou sc_bootstrap_mount_namespace() na bind-montovanie zapisovateľného reálneho adresára /tmp do akéhokoľvek adresára FS, keďže volanie mount() sleduje symbolické odkazy pred montovaním. Takéto montovanie je blokované obmedzeniami AppArmor, ale na obídenie tejto blokácie boli v exploite využité dve pomocné zraniteľnosti v multipathd.
Zdroj: opennet.ru
