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

Компанія Qualys виявила дві вразливості (CVE-2021-44731, CVE-2021-44730) в утиліті snap-confine, що поставляється з прапором SUID root і викликається процесом snapd для формування виконуваного оточення для додатків, що поставляються в самодостатніх пакетах у форматі. Вразливості дозволяють локальному непривілейованому користувачеві домогтися виконання коду з правами 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

Додати коментар або відгук