В API Filesystem Context, предоставяно от ядрото на Linux, беше открито уязвимост (CVE-2022-0185), позволяваща на локален потребител да получи root права в системата. Изследователят, който е открил проблема, публикува демонстрация на работата на експлойта, позволяващ изпълнението на код с root права в Ubuntu 20.04 в конфигурация по подразбиране. Кодът на експлойта е планиран да бъде разположен в GitHub в рамките на седмица, след като дистрибуциите пуснат актуализация с поправка на уязвимостта.
Уязвимостта присъства във функцията legacy_parse_param() в VFS и е причинена от липсата на необходима проверка на максималния размер на параметрите, предоставяни в файловите системи, които не поддържат API Filesystem Context. При подаване на прекалено голям параметър може да настъпи преливане на целочислена променлива, използвана за изчисляване на размера на записваните данни — в кода има проверка за излизане извън границите на буфера „if (len > PAGE_SIZE - 2 - size)“, която не сработва, ако стойността на size е по-голяма от 4094 поради целочислено преливане на долната граница (integer underflow, при преобразуване на 4096 - 2 - 4095 в unsigned int получаваме 2147483648).
Посочената грешка позволява при достъп до специално оформен образ на ФС да се предизвика преливане на буфера и да се презапишат данни от ядрото, които следват заделената област на паметта. За експлоатацията на уязвимостта е необходимо наличие на права CAP_SYS_ADMIN, т.е. административни привилегии. Проблемът е, че подобни привилегии неконзолидран потребител може да получи в изолиран контейнер, ако в системата е активирана поддръжка на пространства на идентификатори на потребители (user namespaces). Например, user namespaces по подразбиране е активиран в Ubuntu и Fedora, но не е активиран в Debian и RHEL (ако не се използват платформи за контейнерна изолация).
Проблемът се проявява от ядрото на Linux 5.1 и е отстранен в актуализациите от вчера 5.16.2, 5.15.16, 5.10.93, 5.4.173. Актуализации на пакети с поправка на уязвимостта вече са издадени за RHEL, Debian, Fedora, Ubuntu. Поправките все още не са налични в Arch Linux, Gentoo, SUSE и openSUSE. Като обходен вариант за защита на системи, които не използват контейнерна изолация, може да се зададе нулево значение на sysctl „user.max_user_namespaces“: echo „user.max_user_namespaces=0“ > /etc/sysctl.d/userns.conf # sysctl -p /etc/sysctl.d/userns.conf
Източник: opennet.ru
