Headline
CVE-2019-3842: Spoofing of XDG_SEAT allows for actions to be checked against "allow_active" instead of "allow_any"
In systemd before v242-rc4, it was discovered that pam_systemd does not properly sanitize the environment before using the XDG_SEAT variable. It is possible for an attacker, in some particular configurations, to set a XDG_SEAT environment variable which allows for commands to be checked against polkit policies using the “allow_active” element rather than "allow_any".
Description Sam Fowler 2019-01-23 01:23:07 UTC
systemd has a vulnerability in the PAM module, pam_systemd, that allows for spoofing of the XDG_SEAT environment variable which allows for commands to be checked against polkit policies using the “allow_active” element rather than "allow_any". Users with local access to machines with an active tty sessions can exploit this to elevate their privileges.
Comment 1 Riccardo Schirone 2019-03-01 15:44:01 UTC
pam_systemd uses getenv() to retrieve XDG_SEAT value, however when pam_systemd is used by a SUID binary this allows a unprivileged user, in some circumstances, to provide a fake XDG_SEAT value, with the consequences mentioned in comment 0.
Comment 2 Riccardo Schirone 2019-03-01 15:49:10 UTC
For the attack to be successful, a new session must be created and that is created by pam_systemd only if the calling process is not already part of a session. On Fedora/RHEL, in their default PAM configurations, it does not seem to be possible to let a session sneak in without systemd knowing about it, since pam_systemd is always called in every PAM config file.
Comment 10 Riccardo Schirone 2019-04-09 13:56:21 UTC
Created systemd tracking bugs for this issue:
Affects: fedora-all [bug 1698045]
Comment 11 Riccardo Schirone 2019-04-09 15:30:06 UTC
Acknowledgments:
Name: Jann Horn (Google Project Zero)
Comment 13 Riccardo Schirone 2020-03-06 13:57:55 UTC
Statement:
For the attack to be successful, a new session must be created by pam_systemd. This is done only if the calling process is not already part of a session. Red Hat Enterprise Linux, in its default PAM configurations, does not let a session sneak in without systemd knowing about it, since pam_systemd is always called in every PAM config file. Unless a wrong PAM config file is in place, this vulnerability cannot be triggered on Red Hat Enterprise Linux 7 and 8.