Ghostscript SAFER 샌드박스 우회 취약점을 분석하는 방법

WBOY
풀어 주다: 2023-05-18 19:10:39
앞으로
1427명이 탐색했습니다.

머리말

Ghostscript는 Adobe PostScript 언어를 해석하는 데 사용되는 소프트웨어입니다. PostScript 언어를 사용하여 그림을 그릴 수 있으며 PS와 PDF 간의 변환을 지원합니다. 현재 대부분의 Linux 배포판에 기본적으로 설치되어 있으며 Unix, MacOS, Windows 및 기타 플랫폼으로 이식되었습니다. Ghostscript는 ImagineMagic, Python PIL 및 다양한 PDF 리더와 같은 프로그램에서도 사용됩니다.

취약점 설명

8월 21일 Google 보안 연구원 Tavis Ormandy는 여러 GhostScript 취약점을 공개했습니다. 이미지에 악성 PostScript 스크립트를 구성하면 SAFER 보안 샌드박스를 우회하여 명령 실행, 파일 읽기, 등의 취약점이 발생하는 근본 원인이 됩니다. 파일 삭제는 GhostScript가 복원 명령을 구문 분석할 때 일시적으로 LockSafetyParams 매개 변수를 False로 설정하여 SAFER 모드를 끄는 것입니다.

영향을 받는 시스템 버전

Ghostscript <= 9.23(모든 버전, 모든 플랫폼), 아직 공식 업데이트가 출시되지 않았습니다.

취약점 세부정보

Ghostscript 안전 모드(SAFER 모드)

Ghostscript에는 선택적인 -dSAFER 옵션이 포함되어 있어 안전 샌드박스 모드를 시작하면 파일 관련 연산자가 다음과 같이 금지됩니다.

(1) 파일 삭제 및 파일 이름 바꾸기 연산자를 비활성화하고 파이프 명령(%pipe%cmd)을 열 수 있으며 stdout 및 stderr만 쓰기용으로 열 수 있습니다.

(2) stdin 이외의 파일 읽기 비활성화

( 3 ) 장치의 LockSafetyParams 매개변수를 True로 설정하여 OutputFile 매개변수를 사용하여 파일을 쓰는 것을 방지합니다.

(4) /GenericResourceDir, /FontResourceDir, /SystemParamsPassword 또는 /StartJobPassword가 변경되는 것을 방지합니다.

다음은 이에 대한 간단한 데모입니다. 옵션.

-dSAFER 매개변수가 추가되지 않은 경우 /etc/passwd 파일을 성공적으로 읽습니다.

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

-dSAFER 매개변수가 추가된 후 잘못된 파일 액세스 오류가 발생합니다.

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

취약성 확인

공격자 -dSAFER가 제공하는 보호를 우회하고 제한 없이 명령을 실행하기 위해 여러 PostScript 지시문을 전달할 수 있습니다.

먼저 PoC를 테스트하면(-dSAFER) 모든 셸 명령을 성공적으로 실행할 수 있습니다.

如何进行Ghostscript SAFER沙箱绕过漏洞的分析如何进行Ghostscript SAFER沙箱绕过漏洞的分析

ImageMagick 도구에서 변환 명령을 사용하여 PoC를 테스트할 수 있습니다. 영향을 받음:

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

이 옵션과 관련된 작업을 찾으려면 소스 디렉터리에서 "grep -r dSAFER" 명령을 사용하세요. 이 옵션의 특정 기능을 설명하려면 다음 설명을 참조하세요. LockSafetyParams를 True로 설정하세요.

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

그런 다음 grep을 사용하여 LockSafetyParams와 관련된 작업을 확인합니다. 주석에서 이 부울 유형 변수의 값이 True이면 안전하지 않은 특정 작업을 방지할 수 있음을 알 수 있습니다. 동시에 psi/zdevice2.c 파일의 269번째 줄에서는 변수가 False로 설정되어 있고 여기서만 LockSafetyParams의 값이 False로 수정되어 있으므로 이러한 변경은 구문 분석으로 인해 발생한 것으로 추측할 수 있습니다. PoC의 특정 PostScript 문의 내용입니다.

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

