[하루한줄] CVE-2021-30354/30355: 아마존 e-book Kindle의 원격코드실행/권한상승 취약점

URL

Do you like to read? I can take over your Kindle with an e-book

Target

  • Amazon Kindle

Explain

Amazon e-book 플랫폼인 킨들(Kindle)에서 원격 코드 실행(CVE-2021-30354) 및 권한상승 취약점(CVE-2021-30355)이 발견되었습니다.

CVE-2021-30354

취약점은 pdfreader 프로세스의 libfpdfemb.so 라이브러리에서 발생합니다. image header 영역을 아래 사진과 같이 수정하면 라이브러리의 PDF 파싱 함수인 Jbig2Module::StartDecode 메서드가 JBIG2Globals 스트림을 디코딩할 때 취약점이 트리거 됩니다.

이미지 정보 영역(첫 0x23 bytes)

이미지의 width = 0x80, height = 0x1, stride = 0x10입니다. stride 값은 ((width + 0x1F) >> 5) << 2로 계산됩니다.

refinement 영역(0x23 ~ 0x4D bytes)

이 영역에는 이미지를 다듬기 위해 jbig2로 인코딩 된 정보가 포함되어 있습니다. 이미지의 일부만 다듬을 수 있어 일부 사각형 범위의 좌표가 주어집니다. 위 사진의 경우 매개변수는 다음과 같습니다. width – 0, height – 0x10, x – 0, y – 0x4000000

이때 이미지보다 큰 refinement 영역이 정의되어 디코딩 알고리즘은 이미지를 새 차원으로 확장합니다. 새 이미지의 높이는 height + y(height + y) * stride 로 다시 계산되고 해당 크기의 이미지에 힙 메모리가 할당됩니다. 그러나 새 이미지의 메모리 크기를 계산할 때 INT_MAX에 대한 검사가 없어 32bit 레지스터 Integer overflow가 발생하고 0x400000100 대신 0x100 bytes가 이미지에 할당됩니다.

해커는 이를 악용해 원하는 크기의 refinement 영역을 생성해 힙 메모리를 제어하고 arbitrary write primitive를 얻을 수 있습니다.

CVE-2021-30355

pdfreader 프로세스는 Java 프레임워크 권한이 존재합니다. 프레임워크 유저는 다음 권한을 가집니다.

  • 실행 파일을 생성할 수 있는 /var/tmp/framework 디렉토리에 대한 전체 액세스
  • 기본 앱 실행 정보가 존재하는 /var/local/appreg.db sqlite 데이터베이스에 대한 읽기/쓰기 액세스

appreg.db의 기본 앱 실행 시 실행되는 명령어 항목인 properties 테이블의 command 항목을 다음과 같이 수정합니다.

UPDATE properties SET value='var/tmp/framework/payload.sh' WHERE handlerId = 'com.lab126.browser' and name ='command';

/usr/bin/mesquite → /var/tmp/framework/payload.sh

위와 같이 수정 후 pdfreader에서 브라우저를 열도록 하면 응용 프로그램 관리자는 root 권한으로 브라우저 기본 앱 com.lab126.browser 항목을 읽고 수정된 command를 실행합니다. 따라서 페이로드가 포함된 /var/tmp/framework/payload.sh 을 root 권한으로 실행해 CVE-2021-30354의 유저 프로세스 RCE 권한을 root로 상승시킬 수 있습니다.

위 두 취약점을 악용하면 사용자가 Kindle 앱에서 악성 PDF 문서를 열어보기만 해도 기기의 root 권한으로 임의 코드 실행이 가능하며 기기 정보 및 Amazon 계정, 결제 크리덴셜을 탈취할 수 있습니다.