
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 파일은 수신된 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