Локални root-уязвимости в инструмента за управление на пакети Snap

Компания Qualys откри две уязвимости (CVE-2021-44731, CVE-2021-44730) в утилитата snap-confine, предоставяна с флаг SUID root и извиквана от процеса snapd за формиране на изпълнително обкръжение за приложения, доставяни в самостоятелни пакети във формат snap. Уязвимостите позволяват на локален непривилегиран потребител да извърши изпълнение на код с права root в системата. Проблемите са отстранени с днешното обновление на пакетите snapd за Ubuntu 21.10, 20.04 и 18.04.

Първата уязвимост (CVE-2021-44730) позволява атака чрез манипулация на жёстки връзки, но изисква да бъде изключена системната защита за жёстки връзки (настройване на sysctl fs.protected_hardlinks на 0). Проблемът е причинен от некоректна проверка на местоположението на изпълнимите файлове на помощните програми snap-update-ns и snap-discard-ns, извиквани с права root. Пътят до тези файлове се изчислява в функцията sc_open_snapd_tool() на базата на собствения път от /proc/self/exe, което позволява създаването на жёстка връзка към snap-confine в собствения каталог и помещаването в този каталог на собствените варианти на утилитите snap-update-ns и snap-discard-ns. След стартиране по жёстката връзка snap-confine с права root ще стартира от текущия каталог файловете snap-update-ns и snap-discard-ns, подменени от атакуващия.

Втората уязвимост е причинена от състояние на гонитба и може да бъде експлоатирана в конфигурацията на Ubuntu Desktop по подразбиране. За успешната работа на експлойта в Ubuntu Server е необходимо при инсталацията да се избере един от пакетите от секцията „Featured Server Snaps“. Състоянието на гонитба се проявява във функцията setup_private_mount(), извиквана по време на подготовката на името на точки за монтиране за пакета snap. Тази функция създава временен каталог "/tmp/snap.$SNAP_NAME/tmp" или използва вече съществуващ за bind-монтиране в него на каталозите за пакета във формат snap.

Тъй като името на временното хранилище е предсказуемо, атакуващият може да подмени съдържанието му с символна връзка по време на проверката на собственика, но преди да направи системния повик mount. Например, може да се създаде в директорията /tmp/snap.lxd символна връзка «/tmp/snap.lxd/tmp», указваща към произволна директория, и повикването на mount() ще последва символната връзка и ще монтира директорията в пространството на името snap. По подобен начин може да се монтира собственото съдържание в /var/lib и чрез замяна на /var/lib/snapd/mount/snap.snap-store.user-fstab да се организира монтирането на собствената директория /etc в пространството на snap пакета, за да се осигури зареждането на собствената библиотека с права root чрез замяна на /etc/ld.so.preload.

Отбелязва се, че създаването на експлоита се е оказало нетривиална задача, тъй като утилитата snap-confine е написана на Go, използвайки техники за безопасно програмиране, има защита на база профили на AppArmor, извършва филтриране на системни повиквания на базата на механизма seccomp и прилага пространство на имената за монтиране за изолация. Въпреки това, изследователите успяха да подготвят работещ експлоит за получаване на права root в системата. Кодът на експлоита ще бъде публикуван след няколко седмици, след като потребителите инсталират предоставените актуализации.

Източник: opennet.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster