제퍼넷 로고

Ghostscript 버그로 인해 악성 문서가 시스템 명령을 실행할 수 있음

시간

선생의 말을 듣지 못하더라도 고스트 스크립트 프로젝트, 당신은 잘 알지 못하고 그것을 사용했을 것입니다.

또는 BSD 또는 Linux 배포판, Mac의 Homebrew 또는 Windows의 Chocolatey와 같은 패키지 기반 소프트웨어 서비스를 사용하는 경우 제공하는 클라우드 서비스에 구워 놓거나 미리 설치하여 사용할 수 있습니다.

Ghostscript는 Adobe의 널리 사용되는 PostScript 문서 작성 시스템과 훨씬 더 널리 사용되는 PDF 파일 형식의 무료 오픈 소스 구현입니다. 휴대용 문서 형식 (Portable Document Format). (내부적으로 PDF 파일은 PostScript 코드를 사용하여 문서 작성 방법을 정의합니다.)

예를 들어 인기 있는 오픈 소스 그래픽 프로그램인 Inkscape는 뒤에서 Ghostscript를 사용하여 EPS를 가져옵니다(임베디드 포스트스크립트) 이미지 라이브러리에서 다운로드하거나 디자인 회사에서 받을 수 있는 벡터 그래픽 파일.

대충 설명하면 Ghostscript는 문서의 페이지 구성 방법을 설명하는 PostScript(또는 EPS 또는 PDF) 프로그램 코드를 읽고 이를 변환하거나 렌더링 원시 픽셀 데이터 또는 PNG 그래픽 파일과 같이 표시 또는 인쇄에 더 적합한 형식으로 변환합니다(전문 용어 사용).

안타깝게도 Ghostscript의 최신 릴리스까지는 현재 버전입니다. 10.01.2, 제품에 버그가 있었습니다. CVE-2023-36664, 악성 문서가 텍스트 및 그래픽 페이지를 생성할 수 있을 뿐만 아니라 시스템 명령을 Ghostscript 렌더링 엔진으로 보내고 소프트웨어를 속여 실행하도록 할 수 있습니다.

파이프 및 파이프라인

문제는 Ghostscript가 출력용 파일 이름을 처리하여 전문 용어로 알려진 것으로 출력을 보낼 수 있게 했기 때문에 발생했습니다. 파이프 일반 파일이 아닌

프로그래밍이나 스크립트 작성을 해본 적이 있다면 알 수 있듯이 파이프는 파일인 것처럼 가장하는 시스템 개체입니다. 즉, 일반 시스템을 사용하여 디스크에 쓰거나 데이터를 읽을 수 있습니다. 다음과 같은 기능 read()write() 유닉스 계열 시스템에서, 또는 ReadFile()WriteFile() 윈도우에서…

...하지만 데이터는 실제로 디스크에 저장되지 않습니다.

대신 파이프의 "쓰기" 끝은 출력 데이터를 임시 메모리 블록으로 옮기고 "읽기" 끝은 마치 영구적인 메모리 블록에서 가져온 것처럼 이미 메모리 파이프라인에 있는 모든 데이터를 빨아들입니다. 디스크에 있는 파일.

이것은 한 프로그램에서 다른 프로그램으로 데이터를 보내는 데 매우 유용합니다.

프로그램에서 출력을 받고 싶을 때 ONE.EXE 에 대한 입력으로 사용 TWO.EXE, 먼저 출력을 임시 파일에 저장한 다음 다음을 사용하여 다시 읽을 필요가 없습니다. >< 다음과 같은 파일 리디렉션용 문자:

 C:Usersduck> ONE.EXE > TEMP.DAT C:Usersduck> TWO.EXE < TEMP.DAT

이 접근 방식에는 다음을 포함하여 몇 가지 번거로움이 있습니다.

  • 첫 번째 명령이 완료될 때까지 기다려야 합니다. 을 닫고 TEMP.DAT 두 번째 명령이 파일 읽기를 시작하기 전에 파일.
  • 거대한 중간 파일로 끝날 수 있습니다. 원하는 것보다 더 많은 디스크 공간을 차지합니다.
  • 엉망이 될 수 있습니다. 다른 사람이 첫 번째 프로그램 종료와 두 번째 프로그램 시작 사이에 임시 파일을 가지고 노는 경우.
  • 임시 파일 이름이 충돌하지 않도록 해야 합니다. 유지하려는 기존 파일로.
  • 나중에 정리할 임시 파일이 남습니다. 잊어버리면 데이터가 유출될 수 있습니다.

파이프 형태의 메모리 기반 중간 "의사 파일"을 사용하면 이러한 종류의 프로세스 체인을 다음과 같이 압축할 수 있습니다.

 C:Usersduck> ONE.EXE | 투.EXE

