
PoC und Patch für eine Command-Injection-Schwachstelle im Yelp-URI-Handler von Linux Mint 18.3-19.1. Zeigt Grundursache, Ausnutzung und Gegenmaßnahmen.
Die URI-Handler help://, ghelp:// und man:// sind in der Datei /usr/share/applications/yelp.desktop definiert, die /usr/local/bin/yelp über Exec=yelp %u ausführt, sobald einer dieser URI-Handler aufgerufen wird.
Die Datei /usr/local/bin/yelp ist ein einfaches Python-Skript, das die eingehende URI-Handler-Anfrage parst. Dieses Skript sucht zuerst nach den Teilstrings "gnome-help" und "ubuntu-help", und wenn es keinen dieser Teilstrings findet, führt es /usr/local/bin/yelp aus, ohne das Argument in Anführungszeichen zu setzen.
Inhalt von /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')
Die Ausnutzung erforderte ein wenig Kreativität, da Google Chrome das Leerzeichen \x20, geschweifte Klammern {}, das Pluszeichen +, das Backtick-Zeichen ` und einige andere Zeichen URI-kodiert. Da ${IFS} nicht funktionierte, wurde entdeckt, dass $IFS$() genauso gut funktioniert, da die $()-Anweisung verhindert, dass sich die Umgebungsvariable $IFS mit anderen ASCII-Zeichen verbindet und versehentlich zu $IFSaddedword oder Ähnlichem wird.
Die Datei yelp.patch ändert die verwundbare Anweisung von os.system ("/usr/bin/yelp %s" % args) zu os.system ("/usr/bin/yelp %s" % quote(args)), wodurch die Methode quote() aus der Bibliothek shlex (https://docs.python.org/3/library/shlex.html#shlex.quote) genutzt wird.
Entweder yelp patchen oder entfernen.
sudo apt install patchsudo patch /usr/local/bin/yelp yelp.patchsudo rm /usr/share/applications/yelp.desktopsudo rm /usr/local/bin/yelp