Společnost Qualys identifikovala dvě zranitelnosti v nástrojích apport (CVE-2025-5054) a systemd-coredump (CVE-2025-4598), které se používají pro zpracování core souborů generovaných po havárii procesů. Zranitelnosti umožňují přístup k core souborům uloženým po havárii suid aplikací nebo některých systémových procesů na pozadí, v jejichž paměti se mohou nacházet uložené přihlašovací údaje nebo šifrovací klíče. Nástroj apport je automaticky vyvolán pro uložení core dumpů v Ubuntu, zatímco systemd-coredump v Red Hat Enterprise Linux 9+, Fedora a mnoha dalších distribucích Linuxu.
Byla demonstrována technika útoku, při které byly vytvořeny podmínky pro havárii suid aplikace unix_chkpwd a získání přístupu k core souboru s dumpem stavu během pádu. Uloženém core dumpu byly obsaženy hashe hesel uživatelů systému, které zůstaly v paměti havarovaného procesu po načtení obsahu /etc/shadow. Možnost zneužití zranitelností byla prokázána v Ubuntu 24.04 a Fedora 40/41, ale předpokládá se, že i další distribuce jsou podobným útokům vystaveny.
Obě zranitelnosti jsou způsobeny stavem závodu, který umožňuje nahradit havarovaný suid proces jiným procesem v okamžiku po začátku zpracování jádrem havárie, ale před kontrolou zpracovatelem v uživatelském prostoru parametrů procesu přes /proc/pid/files. Volání apportu a systemd-coredump probíhá následovně: jádro, poté co obdrží informace o havárii procesu, vyvolá zpracovatele uvedeného v souboru /proc/sys/kernel/core_pattern, po čemž mu předá obsah core dumpu přes vstupní proud.
Generování core dumpu a spuštění zpracovatele neprobíhá okamžitě a je dost času na to, aby bylo možné nahradit havarovaný suid proces běžným procesem uživatele. V případě nahrazení bude spuštěný zpracovatel core dumpů považovat, že chyba nenastala v suid procesu, ale v běžné aplikaci uživatele, a tím pádem uloží core soubor s přístupem běžného uživatele, nikoli pouze administrátora.
Útok na apport spočívá v následujících krocích:
- Otevře se nový proces a zavolá se funkce execve() pro spuštění suid programu, jako je unix_chkpwd.
- Při načítání citlivých dat do paměti pomocí suid programu se započítává čas (v případě unix_chkpwd se očekává načtení hashů hesel všech uživatelů systému z souboru /etc/shadow).
- Před dokončením provádění příkazu je procesu zaslán signál SIGSEGV nebo SIGSYS pro jeho nouzové ukončení.
- V reakci na nouzové ukončení jádro vytvoří core dump a spustí proces apport pro zpracování core dumpu v uživatelském prostoru.
- Po spuštění apport, ale před začátkem jeho analýzy je ke procesu, jenž havaroval, zaslán signál SIGKILL, a samotný proces je nahrazen jiným bez flagu suid. Aby se bypassovaly kontroly v apport, nový proces je vytvářen uvnitř oddělených jmenných prostorů (user, pid a mount namespace).
- Apport se připojí k unixovému socketu /run/apport.socket ve vytvořeném jmenném prostoru pro nový proces a odešle souborový deskriptor pro přístup k core dumpu.
Aby se pro nový proces získal potřebný identifikátor odpovídající identifikátoru suid procesu, před zasláním signálu SIGSEGV je suid proces zastaven signálem SIGSTOP a během zastavení se cyklicky spouští nové procesy, dokud není získán PID s předchozím číslem blízkým zaměnitelnému suid procesu. Po posunu číslování PID jsou suid procesu zaslány signály SIGSEGV a SIGCONT, po kterých je odeslán SIGKILL a cyklicky se spouští nové procesy pro dosažení stejného PID jako u suid procesu.
Pokud jde o systemd-coredump, z jedné strany je útok na něj jednodušší, protože není potřeba nahradit suid proces procesem v odděleném uživatelském prostoru, stačí dosáhnout shody AT_UID a AT_EUID. Z druhé strany je systemd-coredump napsán v jazyce C a spouští se dostatečně rychle, což dává méně času na manipulaci, na rozdíl od apportu, který je napsán v Pythonu a během inicializace načítá různé pyc soubory. Tento problém se řeší umělým zpožděním systemd-coredump — při volání suid souboru je předán velmi vysoký počet argumentů příkazového řádku, což vytváří požadované zpoždění během analýzy /proc/pid/cmdline.
Během analýzy zranitelností výzkumníci rovněž zjistili, že systemd-coredump při nastavení volání neuvádí ve /proc/sys/kernel/core_pattern flag "%d", což útočníkovi umožňuje způsobit havárii pozadí běžících procesů s právy root a odštěpit další procesy, které mění identifikátor uživatele na neoprávněného uživatele, pod nímž se útok provádí. Tato možnost umožňuje provést útok nejen na setuid aplikace, ale i na procesy jako sshd-session (OpenSSH), sd-pam (systemd) a cron, s cílem získat důvěrné údaje, které zůstaly v jejich paměti, jako jsou soukromé klíče, hashe hesel z /etc/shadow, kanárkové značky ze zásobníku a data pro obcházení randomizace adresního prostoru (ASLR).
Sledovat publikaci aktualizací balíčků v distribucích lze na stránkách: Debian, Ubuntu, RHEL, openSUSE, Fedora, Gentoo, Arch. Jako obchvat blokování zranitelností se doporučuje zakázat uchovávání core dumpů pro suid programy a privilegované procesy nastavením parametru /proc/sys/fs/suid_dumpable na hodnotu 0. K úplnému odstranění problému je zapotřebí provést změny v jádře Linuxu, které implementuje možnost předávání informací o havarovaném procesu prostřednictvím mechanismu pidfd (pidfd se váže na konkrétní procesy a na rozdíl od pid není znovu přiřazován).
Zdroj: opennet.ru
