Ghostscript 취약점 CVE-2026-39919: PDF 하나가 서버를 장악할 수 있는 원리와 실제로 위험한 사람은 누구인가

서버실 책상 위에서 하얀 천을 뒤집어쓰고 작은 유령으로 변장한 새끼 고양이와 천 끝을 들어 올리는 여성

Ghostscript를 직접 설치해 본 사람은 거의 없고, 자신이 그것을 쓰고 있다는 사실을 아는 사람도 드뭅니다. 그런데도 이 프로그램은 수많은 서버의 뒤편에서 돌아가고 있습니다. WordPress, 문서 관리 시스템, 메일 게이트웨이, 그리고 ‘온라인으로 PDF 압축하기’ 같은 서비스에서 업로드된 PDF를 썸네일로 바꾸는 것이 바로 이 프로그램입니다. 2026년 9월, 조작된 PDF 하나로 그 파일을 처리하는 컴퓨터에서 외부 코드가 실행될 수 있는 취약점이 이 프로그램에서 수정되었습니다.

아래에서는 확실히 알려진 것과 알려지지 않은 것, 내 서버를 점검하는 방법, 그리고 문서를 인터넷에 올려 처리하는 모든 사람에게 이 일이 갖는 의미를 정리했습니다.

요약

  • 취약점: CVE-2026-39919. Ghostscript의 JPEG 2000 이미지 처리에서 발생하는 힙 버퍼 오버플로입니다. 특별히 준비한 이미지가 들어 있는 PDF 하나면 충분합니다.
  • 영향받는 버전: 발견자에 따르면 9.21부터 10.07.1까지입니다(CVE 기록에는 대략 ‘10.08.0 이전’으로 되어 있습니다).
  • 수정: 2026년 9월 8일에 배포된 Ghostscript 10.08.0. 리눅스 배포판은 수정 사항을 예전 버전 번호에 백포트하므로, 중요한 것은 gs --version이 보여 주는 번호가 아니라 패키지의 전체 리비전입니다.
  • 심각도: CVE 기록 기준 CVSS 3.1 9.8점, Red Hat 기준 7.8점(‘Moderate’). 두 숫자 모두 정직합니다. 서로 다른 시나리오를 설명할 뿐입니다.
  • 실제 공격: 지금까지 확인된 사례는 없습니다. 작동한 익스플로잇은 연구실에서 만들어졌고 특정 빌드에 맞춰져 있었습니다.
  • -dSAFER로는 막을 수 없습니다. 샌드박스를 켜 두어도 결함이 발생합니다.

무슨 일이 있었나

이 취약점은 WordPress 보안을 전문으로 하는 Wordfence가 AI 기반 테스트 시스템 Argus로 찾아냈습니다. 2026년 8월 23일, WordPress 7.1 보안 점검 도중이었습니다. 이 도구는 업로드된 파일을, 그것을 받아들인 PHP 코드 너머까지 추적했습니다. Imagick 확장을 거쳐, ImageMagick을 거쳐, 맨 아래의 Ghostscript와 JPEG 2000 디코더까지 말입니다.

Ghostscript를 개발하는 Artifex는 다음 날 제보를 확인했고, 9월 8일 수정이 담긴 10.08.0 버전을 배포했습니다. CVE 기록은 9월 15일에 공개되었습니다. Wordfence는 10월 12일에 기술적 세부 사항을 공개했고, 하루 뒤 BleepingComputer를 비롯한 업계 매체가 이를 보도했습니다.

결함의 원리

이해하는 데 C 언어 지식은 필요 없습니다. 이미지는 샘플로 이루어진 격자입니다. JPEG 2000에서는 이미지의 각 성분(예를 들어 밝기와 투명도)이 서로 다른 해상도를 가질 수 있고, 샘플 하나가 8비트보다 적은 공간을 차지할 수도 있습니다. 2비트 샘플이라면 1바이트에 4개가 들어갑니다.

연구자들이 설명한 예에서 이미지의 한 줄에는 이런 샘플이 1,024개 있습니다. 압축해 담으면 256바이트이고, Ghostscript도 정확히 256바이트를 확보합니다. 그런데 위의 두 조건이 동시에 맞아떨어지면, 줄을 채우는 반복문이 1바이트에 4개씩 담는 대신 샘플마다 1바이트를 통째로 씁니다. 256바이트 버퍼에 1,024바이트가 들어가는 셈입니다. 줄마다 넘친 768바이트는 Ghostscript가 자체 관리 데이터를 보관하는 메모리를 덮어씁니다. 게다가 이 바이트들은 이미지에서 나오므로, 그 내용은 파일을 만든 사람이 고릅니다.

