Компанията 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 създава sandbox среда за изпълнение на 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 дни. След подмяната на директорията, нападателят успява да инициира нова sandbox среда с помощта на snap-confine.
По време на създаването на sandbox средата в временната директория /tmp/.snap, нападателят изчаква подходящия момент и преименува /tmp/.snap/usr/lib/x86_64-linux-gnu.exchange на /tmp/.snap/usr/lib/x86_64-linux-gnu, по такъв начин подменяйки библиотеките и осигурявайки тяхното bind-монтиране с права root. По този начин нападателят получава контрол над споделените библиотеки и зареждача ld.so, които се изпълняват в sandbox средата на 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
