Wins Security Information

보안 정보

앞 내용 보기 다음 내용 보기
취약점 정보[CVE-2017-0291] MS PDF Library JPEG2000 OoB Write
작성일 2017-08-18 조회 1527

 

개요


Microsoft Windows의 PDF 라이브러리의 JPEG2000 구성요소에서 Out-of-Bounds write 취약점이 존재한다. 해당 취약점은 JPEG2000 스트림의 유효성 검사를 제대로 하지 못해 발생하는 것으로, 예상치 못한 SIZ marker 조합으로 인해 발생한다. 원격의 공격자는 사용자로 하여금 악의적으로 조작된 JPEG2000 이미지가 포함된 PDF 파일 또는 웹 페이지를 열어보도록 유도하여 공격 할 수 있다.
 
이에 윈스에서는 해당 공격에 대한 내용을 분석하고 이에 따른 대응 방안을 제공한다.

 
 

확인 내역


▶CVE-ID
CVE-2017-0291
 
▶취약점 종류
Index Boundary Error
 
▶CVSS Score
6.8(AV:N/AC:M/Au:N/C:P/I:P/A:P)
 
▶영향 받는 버전
Microsoft Windows 8.1
Microsoft Windows 10
Microsoft Windows RT 8.1
Microsoft Windows Server 2012 R2
Microsoft Windows Server 2012
Microsfot Windows Server 2016
 
▶취약 함수
Windows_Data_Pdf!CCodeStreamDecoder::Decode
 
 
해당 취약점 발생 원인은 tile-part 헤더 내에 예상치 못한 SIZ marker와 tile-part 조합으로 인해 발생한다. Contiguous Codestream box를 처리하는 동안, JPEG2000 구성 요소는 먼저 main header에서 첫 번째 SIZ marker를 파싱한다. JPXMetadata 객체에 있는 모든 필드 값(Xsize 필드, XOsiz 필드 등)을 추출하여 저장하고 이를 headerJPXMD라고 한다.
 
여기에서 Contiguous Codestream box를 이해하기 위해선 다음의 JP2 파일의 box 구성을 살펴봐야 한다. 
 

[그림1] JP2 파일에 있는 box
 
 
위 그림에서 Contiguous Codestream box 정보를 확인 할 수 있다. 각 box들은 다음과 같은 구조로 구성된다.
 
[그림2] box 구조
 
즉, Contiguous Codestream box에는 위 [그림2]와 같은 구조로 구성되어 있으며, 여기에서 DBox는 이미지 디코딩에 필요한 모든 정보를 포함하는 바이트 배열로, 해당 필드는 main header와 실제 이미지 데이터를 포함한 tile-part 순서로 구성되어 있으며 end-of-codestream(EOC) marker로 마무리 되는 구조를 가지고 있다.(참고 [그림3])
 

[그림3] DBox 필드
 
여기에서 main header는 marker 세그먼트 순서로, codestream의 일반적인 속성과 개별 tile-part 속성을 나타낸다.  main header의 첫번째 marker는 반드시 SOC marker여야 하며, 두번째는 SIZ marker여야 한다. 
 
[그림4] main header 구성
 
main header 뒤에는 tile-part로 구성되어 있으며, tile-part는 tile-header와 tile-part data로 구성된다. tile-part header는 SOT marker로 시작하고, SOD marker로 끝나는 순서로 구성된다.
 
[그림5] tile-part 구성
 
 
main header에서 첫 번째 SIZ marker 파싱 후, tile-part 부분 파싱을 시작 하게 된다. 이때, 예상치 못한 SIZ marker가 tile-part header에서 발견되면, SIZ marker의 필드 값이 추출 되어 다른 JPXMetadata 객체에 저장하며 이를 tileJPXMD라 한다. headerJPXMD에 존재하는 값은 tileJPXMD과 동일한 값으로 덮어쓰이게 되며, 그 결과 동기화가 진행된다.
 
그러나, tile-part 다음에 예기치 않는 SIZ marker를 마치 main header에 있는 것처럼 일반 SIZ marker로 파싱되게 도면 그 결과, headerJPXMD의 데이터는 이 SIZ marker의 필드 값으로 업데이트 되지만 tileJPXMD는 업데이트 되지 않으므로 두개의 JPXMetadata 객체는 동기화가 이루어지지 않게 된다. 이로 인해 취약점이 발생하게 되는 것이다.
 
위에서 살펴 본 것과 같이, 악의적으로 조작된 JPEG 파일을 파싱 시, Contiguous Codestream box의 모든 marker를 파싱하게 된다. 모든 marker가 파싱 된 후, CCodeStreamDecoder::Decode 함수가 호출되어 파싱된 모든 marker들을 처리하며, 모든 marker들을 처리 하는 동안 힙 기반 버퍼인 dstBuf가 할당되고 처리 된 이미지 데이터를 해당 버퍼에 저장하게 된다. 이때, 다음의 2가지 문제로 인해 Out-of-Bounds write이 발생하게 된다. 
 
1. 버퍼 경계 유효성 검사 부족
2. headerJPXMD와 tileJPXMD 사이의 비동기 데이터
 
 
 
 
 
 

대응방안


아래 URL을 참고하여 최신의 버전으로 업데이트 한다.

https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2017-0291

 

 

 

참고

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0291

http://www.securityfocus.com/bid/98835

첨부파일 첨부파일이 없습니다.
태그 CVE-2017-0291  Out-of-Bounds Write