Компания Qualys откри две уязвимости в инструментите apport (CVE-2025-5054) и systemd-coredump (CVE-2025-4598), използвани за обработка на core-файлове, генерирани след аварийно прекратяване на процеси. Уязвимостите позволяват достъп до core-файлове, запазени след аварийно прекратяване на suid-приложения или някои системни фонови процеси, в паметта на които могат да се съдържат кеширани удостоверителни данни или ключове за криптиране. Утилитата apport автоматично се извиква за запазване на core-дампове в Ubuntu, а systemd-coredump в Red Hat Enterprise Linux 9+, Fedora и много други дистрибуции на Linux.
Демонстрирана е техника на атака, при която се създават условия за аварийно прекратяване на suid-приложението unix_chkpwd и получаване на достъп до core-файла с дамп на състоянието по време на краха. В запазения core-дамп са присъствали хешове на пароли на потребителите на системата, оставащи в паметта на аварийно прекратения процес след зареждане на съдържанието на /etc/shadow. Възможността за експлотация на уязвимостите е демонстрирана в Ubuntu 24.04 и Fedora 40/41, но се предполага, че и други дистрибуции са уязвими на подобни атаки.
И двете уязвимости са причинени от състояние на гонка, позволяващо подмяна на аварийно прекратения suid-процес с друг процес в момента след началото на обработката от ядрото на аварийната ситуация, но преди проверката на параметрите на процеса от обработчика в пространството на потребителя чрез /proc/pid/files. Извикването на apport и systemd-coredump се извършва по следния начин: ядрото, получавайки информация за аварийното прекратяване на процеса, извиква обработчика, указан в файла /proc/sys/kernel/core_pattern, след което му предава съдържанието на core-дампа чрез входния поток.
Генерирането на core-дамп и стартирането на обработчика не стават мигновено и това време е достатъчно, за да се подмени завършеният suid-процес с обикновен потребителски процес. При подмяна, стартираният обработчик на core-дамповете ще смята, че сбой е възникнал не в suid-процеса, а в обикновено потребителско приложение и, съответно, ще запази core-файл с достъп на обикновен потребител, а не само на администратора.
Атаката срещу apport включва следните стъпки:
- Създава се нов процес и се извиква функцията execve() за стартиране на suid-програмата, като unix_chkpwd.
- Пропуска се времето, необходимо за зареждане на конфиденциални данни в паметта от suid програмата (в случай на unix_chkpwd се очаква зареждане на хешовете на паролите на всички потребители на системата от файла /etc/shadow).
- Преди да се завърши изпълнението на командата, на процеса се изпраща сигнал SIGSEGV или SIGSYS за аварийно прекратяване.
- В отговор на аварийното спиране, ядрото генерира core-дамп и стартира процеса apport за обработка на core-дампа в потребителското пространство.
- След стартиране на apport, но преди започване на анализа, на аварийно приключилото се процес се изпраща сигнал SIGKILL, а той самият се заменя с друг без флага suid. Заобикалянето на проверките в apport се извършва чрез създаване на новия процес в отделни пространства от имена (user, pid и mount namespace).
- apport се свързва с unix-сокета /run/apport.socket в създаденото пространство от имена за новия процес и изпраща файлов дескриптор за достъп до core-дампа.
За да получи нужния идентификатор за новия процес, съвпадащ с идентификатора на suid-процеса, преди изпращане на сигнала SIGSEGV, suid-процесът се спира със сигнал SIGSTOP и по време на спирането циклично се стартират нови процеси, докато не бъде получен PID с предшестващ номер, близък до заменяемия suid-процес. След преместването на нумерацията на PID, на suid-процеса се изпращат сигналите SIGSEGV и SIGCONT, след което следва SIGKILL и циклично се стартират нови процеси, за да се постигне същия PID, какъвто има suid-процесът.
Що се отнася до systemd-coredump, от една страна, провеждането на атака срещу него е по-лесно, тъй като няма нужда да се заменя suid-процесът с процес в отделно потребителско пространство и е достатъчно да се постигне съвпадение между AT_UID и AT_EUID. От друга страна, systemd-coredump е написан на C и се стартира доста бързо, което дава по-малко време за замяна, в отличие от apport, който е написан на Python и в процеса на инициализация зарежда различни .pyc файлове. Подобен проблем се решава чрез изкуствено забавяне на systemd-coredump — при извикване на suid файла се подават много аргументи на командния ред, което създава необходимата забавяне, възникваща по време на анализа на /proc/pid/cmdline.
В процеса на анализ на уязвимостите изследователите също така установиха, че systemd-coredump при конфигуриране на извикването не указва флага «%d» в /proc/sys/kernel/core_pattern, което позволява на нападателя да предизвика аварийно прекратяване на фонови процеси, изпълнявани с права на root и създаващи нови процеси, променяйки идентификатора на потребителя на непривилегирован потребител, под който се извършва атаката. Подобна възможност позволява атака не само на приложения с setuid, но и на процеси като sshd-session (OpenSSH), sd-pam (systemd) и cron, за получаване на конфиденциални данни, останали в паметта им, като тайни ключове, хешове на пароли от /etc/shadow, канареечни етикети от стека и данни за заобикаляне на рандомизацията на адресното пространство (ASLR).
За да следите публикуването на актуализации на пакетите в дистрибуциите, можете да посетите страниците: Debian, Ubuntu, RHEL, openSUSE, Fedora, Gentoo, Arch. Като обходно средство за блокиране на уязвимостите се предлага да се деактивира запазването на core-дампове за suid-програми и за процеси, които свалят привилегиите, като се зададе параметърът /proc/sys/fs/suid_dumpable на 0. За пълното премахване на проблема е необходимо извършване на промени в ядрото на Linux, което реализира възможността за предаване на информация за аварийно прекратилите се процеси чрез механизма pidfd (pidfd е свързан с конкретни процеси и за разлика от pid не се преназначава).
Източник: opennet.ru
