Linux: bypass delle restrizioni utente di sudo

15/10/2019

CVE-2019-14287 local privilege escalation sudo

Un ricercatore di Apple, Joe Vennix, ha scoperto che un corner case nella gestione dei parametri delle system call setresuid e setreuid permette ad un attaccante di bypassare le restrizioni imposte dalla configurazione del comando sudo per versioni inferiori alla 1.8.28.

Sudo permette di eseguire un comando assumendo l’identità di altri utenti, ma anche di limitare quali account un utente può impersonare, ad esempio la configurazione

test ALL=(ALL,!root) cmd

permette all’utente test, da qualsiasi host, di lanciare il comando cmd impersonando qualsiasi utente eccetto l’utente root. Questa configurazione è piuttosto rara ma non priva di senso in quanto molti programmi permettono di eseguire comandi arbitrari come parte delle loro funzionalità (esempio banale: vim).

Si ha quindi

>whoami
test
>sudo -u altroutente cmd  #Eseguito
>sudo -u root cmd #Errore
Sorry, user test is not allowed to execute 'cmd' as root on XXX.

Per permettere a sudo di effettuare il suo lavoro esso ha il bit SUID settato ed è di root

File: ‘/usr/bin/sudo’
Size: 147392 Blocks: 288 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 3569562 Links: 1
Access: (4111/---s--x--x) Uid: ( 0/ root) Gid: ( 0/ root)

questo significa che sudo gira come root ed usa le syscall mostrate sopra per impersonare l’utente scelto (le quali lavorano con user id e non nomi utenti).
Tuttavia queste systemcall non cambiano l’user id del processo corrente se l’user id richiesto è -1. Questo caso specifico e documentato nel manuale:

If one of the arguments equals -1, the corresponding value is not changed.

Supplying a value of -1 for either the real or effective user ID forces the system to leave that ID unchanged.

ma sudo non ne è al corrente ed il seguente comando

>whoami
test
>sudo -u#-1 cmd  #Eseguito

Permette di eseguire cmd come root, nonostante le restrizioni imposte nella configurazione, in quanto la richiesta di impersonare l’utente con UID -1 è effettivamente una richiesta di mantenere l’UID attuale (ovvero di continuare ad eseguire il processo come root).

Questo bug è stato corretto nella versione 1.8.28 il 10 ottobre scorso, come si evince dal repository ufficiale, pertanto una versione corretta è già disponibile upstream e si consiglia di aggiornare sudo.

Sebbene la configurazione non riguardi la maggior parte delle installazioni esistenti, ove ciò avviene, in concomitanza con altre vulnerabilità remote, consentirebbe ad un attaccante di prendere il completo possesso della macchina.