이 표기법에서 이름이 어디에 있는지 확인할 수 있습니다. 파이프관로 에서 오는 이유와 수직 막대 기호(|) 파이프라인(Unix 및 Windows 모두에서)을 나타내기 위해 선택된 것은 IT 세계에서 더 일반적으로 파이프 캐릭터.

실제로 운영 체제 수준에서 파이프인 파일은 거의 항상 두 프로세스 간의 통신에 사용되기 때문에 해당 매직 파이프 문자 뒤에는 일반적으로 나중에 사용하기 위해 쓸 파일 이름이 아니라 출력을 즉시 사용할 명령의 이름입니다.

즉, 원격으로 제공되는 콘텐츠가 출력에 사용할 파일 이름을 지정하도록 허용하는 경우 해당 파일 이름이 다음과 같은 특수 형식을 갖도록 허용하는지 주의해야 합니다. “파일에 쓰지 마십시오. 실행할 명령을 지정하는 파일 이름을 사용하여 대신 파이프라인을 시작하십시오.”

기능이 버그로 바뀔 때

분명히 Ghostscript에는 다음으로 시작하는 특수 형식의 파일 이름으로 출력을 보내고 싶다고 말할 수 있는 "기능"이 있었습니다. %pipe% 또는 단순히 |, 따라서 피해자의 컴퓨터에서 선택한 명령을 몰래 시작할 수 있는 기회를 제공합니다.

(우리는 이것을 시도하지는 않았지만 실행할 명령 이름뿐만 아니라 명령줄 옵션도 추가할 수 있다고 추측하고 있습니다. 따라서 다른 쪽 끝에서 어떤 종류의 악의적인 동작을 유발할 것인지에 대해 더 세밀한 제어가 가능합니다. )

재미있게도 그 말이 맞다면 이 버그를 수정하는 과정에서 "때때로 패치가 필요하다"는 문제가 다시 불거졌다.

WordPress 플러그인 결함에 대한 어제 기사에서 우리는 기술 된 버그가 있는 플러그인(Ultimate Member) 제작자가 권한 에스컬레이션 버그를 없애기 위해 최근에 XNUMX개의 패치를 신속하게 진행한 방법:

우리는 최근 파일 공유 소프트웨어인 MOVEit의 출시에 대해서도 썼습니다. 세 개의 패치 랜섬웨어 사기꾼의 손에 처음으로 제로데이로 나타난 명령 주입 취약점을 신속하게 처리합니다.

이 경우 Ghostscript 팀은 먼저 확인을 추가했습니다. 이 같은, 위험한 텍스트의 존재를 감지하기 위해 %pipe... 파일 이름의 시작 부분:

/* "%pipe%"는 경로 정의에 대한 일반 규칙을 따르지 않으므로 예상치 못한 결과를 피하기 위해 "축소"하지 않습니다. */ if (len > 5 && memcmp(path, "%pipe", 5) ! = 0) { . . . 

그런 다음 프로그래머는 자신의 코드가 일반 | 문자와 접두사 %pipe%, 그래서 두 경우 모두를 처리하도록 코드가 업데이트되었습니다.

여기에서 변수 경로가 다음으로 시작하지 않는지 확인하는 대신 %pipe... 파일 이름이 "안전"하다는 것을 감지하기 위해 파이프 문자(|) 또는 두려운 텍스트 %pipe...:

/* "%pipe%"는 경로 정의에 대한 일반 규칙을 따르지 않으므로 예상치 못한 결과를 피하기 위해 "축소"하지 않습니다. */ if (path[0] == '|' || (len > 5 && memcmp(경로, "%파이프", 5) == 0)) { . . .

무엇을해야 하는가?

  • Unix 또는 Linux 배포판에서 관리하는 독립 실행형 Ghostcript 패키지가 있는 경우 (또는 위에서 언급한 macOS의 Homebrew와 같은 유사한 패키지 관리자를 통해) 최신 버전을 가지고 있는지 확인하십시오.
  • 번들 버전의 Ghostscript와 함께 제공되는 소프트웨어가 있는 경우, Ghostscript 구성 요소 업그레이드에 대한 자세한 내용은 공급자에게 문의하십시오.
  • 당신이 프로그래머라면 당장 눈에 띄는 버그 수정을 취약점 제거 작업의 시작과 끝으로 받아들이지 마십시오. Ghostscript 팀이 했던 것처럼 스스로에게 물어보십시오. "다른 곳에서 유사한 종류의 코딩 실수가 발생했을 수 있으며, 우리가 이미 알고 있는 버그를 유발하는 데 사용할 수 있는 다른 트릭은 무엇입니까?"

spot_img

최신 인텔리전스

spot_img