
PoC e patch per una vulnerabilità di command injection nel gestore URI yelp di Linux Mint 18.3-19.1. Dimostra la causa principale, lo sfruttamento e la mitigazione.
I gestori URI help://, ghelp:// e man:// sono definiti nel file /usr/share/applications/yelp.desktop che eseguirà /usr/local/bin/yelp tramite Exec=yelp %u ogni volta che uno di questi gestori URI viene invocato.
Il file /usr/local/bin/yelp è un semplice script Python che analizza la richiesta del gestore URI in arrivo. Questo script cerca prima le sottostringhe "gnome-help" e "ubuntu-help" e, se non trova nessuna di queste sottostringhe, eseguirà /usr/local/bin/yelp senza racchiudere l'argomento tra virgolette.
Contenuto di /usr/local/bin/yelp:
#!/usr/bin/python
import os
import sys
if (len(sys.argv) > 1):
args = ' '.join(sys.argv[1:])
if ('gnome-help' in args) and not os.path.exists('/usr/share/help/C/gnome-help'):
os.system ("xdg-open http://www.linuxmint.com/documentation.php &")
elif ('ubuntu-help' in args) and not os.path.exists('/usr/share/help/C/ubuntu-help'):
os.system ("xdg-open http://www.linuxmint.com/documentation.php &")
else:
os.system ("/usr/bin/yelp %s" % args) # uh oh
else:
os.system ('/usr/bin/yelp')
Lo sfruttamento ha richiesto un po' di creatività, poiché Google Chrome codifica nell'URI il carattere spazio \x20, le parentesi graffe {}, il carattere più +, il carattere backtick ` e alcuni altri. Poiché ${IFS} non funzionava, si è scoperto che usare $IFS$() funziona altrettanto bene, dato che l'istruzione $() impedisce alla variabile d'ambiente $IFS di concatenarsi con altri caratteri ASCII e di diventare accidentalmente $IFSaddedword o simili.
Il file yelp.patch modifica l'istruzione vulnerabile da os.system ("/usr/bin/yelp %s" % args) a os.system ("/usr/bin/yelp %s" % quote(args)), sfruttando il metodo quote() della libreria shlex (https://docs.python.org/3/library/shlex.html#shlex.quote).
È possibile applicare la patch a yelp oppure rimuoverlo.
sudo apt install patchsudo patch /usr/local/bin/yelp yelp.patchsudo rm /usr/share/applications/yelp.desktopsudo rm /usr/local/bin/yelp