오래된 우체국의 나무 우편함 칸마다 새끼 고양이가 들어 있고, 줄 끝에서는 새끼 고양이들이 바닥으로 쏟아져 나온다

이것이 ‘프로그램이 멈췄다’에서 ‘프로그램이 공격자가 원하는 대로 움직였다’로 가는 전형적인 경로입니다. 최신 시스템은 메모리 배치 무작위화 같은 보호 장치로 이 길을 훨씬 험하게 만들지만, 완전히 막지는 못합니다.

WordPress에서 PDF가 Ghostscript에 닿는 과정

WordPress는 PDF 미리 보기를 직접 그리지 않습니다. 4.7 버전부터 업로드된 문서의 첫 페이지 이미지를 만들 수 있게 되었는데, 이는 다른 프로그램의 손을 빌려서 하는 일입니다. 흐름은 다음과 같습니다.

WordPress → PHP 확장 Imagick → ImageMagick → Ghostscript

Ghostscript는 별도의 프로세스로, 보통 웹 서버와 같은 계정으로 실행됩니다. 무언가가 PDF의 이미지를 요청할 때만 시작됩니다. 파일을 디스크에 저장하기만 하고 다른 일은 하지 않는 양식은 Ghostscript를 절대 실행하지 않습니다.

이 경로로 공격하려면 네 가지 조건이 모두 동시에 충족되어야 합니다.

  1. 외부의 누군가가(익명으로 또는 권한이 낮은 계정으로) PDF를 업로드할 수 있다.
  2. 사이트가 그 파일의 미리 보기나 썸네일을 요청한다.
  3. 서버에 이를 위해 Ghostscript를 호출하는 Imagick 같은 도구가 있고, ImageMagick 정책이 PDF 읽기를 허용한다.
  4. 설치된 Ghostscript에 수정이 적용되어 있지 않다.

중요한 단서가 있습니다. 기본 상태의 WordPress는 익명 방문자가 미디어 라이브러리에 파일을 올리도록 허용하지 않습니다. 공격자에게는 그 길을 열어 주는 플러그인, 첨부 파일 필드가 있는 양식, 또는 계정이 필요합니다. Wordfence는 WordPress 공식 Docker 이미지도 살펴봤습니다. 거기에는 취약한 Ghostscript 10.05.1, Imagick 확장, 그리고 작동하는 PDF 미리 보기 경로가 모두 있었습니다. 그래도 이미지 하나만으로는 익명 공격에 충분하지 않았습니다.

공격자에게 유리한 세부 사항이 하나 있습니다. 미리 보기 생성의 첫 시도가 실패하면 WordPress는 설정을 바꿔 자동으로 한 번 더 시도합니다. 따라서 악성 첨부 파일 3개는 Ghostscript 실행 6번을 뜻합니다. Wordfence의 테스트에서 양식은 계속 ‘업로드 성공’이라고 표시했고, 그동안 Ghostscript는 백그라운드에서 조용히 멈추고 있었습니다.

이것은 WordPress나 양식 플러그인의 결함이 아닙니다. 그것들은 파일이 Ghostscript에 도달하는 통로였을 뿐입니다.

실제로 얼마나 위험한가

여기서 잠시 멈춰 볼 필요가 있습니다. ‘PDF 하나로 서버가 장악된다’ 같은 헤드라인은 진실의 절반만 말하기 때문입니다.

점수가 두 개인 이유. CVE 기록은 10점 만점에 9.8점(CVSS 3.1)과 9.3점(CVSS 4.0)을 매깁니다. 이 숫자들은 최악의 경우, 즉 네트워크에서 접근할 수 있고 로그인이나 사람의 개입 없이 PDF를 받아들이는 애플리케이션을 전제로 합니다. Red Hat은 같은 취약점을 7.8점으로 평가하고 ‘Moderate’라고 부르는데, 사용자가 자기 컴퓨터에서 악성 파일을 여는 시나리오를 채점하기 때문입니다. 어느 쪽도 틀리지 않았습니다. 서로 다른 질문에 답하고 있을 뿐입니다.

몇 번 시도해 몇 번 성공했나. Wordfence는 연구실 빌드용으로 작동하는 익스플로잇 두 개를 만든 뒤, 다른 열 개 환경에서 10,240번 실행했습니다. Debian, Ubuntu, Fedora, AlmaLinux, Alpine, 그리고 WordPress 공식 컨테이너였습니다. 단 한 번도 성공하지 못했습니다. 반면 원래 대상이었던 빌드에서는 글꼴, 언어 설정, 핵심 시스템 라이브러리 하나를 바꾼 뒤에도 매번은 아니지만 계속 작동했습니다.

