
CVE-2017-8291 (GhostButt)에 대한 교육용 PoC로, Python PIL/Pillow EPS 이미지 처리 시 GhostScript 샌드박스 우회를 통한 원격 명령 실행을 시연합니다.
Python PIL (Pillow)는 Python에서 널리 사용되는 이미지 처리 라이브러리입니다. 다양한 이미지 포맷을 지원하며 강력한 이미지 조작 기능을 제공합니다.
Python 이미지 처리 모듈 PIL (Pillow)은 GhostButt 취약점(CVE-2017-8291)의 영향을 받습니다. 이는 내부적으로 EPS 이미지를 처리하기 위해 GhostScript를 호출하기 때문입니다. 이 취약점으로 인해 공격자는 대상 시스템에서 임의의 명령을 실행할 수 있습니다.
PIL이 이미지를 처리할 때, 파일 헤더(매직 바이트)를 기반으로 이미지 유형을 결정합니다. EPS 파일(헤더가 %!PS로 시작)로 식별되면, 해당 파일을 PIL/EpsImagePlugin.py로 전달하여 처리합니다.
이 모듈에서 PIL은 시스템의 GhostScript 명령(gs)을 호출하여 이미지 파일을 처리합니다:
command = ["gs",
"-q", # quiet mode
"-g%dx%d" % size, # set output geometry (pixels)
"-r%fx%f" % res, # set input DPI (dots per inch)
"-dBATCH", # exit after processing
"-dNOPAUSE", # don't pause between pages,
"-dSAFER", # safe mode
"-sDEVICE=ppmraw", # ppm driver
"-sOutputFile=%s" % outfile, # output file
"-c", "%d %d translate" % (-bbox[0], -bbox[1]),
# adjust for image origin
"-f", infile, # input file
]
# Code to check if GhostScript is installed is omitted
try:
with open(os.devnull, 'w+b') as devnull:
subprocess.check_call(command, stdin=devnull, stdout=devnull)
im = Image.open(outfile)
-dSAFER 플래그(안전 모드)가 설정되어 있지만, GhostScript의 샌드박스 우회 취약점(GhostButt CVE-2017-8291)으로 인해 이 안전 메커니즘을 우회하여 임의 명령 실행이 가능합니다.
현재 작성 시점에서도 최신 공식 GhostScript 버전 9.21은 이 취약점에 여전히 영향을 받습니다. 따라서 운영 체제에 GhostScript가 설치되어 있는 한, PIL은 명령 실행에 취약합니다.
참고 자료:
CVE-2017-8291 취약점에 영향을 받는 웹 애플리케이션을 시작하려면 다음 명령을 실행하세요:
docker compose up -d
시작 후, http://your-ip:8000/에 접속하여 업로드 페이지에 접근합니다.
이 애플리케이션의 정상 기능은 사용자가 PNG 파일을 업로드할 수 있도록 하는 것입니다. 백엔드는 PIL을 사용하여 이미지를 로드하고 크기를 출력합니다. 그러나 실행 가능한 EPS 파일의 확장자를 PNG로 변경하여 업로드함으로써 이를 악용할 수 있습니다. 백엔드는 확장자가 아닌 파일 헤더를 기반으로 이미지 유형을 결정하므로 파일 확장자 검사를 우회할 수 있습니다.
예를 들어, poc.png를 업로드하면 서버에서 touch /tmp/aaaaa 명령이 실행됩니다. POC의 명령을 리버스 셸 명령으로 수정하면 서버에 셸 접근 권한을 얻을 수 있습니다:
