Hi Alexander, > Meanwhile, Red Hat confirms RHEL 9 and 10 are affected, and curiously > lists not only systemd, but also NetworkManager and rpm-ostree among > affected packages - I wonder why?
This was brought to my attention and I was checking it here. For the NetworkManager I could check that our manifest caught that because the NetworkManager lists systemd as a bundled 'provides'. This happens because NetworkManager seems to use parts of systemd-network internally, I'll fix the information on our page as in fact this flaw *does not* affect NetworkManager at all. I'll try to further look into the rpm-ostree case as well. Thanks, Marco Benatto Red Hat Product Security secal...@redhat.com for urgent response On Tue, Jun 3, 2025 at 1:12 AM Solar Designer <so...@openwall.com> wrote: > > Hi, > > Great findings by Qualys, as usual! > > Below are some comments on my attempt at reproducing the issue against > Rocky Linux 9.5's systemd-coredump (systemd-252-46.el9_5.3.x86_64): > > On Thu, May 29, 2025 at 05:17:08PM +0000, Qualys Security Advisory wrote: > > Local information disclosure in systemd-coredump (CVE-2025-4598) > > ======================================================================== > > > > ------------------------------------------------------------------------ > > Background > > ------------------------------------------------------------------------ > > > > While working on Ubuntu's apport, we remembered that various other > > distributions (Red Hat Enterprise Linux 9 and Fedora for example) use > > systemd-coredump as a core-dump handler in /proc/sys/kernel/core_pattern > > (instead of apport). We began to wonder: how does systemd-coredump solve > > the kill-and-replace race condition that we exploited against apport? > > > > Similarly to apport, systemd-coredump writes all core files into a > > hard-coded directory, /var/lib/systemd/coredump/. Before December 2022, > > systemd-coredump allowed users to read all of their core files (through > > file ACLs), including the core files of SUID or SGID programs, which of > > course allowed local attackers to read the contents of /etc/shadow by > > simply crashing su for example; this vulnerability was CVE-2022-4415, > > discovered and published by Matthias Gerstner: > > > > https://www.openwall.com/lists/oss-security/2022/12/21/3 > > FWIW, when run on Fedora 34, my reproducer trying to trigger the new bug > instead triggers the above older bug - file ACLs are in fact set to > enable the non-root user to read a coredump from a SUID program. > > > This old vulnerability was patched by introducing a new function, > > grant_user_access(), which decides whether a user should be allowed to > > read a core file or not, by analyzing the /proc/pid/auxv of the crashed > > process: if its AT_UID and AT_EUID match, and if its AT_GID and AT_EGID > > match, and if its AT_SECURE flag is 0, then read access is allowed; > > otherwise (if the crashed process is SUID or SGID), read access is > > denied (only root can read the core file). > > > > ------------------------------------------------------------------------ > > Analysis > > ------------------------------------------------------------------------ > > > > Unfortunately, we soon realized that systemd-coredump does not provide > > any protection at all against the kill-and-replace race condition that > > we exploited in apport. In other words, an attacker can simply crash a > > SUID process such as unix_chkpwd, SIGKILL and replace it with a non-SUID > > process (before its /proc/pid/auxv is analyzed by systemd-coredump), and > > therefore gain read access to the core file of the crashed SUID process, > > and hence to the contents of /etc/shadow. > > > > On the one hand, exploiting systemd-coredump is easier than exploiting > > apport, because we do not need to replace the crashed SUID process with > > a namespaced process: we can replace it with any non-SUID process, whose > > AT_UID and AT_EUID match, whose AT_GID and AT_EGID match, and whose > > AT_SECURE flag is 0. > > > > On the other hand, winning the kill-and-replace race condition against > > systemd-coredump is harder: unlike apport, systemd-coredump is written > > in C, and its initialization takes little time. To widen the window of > > the race condition, we pass an argv[0] of 128K '\177' characters to the > > SUID process: this slows down the analysis of its /proc/pid/cmdline (by > > systemd-coredump, before the analysis of its /proc/pid/auxv) and gives > > us enough time to replace the crashed SUID process with a non-SUID > > process. > > > > ------------------------------------------------------------------------ > > Proof of concept > > ------------------------------------------------------------------------ > > > > $ grep PRETTY_NAME= /etc/os-release > > PRETTY_NAME="Fedora Linux 41 (Server Edition)" > > > > $ id > > uid=1001(evey) gid=1001(evey) groups=1001(evey) > > context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 > > > > $ while true; do > > pid="$(printf 'whatever\0' | ./CVE-2025-4598 /usr/sbin/unix_chkpwd > > "$USER" nullok)"; > > pidwait -f /usr/lib/systemd/systemd-coredump; > > if coredumpctl -1 dump "$pid" 2>/dev/null | strings -a | grep > > '\$[0-9A-Za-z]\+\$[0-9A-Za-z./]'; then > > break; > > fi; > > done > > > > ... > > pid 364536 > > tid 364521 > > tid 364540 > > died in main: 177 > > theadmin:$y$j9T$APKdqQO.brzhEbC2JFd.5zb7$Rz2q.0umBr8AmkwlozWr8/yphm/ckEHIOMo9vcj.Wj/::0:99999:7::: > > evey:$y$j9T$QUW3HEErO9CYuGrRhiQjt.$.befySFW/nA48280u/Hk1XrcA2yDZ6Z1s7iRf91nJuA:20188:0:99999:7::: > > I've attached my attempt at partially reconstructing the Qualys' exploit > (which I haven't seen) that the above script uses, as well as the script > with some edits. > > I think I implemented most of what Qualys described (of the parts > relevant to systemd-coredump rather than only to apport), except that I > simply use fork() rather than clone() (slower PID reuse) and I didn't > implement usage of inotify (harder to win the race leading to password > hashes in dump). I've been testing this after: > > sysctl kernel.pid_max=2000 > control unix_chkpwd public # Undo SIG/Security hardening > > With the PID range reduced from the default of 4M down to 2K, PID reuse > is quick even with simple fork(). I am getting frequent unix_chkpwd > coredumps (without password hashes in them, which is as expected without > inotify), but none of them are getting ACLs set for read by the user > (unexpected - I thought I'd win this easier race once in a while), e.g.: > > Target pid 1588, current pid 1589 - missed target, retrying > Target pid 1590, current pid 1591 - missed target, retrying > Replaced pid 1592 > getfacl: Removing leading '/' from absolute path names > # file: > var/lib/systemd/coredump/core.unix_chkpwd.1000.17099079ebb84acbbb2dc4d8dd38e858.1592.1748566368000000.zst > # owner: root > # group: root > user::rw- > group::r-- > other::--- > > I'd appreciate any hints here. > > Meanwhile, Red Hat confirms RHEL 9 and 10 are affected, and curiously > lists not only systemd, but also NetworkManager and rpm-ostree among > affected packages - I wonder why? > > Alexander