결론에는 두 가지 면이 있습니다. 세상의 모든 서버를 여는 단 하나의 파일은 없습니다. 하지만 특정 회사, 또는 수백 개의 사이트가 똑같은 시스템 이미지 위에서 돌아가는 호스팅을 노리는 공격자에게 만능 파일은 필요하지 않습니다. 연구자들은 libheif 라이브러리와 관련된 비슷한 사례에서 다른 팀이 AI의 도움을 받아 새 표적마다 하루이틀 만에 익스플로잇을 맞춰 냈다고 지적합니다.

어떤 권한으로 실행되나. 공격자의 코드는 PDF를 처리하는 계정, 보통 웹 서버 계정으로 실행됩니다. 자동으로 root가 되는 것은 아니지만, 이 계정은 대개 사이트 파일을 읽을 수 있고, 여기에는 데이터베이스 비밀번호가 담긴 설정 파일도 포함됩니다.

실제 공격: 이 글을 쓰는 시점까지 연구실 밖에서 이 취약점이 악용되었다는 보고는 없습니다.

내 서버 점검하는 법

노트북 앞에 앉은 안경 쓴 여성과, 그 옆에서 화면을 뚫어지게 바라보는 줄무늬 새끼 고양이. 책상 위에는 돋보기가 놓여 있다

셸에 접근할 수 있다면 세 가지 질문부터 시작하세요.

1. 여기에 Ghostscript가 있는가, 패키지 리비전은 무엇인가?

  • Debian과 Ubuntu: dpkg -s ghostscript | grep Version
  • Fedora, RHEL, AlmaLinux: rpm -q ghostscript
  • 참고로: gs --version. 다만 이 번호만으로는 아무것도 판단할 수 없습니다.

왜 번호만으로는 부족할까요? Ubuntu 22.04는 9.55.0~dfsg1-0ubuntu5.14 패키지에서 이 취약점을 고쳤는데, 이 패키지는 버전을 물으면 여전히 ‘9.55.0’이라고 답합니다. Debian 13은 10.05.1~dfsg-1+deb13u2에 수정이 들어 있습니다(보안 권고 DSA-6516-1). Red Hat은 10월 1일부터 6일 사이에 RHEL 10, 9, 8용 수정을 배포했습니다. Debian 추적 시스템에 따르면 Debian 12(bookworm)는 아직 취약한 것으로 표시되어 있습니다. 항상 사용 중인 배포판의 보안 권고와 대조하세요.

반대 방향의 함정도 있습니다. 10.08.0 릴리스 후보(RC)는 스스로를 10.08.0이라고 소개하지만 수정이 들어 있지 않습니다. Wordfence의 테스트 머신에서 돌던 것이 바로 이 버전이었습니다. Ghostscript를 소스에서 직접 빌드했다면 최종 릴리스인지 확인하세요.

2. PHP에 Imagick이 있는가? php -m | grep -i imagick. WordPress 관리 화면에서는 도구 → 사이트 건강 → 정보 → 미디어 처리입니다. 이것은 출발점일 뿐입니다. Imagick이 PDF를 인식하는지는 알 수 있지만, Ghostscript가 패치되었는지는 알려 주지 않습니다.

3. ImageMagick이 PDF를 읽을 수 있는가? convert -list format | grep -i pdf(ImageMagick 7에서는 magick -list format). PDF 옆에 rw가 보이면 Ghostscript로 가는 길이 열려 있다는 뜻입니다.

컨테이너: 재시작으로는 부족합니다. 업데이트된 베이스 이미지를 받아 캐시된 레이어 없이 다시 빌드하고 다시 배포하세요.

공유 호스팅: 대개 직접 확인할 수 없습니다. 호스팅 업체에 두 가지를 물어보세요. 서버의 Ghostscript 패키지에 CVE-2026-39919 수정이 포함되어 있는지, 그리고 고객이 올린 PDF가 시스템 어딘가에서 미리 보기로 변환되는지.

