[하루한줄] 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월부터 각국의 정부 기관에 공급되어 주요 인사 사찰에 쓰인 것으로 알려졌습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.