
مُعرِّفات URI help:// وghelp:// وman:// معرَّفة في الملف /usr/share/applications/yelp.desktop، والذي سينفّذ /usr/local/bin/yelp عبر Exec=yelp %u عند استدعاء أيٍّ من معالجات URI هذه.
الملف /usr/local/bin/yelp هو سكربت بايثون بسيط يفسّر طلب معالج 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 والأقواس المجعدة {} وعلامة الزائد + وعلامة backtick ` وبعض الأحرف الأخرى. وبما أن ${IFS} لم تكن لتعمل، فقد تبيّن أن استخدام $IFS$() يعمل بنفس الجودة، لأن جملة $() تمنع متغير البيئة $IFS من الالتحام بأحرف ASCII أخرى فيتحول بطريق الخطأ إلى $IFSaddedword أو ما شابه.
يقوم الملف yelp.patch بتعديل العبارة القابلة للاستغلال من os.system ("/usr/bin/yelp %s" % args) إلى os.system ("/usr/bin/yelp %s" % quote(args))، ويعتمد على دالة quote() من مكتبة shlex (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