In swhkd (Simple Wayland HotKey Daemon) a series of vulnerabilities have been identified, caused by improper handling of temporary files, command-line parameters, and Unix sockets. The program is written in Rust and processes hotkey presses in environments based on the Wayland protocol (functionally compatible with the configuration file process analogous to sxhkd, used in X11 environments).
The package includes an unprivileged process swhks that executes actions for hotkeys, and a background process swhkd that runs with root privileges and interacts with input devices at the uinput API level. A Unix socket is used to facilitate interaction between swhks and swhkd. With Polkit rules, any local user is granted the ability to launch the process /usr/bin/swhkd with root privileges and pass arbitrary parameters to it.
Vulnerabilità identificate:
- CVE-2022-27815 — salvataggio del PID del processo in un file con un nome prevedibile e in una directory scrivibile da altri utenti (/tmp/swhkd.pid). Qualsiasi utente può creare un file /tmp/swhkd.pid e inserire al suo interno il pid di un processo esistente, impedendo così l'avvio di swhkd. In assenza di protezione contro la creazione di collegamenti simbolici in /tmp, la vulnerabilità può essere sfruttata per creare o sovrascrivere file in qualsiasi directory di sistema (il PID viene scritto nel file) o per rivelare il contenuto di qualsiasi file nel sistema (swhkd stampa in stdout tutto il contenuto del file PID). È notevole che nella patch rilasciata il file PID non sia stato spostato nella directory /run, ma in /etc (/etc/swhkd/runtime/swhkd_{uid}.pid), dove non dovrebbe trovarsi.
- CVE-2022-27814 — manipolando il parametro della riga di comando "-c", utilizzato per specificare il file di configurazione, è possibile determinare l'esistenza di qualsiasi file nel sistema. Ad esempio, per verificare /root/.somefile, è possibile eseguire "pkexec /usr/bin/swhkd -d -c /root/.somefile" e se il file è assente verrà restituito un errore "/root/.somefile non esiste". Come nel caso della prima vulnerabilità, la correzione del problema risulta confusa: la risoluzione consiste nel fatto che ora viene eseguita un'utilità esterna "cat" per leggere il file di configurazione (‘Command::new(“/bin/cat”).arg(path).output()’).
- CVE-2022-27819 — il problema è anche legato all'uso dell'opzione «-c», che carica e analizza l'intero file di configurazione senza controllare la dimensione e il tipo di file. Ad esempio, per evocare un'interruzione del servizio attraverso l'esaurimento della memoria disponibile e creando un input/output parassitario, è possibile specificare all'avvio un dispositivo a blocchi («pkexec /usr/bin/swhkd -d -c /dev/sda») o un dispositivo a caratteri che fornisce un flusso infinito di dati. Il problema è stato risolto azzerando i privilegi prima di aprire il file, ma la correzione si è rivelata incompleta, poiché viene azzerato solo l'identificatore utente (UID), mentre l'identificatore di gruppo (GID) rimane invariato.
- CVE-2022-27818 — per la creazione di un socket Unix viene utilizzato il file /tmp/swhkd.sock, creato in una cartella pubblica scrivibile, il che porterebbe a problemi simili alla prima vulnerabilità (qualunque utente può creare /tmp/swhkd.sock e generare o intercettare eventi di pressione dei tasti).
- CVE-2022-27817 — gli eventi di input vengono accettati da tutti i dispositivi e in tutte le sessioni, cioè un utente da un'altra sessione Wayland o dalla console può intercettare gli eventi quando altri utenti premendo le scorciatoie da tastiera.
- CVE-2022-27816 — il processo swhks, come swhkd, utilizza un file PID /tmp/swhks.pid in una directory di accesso pubblico in scrittura /tmp. Il problema è simile alla prima vulnerabilità, ma meno critica, dato che swhks viene eseguito con un utente non privilegiato.
Fonte: opennet.ru
