Компания Qualys откри трета опасна уязвимост за год (CVE-2022-3328) в утилитата snap-confine, доставяна с флага SUID root и извиквана от процеса snapd за създаване на изпълнимо обкръжение за приложения, разпространявани в самообособени пакети във формат snap. Уязвимостта позволява на локален непривилегирован потребител да получи изпълнение на код с права root в конфигурация по подразбиране на Ubuntu. Проблемът е отстранен в версия snapd 2.57.6. Обновления на пакетите са издадени за всички поддържани версии на Ubuntu.
Интересно е, че разглежданата уязвимост е добавена по време на коригирането на подобна уязвимост от февруари в snap-confine. Изследователите успяха да подготвят работещ експлойт, предоставящ root-достъп в Ubuntu Server 22.04, при който освен уязвимостта в snap-confine са включени и две уязвимости в процеса multipathd (CVE-2022-41974, CVE-2022-41973), свързани с заобикаляне на проверката на правомощията при предаване на привилегировани команди и небезопасна работа с символични връзки.
Уязвимостта в snap-confine е причинена от състояние на гонка в функцията must_mkdir_and_open_with_perms(), добавена за защита от подмяна на директорията /tmp/snap.$SNAP_NAME с символична връзка в момента след проверката на собственика, но преди извикването на системно повикване mount за свързване на директории за пакета в формат snap. Добавената защита се състоеше в преименуване на директорията /tmp/snap.$SNAP_NAME в друга директория в /tmp с произволно име, ако съществува и не принадлежи на потребителя root.
При експлоатацията на операцията за преименуване на директорията /tmp/snap.$SNAP_NAME изследователите се възползваха от факта, че snap-confine също създава директория /tmp/snap.rootfs_XXXXXX за корена на съдържанието на пакета snap. Частта «XXXXXX» в името е избрана произволно с помощта на mkdtemp(), но пакет с име «rootfs_XXXXXX» може да премине проверка в функцията sc_instance_name_validate (т.е. идеята е, че името $SNAP_NAME да приеме стойността «rootfs_XXXXXX» и тогава операцията за преименуване ще доведе до презаписване на директорията /tmp/snap.rootfs_XXXXXX с корена на snap).
За да се постигне едновременна употреба на /tmp/snap.rootfs_XXXXXX и преименуване на /tmp/snap.$SNAP_NAME, бяха стартирани два екземпляра на snap-confine. Веднага щом първият екземпляр създаде /tmp/snap.rootfs_XXXXXX, процесът беше блокиран и вторият екземпляр с името на пакета rootfs_XXXXXX беше стартиран, което доведе до това, че временното директория /tmp/snap.$SNAP_NAME на втория екземпляр стана коренова директория /tmp/snap.rootfs_XXXXXX на първия. Веднага след изпълнението на преименуването, вторият екземпляр приключи аварийно, а /tmp/snap.rootfs_XXXXXX беше заменен с манипулация на състоянието на гонка, както при експлоатация на уязвимостта от февруари. След замяната от първия екземпляр се свали блокировката на изпълнението и атакуващите получиха пълен контрол над кореновата директория на snap.
На последния етап беше създадена символична връзка /tmp/snap.rootfs_XXXXXX/tmp, която беше използвана от функцията sc_bootstrap_mount_namespace() за bind-монтиране на записваемата реална директория /tmp в която и да е директория на файловата система, тъй като повикването на mount() следва символичните връзки преди монтиране. Такова монтиране се блокира от ограниченията на AppArmor, но за да бъде заобиколена тази блокировка, в експлоита бяха използвани две допълнителни уязвимости в multipathd.
Източник: opennet.ru
