Společnost Qualys objevila třetí nebezpečnou zranitelnost tohoto roku (CVE-2022-3328) v utilitě snap-confine, dodávané s příznakem SUID root a vyvolávané procesem snapd pro vytvoření spouštěcího prostředí pro aplikace distribuované v samostatných balíčcích ve formátu snap. Tato zranitelnost umožňuje místnímu uživateli bez oprávnění vykonávat kód s právy root ve výchozí konfiguraci Ubuntu. Problém byl opraven v vydání snapd 2.57.6. Aktualizace balíčků byly vydány pro všechny podporované větve Ubuntu.
Zajímavé je, že zranitelnost byla zavedena během opravy podobné zranitelnosti z února v snap-confine. Výzkumníkům se podařilo připravit funkční exploit, který poskytuje root přístup v Ubuntu Server 22.04, kde kromě zranitelnosti v snap-confine jsou také zahrnuty dvě zranitelnosti v procesu multipathd (CVE-2022-41974, CVE-2022-41973), související s obcházením ověření oprávnění při přenášení privilegovaných příkazů a nebezpečnou manipulací se symbolickými odkazy.
Zranitelnost v snap-confine je způsobena závodem v podmínkách ve funkci must_mkdir_and_open_with_perms(), která byla přidána pro ochranu proti nahrazení adresáře /tmp/snap.$SNAP_NAME symbolickým odkazem v okamžiku po ověření vlastníka, ale před zavoláním systémového volání mount pro bind-montování do něj adresářů balíčku ve formátu snap. Přidaná ochrana spočívala v přejmenování adresáře /tmp/snap.$SNAP_NAME na jiný adresář v /tmp s náhodným jménem, pokud existuje a nepatří uživateli root.
Při exploitaci operace přejmenování adresáře /tmp/snap.$SNAP_NAME výzkumníci využili toho, že snap-confine také vytváří adresář /tmp/snap.rootfs_XXXXXX pro kořen obsahu snap balíčku. Část „XXXXXX“ v názvu je vybírána náhodně pomocí mkdtemp(), ale balíček s názvem „rootfs_XXXXXX“ může projít ověřením ve funkci sc_instance_name_validate (tj. myšlenka je, že název $SNAP_NAME nabude hodnoty „rootfs_XXXXXX“ a poté bude operace přejmenování vést k přepsání adresáře /tmp/snap.rootfs_XXXXXX s kořenem snap).
Aby bylo možné současně používat /tmp/snap.rootfs_XXXXXX a přejmenovat /tmp/snap.$SNAP_NAME, byly spuštěny dvě instance snap-confine. Jakmile první instance vytvořila /tmp/snap.rootfs_XXXXXX, proces se zablokoval a spuštěna byla druhá instance s názvem balíčku rootfs_XXXXXX, což vedlo k tomu, že dočasný adresář /tmp/snap.$SNAP_NAME druhé instance se stal kořenovým adresářem /tmp/snap.rootfs_XXXXXX první. Ihned po provedení přejmenování druhá instance nečekaně skončila a /tmp/snap.rootfs_XXXXXX byl nahrazen manipulací se závodním stavem, jako při zneužití únorové zranitelnosti. Po nahrazení byla z první instance odstraněna blokace vykonávání a útočníci získali plnou kontrolu nad kořenovým adresářem snap.
V poslední fázi byla vytvořena symbolická linka /tmp/snap.rootfs_XXXXXX/tmp, která byla použita funkcí sc_bootstrap_mount_namespace() pro bind-montování zapisovatelného skutečného adresáře /tmp do jakéhokoli adresáře FS, protože volání mount() následuje symbolickým odkazům před montováním. Takové montování je blokováno omezeními AppArmor, ale pro obcházení tohoto zablokování byly v exploitu využity dvě pomocné zranitelnosti v multipathd.
Zdroj: opennet.ru
