Společnost Qualys zjistila dvě zranitelnosti (CVE-2021-44731, CVE-2021-44730) v nástroji snap-confine, dodávaném s flagem SUID root a volaném procesem snapd k vytvoření spustitelného prostředí pro aplikace dodávané v soběstačných balíčcích ve formátu snap. Zranitelnosti umožňují místnímu, neoprávněnému uživateli spustit kód s právy root v systému. Problémy byly odstraněny v dnešním aktualizaci balíčků snapd pro Ubuntu 21.10, 20.04 a 18.04.
První zranitelnost (CVE-2021-44730) umožňuje provést útok pomocí manipulace s tvrdými odkazy, ale vyžaduje deaktivaci systémové ochrany tvrdých odkazů (nastavení sysctl fs.protected_hardlinks na 0). Problém je způsoben nesprávnou kontrolou umístění spustitelných souborů pomocných programů snap-update-ns a snap-discard-ns, které jsou spuštěny s právy root. Cesta k těmto souborům byla vypočítána ve funkci sc_open_snapd_tool() na základě vlastní cesty z /proc/self/exe, což umožňuje vytvořit tvrdý odkaz na snap-confine ve svém adresáři a umístit do tohoto adresáře své varianty nástrojů snap-update-ns a snap-discard-ns. Po spuštění přes tvrdý odkaz snap-confine s právy root spustí z aktuálního adresáře soubory snap-update-ns a snap-discard-ns, které poskytl útočník.
Druhá zranitelnost je způsobena stavem závodu a může být využita v konfiguraci Ubuntu Desktop ve výchozím nastavení. Pro úspěšné fungování exploit v Ubuntu Server je třeba vybrat při instalaci jeden z balíčků z sekce „Featured Server Snaps“. Stav závodu se projevuje ve funkci setup_private_mount(), která je volána během přípravy prostorů názvů bodů připojení pro balíček snap. Tato funkce vytváří dočasný adresář „/tmp/snap.$SNAP_NAME/tmp“ nebo využívá již existující pro bind-montáž do něj adresářů pro balíček ve formátu snap.
Jelikož je název dočasného adresáře předvídatelný, může útočník nahradit jeho obsah symbolickým odkazem v okamžiku po kontrole vlastníka, ale před voláním systémového volání mount. Například lze vytvořit v adresáři /tmp/snap.lxd symbolický odkaz „/tmp/snap.lxd/tmp“, který ukazuje na libovolný adresář, a volání mount() následně projde symbolem odkazu a přimontuje adresář do prostoru jmen snap. Podobně je možné přimontovat svůj obsah do /var/lib a přes nahrazení /var/lib/snapd/mount/snap.snap-store.user-fstab organizovat montáž svého adresáře /etc v prostoru jmen snap balíčku pro načtení své knihovny s právy root prostřednictvím nahrazení /etc/ld.so.preload.
Upozorňuje se, že vytvoření exploit bylo netriviální úkol, protože nástroj snap-confine je napsán v jazyce Go s využitím bezpečnostních programovacích praktik, má ochranu založenou na profilech AppArmor, provádí filtrování systémových volání na základě mechanismu seccomp a používá pro izolaci prostor jmen pro montáž. Nicméně, výzkumníkům se podařilo připravit funkční exploit pro získání práv root v systému. Kód exploitu bude zveřejněn za několik týdnů, po tom, co uživatelé nainstalují poskytnuté aktualizace.
Zdroj: opennet.ru
