Уязвимости в snapd и Rust Coreutils, позволяващи получаване на root-права в Ubuntu

Компания Qualys откри уязвимост (CVE-2026-3888) в работата на свързването snap-confine и systemd-tmpfiles в Ubuntu, позволяваща на непривилегирован потребител да получи root достъп до системата. Проблемът се проявява в Ubuntu в конфигурацията по подразбиране, започвайки с версия 24.04. В Ubuntu 16.04-22.04 уязвимостта може да бъде експлоатирана в нестандартни конфигурации, имитиращи поведението на по-нови версии на дистрибуцията. В Ubuntu, поправката е налична в вчерашното обновление на пакета snapd. Проблемът в snapd е отстранен в обновлението 2.75.

Уязвимостта възниква поради некоректното взаимодействие на утилитите snap-confine и systemd-tmpfiles, изпълнявани с повишени привилегии. Утилитата snap-confine създава среда за пясъчник за изпълнение на snap приложения, а systemd-tmpfiles извършва автоматично почистване на времеви файлове и директории. По подразбиране утилитата systemd-tmpfiles е настроена да изтрива всички стари файлове и директории в /tmp, което може да бъде използвано от нападателя за замяна на директорията /tmp/.snap в момента след нейното изтриване от утилитата systemd-tmpfiles, но преди да бъде възстановена от snap-confine.

Атаката се свежда до изчакването на стартиране на процеса по почистване на времеви файлове, заместването на директорията /tmp/.snap след нейното изтриване и поставянето на модифицирана версия на библиотеките /tmp/.snap/usr/lib/x86_64-linux-gnu.exchange. Нападателят може да се наложи да чака няколко дни за стартиране на systemd-tmpfiles, тъй като в Ubuntu 24.04 процесът по почистване се стартира веднъж на 10 дни, а в по-новите версии — веднъж на 30 дни. След заместването на директорията, нападателят постига инициализация на нова среда за пясъчник с помощта на snap-confine.

По време на създаването на съдържанието на средата за пясъчник в времевата директория /tmp/.snap нападателят изчаква подходящия момент и преименува /tmp/.snap/usr/lib/x86_64-linux-gnu.exchange на /tmp/.snap/usr/lib/x86_64-linux-gnu, по този начин замествайки библиотеките и осигурявайки тяхното свързване с привилегии root. По този начин нападателят получава контрол над споделените библиотеки и зареждача ld.so, изпълнявани в средата за пясъчник snap, и може да постигне изпълнение на произволен код с права root чрез стартиране на всяка suid програма, в която се използва динамично связыване.

С имате root-достъп в sandbox-среда, изолирана чрез AppArmor и филтър на системни повици, базиран на seccomp, атакуващият може да копира /bin/bash в директорията /var/snap/$SNAP/common/ и да зададе права «04755» (suid root). Въпреки че правата са променени в sandbox-средата, файлът с променени права е достъпен и в основната система, така че за получаване на пълен root достъп е достатъчно да се стартира /var/snap//common/bash от обикновен непривилегирован потребител в стандартната системна среда.

В процеса беше установена уязвимост в инструмента uutils coreutils (Rust Coreutils), аналог на пакета GNU Coreutils, написан на езика Rust. Уязвимостта позволява на непривилегирован потребител да получи root права в системата. Проблемът беше идентифициран по време на преглед на промените в Ubuntu 25.10 и бе решен временно преди излизането на Ubuntu 25.10, като беше предоставено /usr/bin/gnurm вместо uutils rm. В пакета uutils проблемът беше отстранен в издание uutils coreutils 0.3.0, без отбелязване в списъка с промени за отстраняване на уязвимостта (беше посочено, че в rm, du, chmod и chgrp е реализиран безопасен метод за заобикаляне на пътищата).

Проблемът е причинен от състояние на състезание в утилитата «rm», позволяващо на локален потребител да подмени съдържанието на директорията с символична връзка по време на изтриването на контролирания от потребителя файл от процеса «rm» с root права. Между другото, уязвимостта може да бъде експлоатирана при ежедневното стартиране от cron скрипта /etc/cron.daily/apport, който се изпълнява с root права и рекурсивно изтрива съдържанието на директорията /var/crash, достъпна за запис от всички потребители в системата.

При рекурсивно изтриване на директории утилитата rm първо проверява всички директории и след това последователно ги изтрива в обратен ред, извиквайки функцията rmdir(). Ако успеете да подмените родителската директория със символична връзка веднага след проверката на тази директория, но преди проверката на вложените в нея дъщерни директории, операцията ще доведе до изтриване на директорията, на която сочи символичната връзка. По този начин може да се постигне не само изтриването на всеки файл в системата, но и повишаване на привилегиите чрез изтриване на директорията /tmp/snap-private-tmp/$SNAP/tmp/.snap за подмяна на съдържанието на sandbox-средата на snap-пакета (методът за придобиване на root е аналогичен на първата уязвимост).

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

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