
Linux Mint 18.3-19.1 yelp URI हैंडलर में कमांड इंजेक्शन भेद्यता के लिए PoC और पैच। मूल कारण, शोषण, और शमन को प्रदर्शित करता है।
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 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 लाइब्रेरी (https://docs.python.org/3/library/shlex.html#shlex.quote) से quote() विधि का उपयोग करता है।
या तो yelp को पैच करें या उसे हटा दें।
sudo apt install patchsudo patch /usr/local/bin/yelp yelp.patchsudo rm /usr/share/applications/yelp.desktopsudo rm /usr/local/bin/yelp