디버그 분석

다음으로 GDB를 사용하여 확인하고, 먼저 프로그램 매개변수를 설정합니다.

set args -q -sDEVICE=ppmraw -dSAFER -sOutputFile=/dev/null
로그인 후 복사

이전 grep 출력에 따르면, Restore_page_device() 함수에서 "dev_old->LockSafetyParams = false;" 문을 찾습니다. , 그리고 여기서 중단하고 프로그램을 실행하고 PoC에 들어갑니다.

이미지 영역 설정 - 법적(a4, b5, 문자 등도 사용 가능):

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

{null 복원} 실행이 중지되면 프로그램이 중지됩니다. {pop} if , 이 위치에서 중지합니다.

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

그런 다음 dev_old->LockSafetyParams 변수에 관찰 지점을 설정하고 프로그램을 계속 실행합니다. 예상대로 여기에서 LockSafetyParams 값이 변경되었습니다.

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

스택 트레이스백을 살펴보면 현재 함수가 "interpret"를 사용하여 일련의 함수에서 호출된 것을 발견했습니다. 이름에서 이러한 함수가 PostScript 문을 구문 분석하는 데 사용된다는 것이 추론됩니다.

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

这里我们在#2处下断,观察到了解释器处理stopped、null、restore等关键字的过程,至此绕过SAFER沙箱过程就逐渐清晰了。

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

漏洞成因

现在让我们来看看{null restore} stopped {pop} if这条语句是如何绕过SAFER沙箱的。

PostScript是一种“逆波兰式”(Reverse Polish Notation,也称为后缀表达式)的语言。简单来说就是操作数在前,操作符在后。PoC中这条语句是一条典型的PostScript异常处理语句,stopped操作符用于PostScript的异常处理,也就是说stopped执行前面的{}中给出的过程,如果解释器在执行该过程期间出现错误,它将终止该过程并执行stopped操作符之后{}中的过程。

null restore会引起类型检查错误(/typecheck error),同时restore的执行导致LockSafetyParams设置为False,stopped捕获到异常,弹出栈顶元素null,GS继续运行,但此时LockSafetyParams的值还没恢复为True。

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

值得一提的是,GhostScript的官方文档中提到了restore操作符存在导致绕过SAFER模式的风险。

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

漏洞利用

OutputFile参数用于设置输出文件名,另外在Linux/Unix上,还可以通过设备%pipe%将输出发送到管道(Windows中也可以,需要使用两个%)。通过管道将输出传输到lpr可以使用以下方式:/OutputFile (%pipe%lpr)

查阅官方文档可知,%pipe%功能由popen函数支持,在调试中也能确认这一点: 

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

popen()函数通过创建管道的方式,调用fork()启动一个子进程,并将传入popen()的命令送到/bin/sh以-c参数执行。可以通过在此处注入命令实现漏洞利用,如下图中演示的那样,另外将PostScript编码到图像中,可以在使用GhostScript的Web服务器上执行任意指令(例如服务器使用ImageMagick处理上传的图像时)。

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

如何进行Ghostscript SAFER沙箱绕过漏洞的分析

修复建议

截至笔者分析该漏洞时,官方还没修复该漏洞。Artifex Software,ImageMagick,Redhat,Ubuntu等厂商已声明受到此漏洞影响,其他平台暂时未对此漏洞进行说明,目前临时解决方案如下:

1. 卸载GhostScript;

2. 可在/etc/ImageMagick/policy.xml文件中添加如下代码来禁用PostScript、EPS、PDF以及XPS解码器:

<policy domain =“coder”rights =“none”pattern =“PS”/>
<policy domain =“coder”rights =“none”pattern =“EPS”/>
<policy domain =“coder”rights =“none”pattern =“PDF”/>
<policy domain =“coder”rights =“none”pattern =“XPS”/>
로그인 후 복사

위 내용은 Ghostscript SAFER 샌드박스 우회 취약점을 분석하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