ᄒᆞᆫ글 zero-day 취약점 - myucc.cafe24.commyucc.cafe24.com/pdf/세션2/(2)_아래아한글...

Post on 09-Jan-2020

5 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

한글 Zero-day 취약점 분석

오피스기능강화팀

이동우

Agenda

1. TIFF 필터 취약점 (zero-day)

2. 버퍼 오버플로

3. 정수 오버플로

4. 경계 값 검사 오류

5. TIFF 필터 취약점 코드

6. Hwp 파일 포맷 취약점 (zero-day)

7. Hwp 문단 구조

8. Hwp 컨트롤 취약점

9. Hwp 파일 포맷 취약점 코드

10. 보안 고려 사항

11. Q&A

한글 Zero-day 취약점 분석

TIFF 필터 취약점

TIFF 필터 취약점

HncTiff10.flt

TIFF 필터 취약점

•Tiff 이미지 필터 DLL

•2013년 1월 25일 최초 보고

•스택을 덮어 쓰는 오류 발견

•버퍼 오버플로, 정수 오버플로, 경계 값 검사 오류로 예상

버퍼 오버플로 또는 버퍼 오버런

일반적인 공격 방법

버퍼 오버플로

•할당된 데이터 구조의 경계를 넘어서 데이터가 덮어 씌어지는 현상

•스택 프레임 복귀 주소 변조

strcpy

char* strcpy(char* dest, const char* str)

{

char* pdest = dest;

while (*str) { // NULL까지 복사

*dest++ = *str++;

}

*dest = '\0';

return pdest;

}

char sour[] = "0123456789"; char dest[5]; strcpy(dest, sour);

버퍼 오버플로

보안 함수 errno_t strcpy_s(char* , size_t, char*);

경계 값 처리 구현 char* _strcpy_s(char* dest, size_t _SIZE, const char* str)

{

char* pdest = dest;

size_t count = _SIZE;

while (*str && --count > 0) {

*dest++ = *str++;

}

*dest = '\0';

return pdest;

}

버퍼 오버플로

정수 오버플로

취약점

정수 오버플로

•정수형으로 할당된 데이터에 값이 최대 이상이거나 최소 이하 일 때 발생

•또는 캐스팅으로 인해

•버퍼 할당/읽기/쓰기 오류

size_t x = UINT_MAX;

size_t y = UINT_MAX;

//x*y = 오버플로우 : 1

int* pbuf = (int*) malloc( x * y);

정수 오버플로

2*n 계산법

•ASSERT((UINT64) x * (UINT64) y <= (UINT64) UINT_MAX);

나누기 계산법

•ASSERT(x <= UINT_MAX/y)

정수 오버플로

경계 값 검사 오류

취약점

경계 값 검사 오류

•할당된 데이터 구조의 경계를 벗어나서 데이터를 읽기/쓰기를 하여 오류가 발생

•버퍼 읽기/쓰기 오류

경계 값 검사 오류

WCHAR fieldname[_MAX_PATH];

int count = 0, index = 0;

int length = field.middlePosition - field.startPosition;

// 취약점 : length가 _MAX_PATH보다 클 수 있음.

for (count = 0; count < length; count++) {

// 버퍼의 범위를 넘어서 데이터를 채울 가능성 있음.

fieldname[index++] = readChar(count);

index++;

}

fieldname[index] = '\0';

경계 값 검사 오류

경계 값 검사 int count = 0, index = 0;

int length = field.middlePosition - field.startPosition;

if (lenght > 1) {

WCHAR* fieldname = new WCHAR[length];

if (fieldname) {

for (count = 0; count < length; count++) {

fieldname[index++] = readchar;

index++;

}

fieldname[index] = '\0';

}

delete [] fieldname;

}

경계 값 검사 오류

TIFF 필터 취약점 코드

void TIFFmemcpy(void* d, const void* s, size_t c)

{

memcpy(d, s, c);

}

취약점

void TIFFmemcpy(void* d, size_t dc, const void* s, size_t c)

{

if (dc < c) {

c = dc;

}

memcpy_s(d, dc, s, c);

}

수정

Hwp 파일 포맷 취약점

Hwp 파일 포맷 취약점

Hwp 파일 포맷 취약점

문단 구조

Hwp 문단 구조

문단 Text

•문단의 Text는 일반 텍스트 + 컨트롤

문단 컨트롤

•일반 텍스트 외의 특수한 내용을 표현하기 위해 사용

Hwp 문단 구조

문단 컨트롤 종류

• 문자 컨트롤 : 하나의 문자로 취급되는 char 컨트롤

(Line break, hyphenation point 등)

• 인라인 컨트롤 : 별도의 오브젝트 포인터를 가리키지 않는 단순한 inline 컨트롤

(Tab, Field begin, Field end 등)

• 확장 컨트롤 : 별도의 오브젝트가 데이터를 표현하는 extended 컨트롤

(Section, Drawing object, Header, Footer 등)

Hwp 문단 구조

문자 컨트롤

•부가정보 없이 문자 하나로 표현되는 제어 문자

Hwp 문단 구조

인라인 컨트롤

•부가정보가 12바이트 이내에서 표현될 수 있는 컨트롤.

Hwp 문단 구조

확장 컨트롤

•컨트롤 문자는 포인터를 가지고 있고, 포인터가 가리키는 곳에 실제 오브젝트가 존재

Hwp 문단 구조

•정상적인 문서인 경우 읽어올 때는 pointer 값이 없음.

•읽어오기가 끝난 후 Object를 생성하고 pointer가 할당 됨.

확장 컨트롤

Hwp 컨트롤 취약점

확장 컨트롤 취약점

•새로운 확장 컨트롤로 포맷을 조작

•Pointer가 지정 되어 있음

Hwp 컨트롤 취약점

확장 컨트롤 취약점

•인라인 컨트롤로 포맷을 조작 인라인 컨트롤(?)

Hwp 컨트롤 취약점

확장 컨트롤 취약점

•인라인 컨트롤에 확장 컨트롤 정보를 채움

•라인세그먼트를 조작하여 인라인 컨트롤이 확장 컨트롤로 조작

Hwp 컨트롤 취약점

확장 컨트롤 취약점

Hwp 컨트롤 취약점

코드

HWPUNIT CHwpPara::_GetCtrlWidth(..., HNCPOS position, ...) const

{

// position : 올바른 값이 아님

CHwpCtrl* pctrl = _GetTextCtrl(position);

// pctrl에 조작된 주소 값이 넘어옴.

if (pctrl == NULL) {

return 0;

}

// 올바른 함수가 호출되지 않음 : _GetCodeWidthl 함수는 virtual.

return _GetTextCtrl(position)->_GetCodeWidth(...);

}

}

Hwp 파일 포맷 취약점 코드

확장 컨트롤 취약점

Hwp 파일 포맷 취약점 코드

수정

• 확장 컨트롤에 pointer가 있으면 없앤다.

•라인 세그먼트가 문단의 buffer를 제대로 가리키고 있는지 확인 한다.

(경계 값 검사)

Hwp 파일 포맷 취약점 코드

취약점 해결

보안 고려 사항

•범위 •속도 문제 •검증 및 테스트

고려 사항

•보안 함수 적용 •Warning Level 상승 •코드 분석 및 리뷰

Q&A

top related