
PoC e patch para uma vulnerabilidade de injeção de comando no manipulador de URI do yelp no Linux Mint 18.3-19.1. Demonstra a causa raiz, a exploração e a mitigação.
Os manipuladores de URI help://, ghelp:// e man:// estão definidos no arquivo /usr/share/applications/yelp.desktop, que executa /usr/local/bin/yelp via Exec=yelp %u sempre que um desses manipuladores de URI é invocado.
O arquivo /usr/local/bin/yelp é um simples script python que analisa a solicitação recebida do manipulador de URI. Este script primeiro procura pelas substrings "gnome-help" e "ubuntu-help" e, se não encontrar nenhuma delas, executa /usr/local/bin/yelp sem envolver o argumento entre aspas.
Conteúdo de /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')
A exploração exigiu um pouco de criatividade, pois o Google Chrome codifica via URI o caractere de espaço \x20, chaves {}, o caractere de mais +, o caractere de crase ` e alguns outros. Como ${IFS} não funcionava, descobriu-se que usar $IFS$() funciona igualmente bem, pois a instrução $() impede que a variável de ambiente $IFS seja concatenada com outros caracteres ASCII e acabe virando acidentalmente $IFSaddedword ou algo assim.
O arquivo yelp.patch modifica a instrução vulnerável de os.system ("/usr/bin/yelp %s" % args) para os.system ("/usr/bin/yelp %s" % quote(args)), utilizando o método quote() da biblioteca shlex (https://docs.python.org/3/library/shlex.html#shlex.quote).
Pode-se aplicar o patch no yelp ou removê-lo.
sudo apt install patchsudo patch /usr/local/bin/yelp yelp.patchsudo rm /usr/share/applications/yelp.desktopsudo rm /usr/local/bin/yelp