URIハンドラー help://、ghelp://、man:// はファイル /usr/share/applications/yelp.desktop で定義されており、これらのURIハンドラーのいずれかが呼び出されるたびに、Exec=yelp %u を介して /usr/local/bin/yelp が実行されます。
/usr/local/bin/yelp は、受信したURIハンドラーのリクエストを解析する単純なPythonスクリプトです。このスクリプトはまず "gnome-help" と "ubuntu-help" という部分文字列を探し、そのどちらも見つからなかった場合、引数を引用符で囲まずに /usr/local/bin/yelp を実行します。
/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')
実際の悪用には少し工夫が必要でした。Google Chrome はURIエンコード時にスペース \x20 文字、中括弧 {}、プラス記号 +、バッククォート文字 ` などをエンコードするためです。${IFS} は機能しないため、$IFS$() を使えば同様に機能することが判明しました。$() 文によって、$IFS 環境変数が他のASCII文字と連結され、誤って $IFSaddedword などになるのを防ぐからです。
yelp.patch は、脆弱なステートメントを os.system ("/usr/bin/yelp %s" % args) から os.system ("/usr/bin/yelp %s" % quote(args)) に変更します。これは shlex ライブラリの quote() メソッドを利用します (https://docs.python.org/3/library/shlex.html#shlex.quote)。
yelp をパッチするか、削除してください。
sudo apt install patchsudo patch /usr/local/bin/yelp yelp.patchsudo rm /usr/share/applications/yelp.desktopsudo rm /usr/local/bin/yelp