[하루한줄] CVE-2021-30860: Pegasus 스파이웨어에서 악용된 iOS FORCEDENTRY 취약점

URL

Analyzing The ForcedEntry Zero-Click iPhone Exploit Used By Pegasus

Target

  • iOS < 14.8

Explain

NSO Group이 개발한 스파이웨어인 Pegasus에 의해 악용되어 온 것으로 알려진 FORCEDENTRY라는 이름의 zero-click iOS 취약점에 대한 세부 정보가 공개되었습니다.

취약점은 iMessage 애플리케이션이 수신한 메시지에 첨부된 PDF 파일을 파싱하는 과정에서 발생합니다. 아래는 JBIG2로 인코딩 된 데이터를 디코딩하기 위해 iOS의 CoreGraphics 라이브러리에서 호출하는JBIG2Stream::readTextRegionSeg 함수의 일부 코드입니다.

1:	unsigned int numSyms = 0;
2:	for(i = 0; i < nRefSegs; ++i){
3:		if((seg = findSegment(refSegs[i]))) {
4:			if(seg->getType() == jbig2SegSymbolDict) {
5:				numSyms += ((JBIG2SymbolDict *)seg)->getSize();  //integer overflow
6:			} else if(seg->getType() == jbig2SegCodeTable) {
7:				codeTables->append(seg);
8:			}
9:		} else {
10:			error(getPos(), "Invalid segment referencein JBIG2 text region");
11:			delete codeTables;
12:			return;
13:		}
14:	}

line 5에서 numSyms의 type과 seg→getSize()의 return type은 모두 unsigned int입니다. seg의 크기가 충분히 큰 경우 루프를 수행하며 seg→getSize()numSyms에 누적하는 동안 numSyms에서 integer overflow가 발생합니다.

syms = (JBIG2Bitmap **)gmallocn(numSyms, sizeof(JBIG2Bitmap *)); // size of JBIG2Bitmap = 8

이후 gmallocn 함수로 numSyms * 8만큼의 syms 힙을 할당한 뒤 비트맵의 값으로 syms를 채우는데, integer overflow로 인해 비트맵의 크기보다 작은 힙이 할당되고 out-of-bounds write가 가능합니다.

해당 취약점은 해커가 타겟 아이폰에 악성 첨부 파일을 포함한 메시지를 보내기만 하면 타겟의 상호작용 없이 공격이 가능한 zero-click exploit이며 이를 악용한 스파이웨어 Pegasus는 지난 2월부터 각국의 정부 기관에 공급되어 주요 인사 사찰에 쓰인 것으로 알려졌습니다.