Het bedrijf Qualys heeft twee kwetsbaarheden ontdekt in de tools apport (CVE-2025-5054) en systemd-coredump (CVE-2025-4598), die worden gebruikt voor het verwerken van corebestanden die worden gegenereerd na een onverwachte beƫindiging van processen. De kwetsbaarheden maken toegang tot corebestanden mogelijk die zijn opgeslagen na het onverwacht beƫindigen van suid-applicaties of bepaalde systeemachtergrondprocessen, die mogelijk gecachete inloggegevens of encryptiesleutels in het geheugen bevatten. De tool apport wordt automatisch aangeroepen om core-dumps op te slaan in Ubuntu, terwijl systemd-coredump in Red Hat Enterprise Linux 9+, Fedora en vele andere Linux-distributies wordt gebruikt.
Een aanvalstechniek is gedemonstreerd waarbij omstandigheden werden gecreƫerd voor de onverwachte beƫindiging van de suid-applicatie unix_chkpwd en toegang werd verkregen tot het corebestand met de statusdump tijdens de crash. In de opgeslagen core-dump waren de hashes van de gebruikerswachtwoorden van het systeem aanwezig, die in het geheugen van het onverwacht beƫindigde proces bleven na het laden van de inhoud van /etc/shadow. De mogelijkheid om de kwetsbaarheden te exploiteren werd gedemonstreerd in Ubuntu 24.04 en Fedora 40/41, maar het wordt verondersteld dat ook andere distributies aan soortgelijke aanvallen onderhevig zijn.
Beide kwetsbaarheden worden veroorzaakt door een raceconditie die het mogelijk maakt om het onverwacht beƫindigde suid-proces te vervangen door een ander proces op het moment na de verwerking van de crashdoor het kernel, maar voordat de handler in de gebruikersruimte de procesparameters via /proc/pid/files controleert. De aanroep van apport en systemd-coredump gebeurt als volgt: de kernel, na informatie over de crash van het proces te hebben ontvangen, roept de handler aan, zoals aangegeven in het bestand /proc/sys/kernel/core_pattern, en geeft vervolgens de inhoud van de core-dump door via de invoerstroom.
De generatie van de core-dump en het starten van de handler gebeurt niet onmiddellijk en deze tijd is voldoende om het beƫindigde suid-proces te vervangen door een normaal gebruikersproces. In het geval van vervanging zal de actieve handler voor core-dumps denken dat de fout niet heeft plaatsgevonden in het suid-proces, maar in een normale gebruikersapplicatie en zal zodoende het corebestand opslaan met toegangsrechten voor een gewone gebruiker in plaats van alleen voor de beheerder.
De aanval op apport kan worden samengevat in de volgende stappen:
- Er wordt een nieuw proces afgesplitst en de functie execve() wordt aangeroepen om een suid-programma te starten, zoals unix_chkpwd.
- De tijd die nodig is om de suid-applicatie vertrouwelijke gegevens naar het geheugen te laden, wordt overgeslagen (in het geval van unix_chkpwd wordt verwacht dat de hashes van de wachtwoorden van alle gebruikers van het systeem uit het bestand /etc/shadow worden geladen).
- Voordat de opdracht is uitgevoerd, wordt er een SIGSEGV- of SIGSYS-signaal naar het proces verzonden om het geforceerd te beƫindigen.
- Als reactie op de geforceerde beƫindiging genereert de kernel een core-dump en start het apport-proces om de core-dump in de gebruikersruimte te verwerken.
- Na het starten van apport, maar voordat de parsing begint, wordt er een SIGKILL-signaal naar het abrupte proces gestuurd en wordt het eigentijdse proces vervangen door een andere zonder de suid-vlag. Om controles in apport te omzeilen, wordt het nieuwe proces binnen afzonderlijke naamruimten (user, pid en mount namespace) aangemaakt.
- Apport maakt verbinding met de unix-socket /run/apport.socket in de aangemaakte naamruimte van de nieuwe proces met punten en verstuurt een bestand descriptor voor toegang tot de core-dump.
Om voor het nieuwe proces de benodigde identificator te verkrijgen, die overeenkomt met de identificator van het suid-proces, wordt het suid-proces gestopt met het SIGSTOP-signaal voordat het SIGSEGV-signaal wordt verzonden, en tijdens de stop worden er cyclisch nieuwe processen gestart totdat een PID met een voorafgaand nummer, dicht bij het vervangbare suid-proces, is verkregen. Na het verschuiven van de PID-nummering worden de SIGSEGV- en SIGCONT-signalen naar het suid-proces gestuurd, waarna SIGKILL wordt verzonden en cyclisch nieuwe processen worden gestart om dezelfde PID te bereiken als die van het suid-proces.
Wat betreft systemd-coredump, aan de ene kant is het makkelijker om een aanval erop uit te voeren, omdat het niet nodig is om het suid-proces door een proces in een andere gebruikersruimte te vervangen, en het voldoende is om overeenstemming tussen AT_UID en AT_EUID te bereiken. Aan de andere kant is systemd-coredump geschreven in de C-taal en wordt het voldoende snel uitgevoerd, wat minder tijd biedt voor vervanging, in tegenstelling tot apport, dat is geschreven in Python en tijdens de initialisatie verschillende .pyc-bestanden laadt. Dit probleem wordt opgelost door systemd-coredump kunstmatig te vertragen - tijdens het aanroepen van het suid-bestand wordt er een groot aantal commandoregelargumenten doorgegeven, wat de benodigde vertraging creƫert die optreedt tijdens de parsing van /proc/pid/cmdline.
Tijdens het analyseren van kwetsbaarheden ontdekten onderzoekers ook dat systemd-coredump bij de configuratie van de aanroep de vlag "%d" niet aangeeft in /proc/sys/kernel/core_pattern, waardoor een aanvaller een afgebroken proces kan veroorzaken dat in de achtergrond draait met rootrechten en andere processen voortbrengt met een gewijzigde gebruikersidentificatie naar een niet-bevoorrechte gebruiker onder wie de aanval plaatsvindt. Deze mogelijkheid stelt een aanval in staat niet alleen op setuid-toepassingen uit te voeren, maar ook op processen zoals sshd-sessie (OpenSSH), sd-pam (systemd) en cron, om gevoelige gegevens die in hun geheugen zijn blijven hangen te verkrijgen, zoals privƩsleutels, wachtwoord-hashes uit /etc/shadow, canary-waarden uit de stack en gegevens om de adresruimte-randomisatie (ASLR) te omzeilen.
Updates van pakketten in de distributies kunnen worden gevolgd op de pagina's: Debian, Ubuntu, RHEL, openSUSE, Fedora, Gentoo, Arch. Als een workaround voor het blokkeren van kwetsbaarheden wordt voorgesteld om het opslaan van core-dumps voor suid-programma's en privilege-verlaagde processen uit te schakelen door de parameter /proc/sys/fs/suid_dumpable op waarde 0 te zetten. Voor een volledige oplossing van het probleem zijn wijzigingen in de Linux-kernel nodig, die de mogelijkheid van informatieoverdracht over een afgehandeld proces via het pidfd-mechanisme implementeert (pidfd is verbonden met specifieke processen en wordt in tegenstelling tot pid niet opnieuw toegewezen).
Bron: opennet.ru