당장 업데이트할 수 없다면

  • 익명 방문자와 권한이 낮은 계정으로부터 PDF를 받지 마세요. 서버에 닿지 않는 파일은 Ghostscript에도 닿지 않습니다.
  • ImageMagick 정책에서 PDF 읽기를 끄세요. policy.xml 파일(보통 /etc/ImageMagick-6/ 또는 /etc/ImageMagick-7/에 있습니다)의 <policymap> 섹션에 <policy domain="coder" rights="none" pattern="{PS,PS2,PS3,EPS,PDF,XPS}" /> 줄을 추가합니다. 부작용으로 WordPress가 PDF 썸네일을 더 이상 만들지 않습니다.
  • 한 번에 보낼 수 있는 파일 수와 업로드 빈도를 제한하세요. 공격자가 얻는 시도 횟수는 줄지만, 아무것도 고쳐지지는 않습니다.
  • 문서 변환을 격리하세요. 사이트의 비밀 정보에 접근할 수 없고 불필요한 네트워크 연결도 없는 별도 서비스에서 실행합니다. 피해를 제한할 수 있지만, 이것 역시 수정은 아닙니다.

하지 말아야 할 것: -dSAFER를 방어책으로 여기지 마세요. Ghostscript의 샌드박스는 문서가 문서화된 PostScript 기능으로 할 수 있는 일을 제한할 뿐입니다. 메모리 손상은 막지 못하며, 테스트에서도 샌드박스를 켠 상태에서 결함이 발생했습니다. 어떤 WordPress 플러그인도 이를 고칠 수 없습니다. Ghostscript는 WordPress가 아니라 운영체제나 컨테이너 이미지에서 오기 때문입니다.

이 취약점을 CVE-2026-65640과 혼동하지 마세요. 그것은 다른 문제로, PostScript 파일 업로드를 통한 WordPress 원격 코드 실행입니다. 마찬가지로 Imagick과 Ghostscript를 거치지만, 파일 업로드 권한이 있는 계정(보통 글쓴이 역할 이상)이 필요합니다. WordPress 7.0.4에서 수정되었고, 4.7 브랜치까지 백포트되었습니다.

WordPress만의 문제가 아니다

WordPress는 낯선 사람의 PDF가 Ghostscript에 닿는 수많은 경로 가운데 하나일 뿐입니다. 문서 관리 시스템, 프린트 서버, 청구서 처리, 미리 보기 생성기, 첨부 파일을 검사하는 메일 게이트웨이, 파일 변환 API도 마찬가지입니다. 질문은 언제나 같습니다. 이 소프트웨어가 다른 사람에게서 온 PDF를 렌더링하는가?

내 애플리케이션 코드에서 ‘Ghostscript’라는 단어를 검색해도 아무것도 나오지 않을 수 있습니다. 대개 중간에 ImageMagick이나 다른 라이브러리가 있고, Ghostscript를 호출하는 것은 그쪽이기 때문입니다.

PDF를 인터넷에 올릴 때 이것이 뜻하는 것

이 이야기에는 덜 알려진 다른 면도 있습니다. 브라우저에서 쓰는 ‘PDF 압축’, ‘PDF를 이미지로’, ‘PDF 합치기’ 서비스는 바로 위에서 말한 종류의 서버입니다. 모르는 사람들에게서 파일을 받아, 그것을 분해하고 다시 조립하는 도구에 통과시킵니다. 내 문서가 무엇으로, 어떤 버전으로 처리되는지, 9월 8일 이후에 업데이트가 되었는지 우리는 알 수 없습니다. 다만 내 파일이 적어도 한동안은 수천 명의 다른 사람 파일과 같은 컴퓨터에 놓이고, 그중 일부는 조작된 파일일 수 있다는 것만은 압니다.

그렇다고 모든 온라인 서비스가 허술하다는 뜻은 아닙니다. 계약서, 신분증 스캔본, 검사 결과를 올릴 때, 보안을 확인할 길이 없는 곳에 맡기는 셈이라는 뜻입니다. 자세한 내용은 온라인 변환 중 내 데이터에 무슨 일이 일어나는지를 다룬 글에서 볼 수 있습니다.

공정하게 말하자면, 로컬 처리도 본질적으로 안전한 것은 아닙니다. 직접 Ghostscript로 PDF를 압축하고 있다면 10.08.0 이상으로 업데이트하세요. 오프라인 작업의 장점은 다른 데 있습니다. 문서가 내 컴퓨터를 떠나지 않고, 그것을 처리할 소프트웨어 버전을 만나 본 적도 없는 누군가가 아니라 내가 정한다는 점입니다.

PDF를 자주 합치고, 나누고, 암호화하거나 Word로 변환한다면 어디에도 올리지 않고 할 수 있습니다. PDF Manipulator는 무료이고 Windows와 Linux에서 작동하며, 모든 파일이 내 컴퓨터에 그대로 남습니다.

출처

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