URI 处理器 help://、ghelp:// 和 man:// 定义在文件 /usr/share/applications/yelp.desktop 中,当这些 URI 处理器中的任何一个被调用时,该文件将通过 Exec=yelp %u 执行 /usr/local/bin/yelp。
文件 /usr/local/bin/yelp 是一个简单的 python 脚本,用于解析传入的 URI 处理器请求。该脚本首先搜索子字符串 "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 会对空格 \x20 字符、花括号 {}、加号 + 字符、反引号 ` 字符以及其他一些字符进行 URI 编码。由于 ${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