[하루한줄] 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 계정, 결제 크리덴셜을 탈취할 수 있습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.