CVE-2025-53367 : Djvulibre로 악용 가능한 외부로 쓰기

DJVULIBRE 버전 3.5.29가 오늘 출시되었습니다. CVE-2025-53367 (GHSL-2025-055), OOB (Of-Off-Founds) 쓰기를 수정합니다. MMRDecoder::scanruns 방법. 사용자가 제작 된 문서를 열려고 할 때 Linux 데스크탑 시스템에서 코드 실행을 얻기 위해 취약점을 악용 할 수 있습니다.

DJVU는 PDF와 유사한 목적으로 사용할 수있는 문서 파일 형식입니다. 그것은 많은 Linux 배포판의 기본 문서 뷰어 인 Evince and Papers에서 지원합니다. 실제로, DJVU 파일에 .pdf 확장자가있는 파일 이름이 제공 되더라도 Evine/Papers는 DJVU 문서임을 자동으로 감지하고 DJVULIBRE를 실행하여 해독합니다.

Antonio는 Evince Document Reader를 연구하면서 이러한 취약점을 발견했습니다. 그는 퍼징으로 버그를 발견했다.

Kev는이 비디오에서 시연 된 것처럼 취약점에 대한 개념 증명 악용을 개발했습니다.

https://www.youtube.com/watch?v=32KROHYHYVM

POC는 모든 표준 보안 보호 기능을 갖춘 완전 최신 Ubuntu 25.04 (x86_64)에서 작동합니다. 비디오에서 무슨 일이 일어나고 있는지 설명하기 위해 :

  1. Kev는 그의 악의적 인 DJVU 문서를 클릭합니다 ~/Downloads 예배 규칙서.
  2. 파일의 이름이 있습니다 poc.pdf그러나 실제로는 DJVU 형식입니다.
  3. 기본 문서 뷰어 (/usr/bin/papers) 문서를로드하고 DJVU 형식으로 검출하고 djvulibre를 사용하여 해독합니다.
  4. 파일은 OOB 쓰기 취약점을 악용하고 system("google-chrome https://www.youtube.com/…").
  5. Rick Astley가 나타납니다.

POC가 ASLR을 우회 할 수는 있지만 다소 신뢰할 수 없습니다. 연속으로 10 번 작동 한 다음 갑자기 몇 분 동안 작업을 중단합니다. 그러나 이것은 첫 번째 버전 일 뿐이며 훨씬 더 신뢰할 수있는 악용을 만들 수 있다고 생각합니다.

당신은 궁금 할 것입니다 : 왜 Astley가 계산기가 아닌가? 그 때문입니다 /usr/bin/papers AppArmor 프로필 아래에서 실행됩니다. 이 프로필은 임의의 프로세스를 시작하는 것을 금지하지만 Google-Chrome에 대한 예외를 만듭니다. 따라서 Calc를 팝하는 것보다 YouTube 비디오를 재생하는 것이 더 쉬웠습니다. 그러나 AppArmor 프로파일은 특별히 제한적이지 않습니다. 예를 들어, 정말 명백한 것과 같은 명백한 파일을 제외하고는 사용자의 홈 디렉토리에 임의의 파일을 작성할 수 있습니다. ~/.bashrc. 따라서 결정된 공격자가 코드 실행을 얻지 못하게하지는 않습니다.

그만큼 MMRDecoder::scanruns 방법은 OOB-Write 취약점의 영향을받습니다. xr 포인터는 할당 된 버퍼의 범위 내에 남아 있습니다.

디코딩 프로세스 중에 실행 길이 인코딩 된 데이터는 두 버퍼로 기록됩니다. lineruns 그리고 prevruns:

//libdjvu/MMRDecoder.h
class DJVUAPI MMRDecoder : public GPEnabled
{
...
public:

  unsigned short *lineruns;
...
  unsigned short *prevruns;
...
}

이름이 지정된 변수 pr 그리고 xr 해당 버퍼의 현재 위치를 가리 킵니다.

scanruns 이 포인터가 할당 된 버퍼의 범위 내에 남아 있는지 확인하지 않습니다.

//libdjvu/MMRDecoder.cpp
const unsigned short *
MMRDecoder::scanruns(const unsigned short **endptr)
{
...
  // Swap run buffers
  unsigned short *pr = lineruns;
  unsigned short *xr = prevruns;
  prevruns = pr;
  lineruns = xr;
...
  for(a0=0,rle=0,b1=*pr++;a0 

이로 인해 할당 된 메모리를 넘어 서면 힙 손상 조건이 생길 수 있습니다. 바운드 외부는 함께 읽습니다 pr 같은 이유로도 가능합니다.

Github Security Lab 리포지토리에서 몇 주 시간에 개념 증명 Excloit의 소스 코드를 게시 할 것입니다.

우리는 Léon Bottou와 Bill Riemers에게 엄청나게 신속하게 응답하고 처음 연락 한 후 이틀 미만의 수정을 공개 한 것에 감사드립니다!

작성자가 작성했습니다

케빈 백 하우스

저는 Github Security Lab 팀의 보안 연구원입니다. 취약점을 검색하고 유지 관리자와 협력하여 오픈 소스 소프트웨어를보다 안전하게 만들려고 노력합니다.

안토니오 모랄레스

출처 참조

Post Comment

당신은 놓쳤을 수도 있습니다