버퍼 오버플로우 시스템보안 20061912 류기환 20072204 권재홍
목 차 버퍼 오버플로우? 버퍼 오버플로우 공격 버퍼 오버플로우 보안 대책 실 습
버퍼 오버플로우(Buffer overflow)? 프로그램 처리과정에서 데이터가 일시적으로 저장되는 공간 데이터를 모아 놓은 데이터 블록의 개념 C에서 배열이나 포인터 부분에서 많이 사용(문자열 저장) 버퍼 오버플로우 란? Buffer Overrun 이라고도 불림 지정된 버퍼의 크기보다 더 많은 데이터를 입력해서 프로그램이 비 정상적으로 동작하도록 하는 것 메모리에 할당 된 버퍼의 양을 초과하는 데이터를 입력하여 프로그 램의 복귀 주소(retturn address)를 조작, 궁극적으로 해커가 원하 는 코드를 실행하는 것
버퍼 오버플로우(Buffer overflow)? Lower Memory Address Stack-based Buffer Overflow 스택 영역에 버퍼 크기를 초과하는 데이터를 기록하고 저장된 복귀주소를 변경함으로써 임의의 코드를 실행 Heap-based Buffer Overflow 힙 영역에 버퍼 크기를 초과하는 데이터를 기록하고 저장된 복귀주소를 변경함으로써 임의의 코드를 실행 TEXT 영역 TEXT Area Program Header Table DATA Area Initialized DATA Area Uninitialized DATA Area HEAP Area DATA 영역 Heap 영역 STACK 영역 STACK Area High Memory Address
버퍼 오버플로우 공격 공격 대상 공격 절차 취약점이 있는 시스템 주로 root 소유의 setuid 프로그램 취약점 탐지 및 정보수집 OS, Program, Version, etc Exploit code from the well-know security portal sites 혹은 Exploit 작성 Exploit
버퍼 오버플로우 공격 void main(){ char buffer1[5]; char buffer2[10]; }
버퍼 오버플로우 공격 void function(char *str) { } void main() { char buffer[16]; strcpy(buffer,str); } void main() { char large_string[256]; int i; for( i = 0; i < 255; i++) large_string[i] = 'A'; function(large_string); 어떤 프로그램을 실행하게 될때, 스택에는 실행 되는 함수에 관련된 정보들이 쌓이게 된다. 리턴 어드레스(eip), 프레임 포인터(sfp), 지역변수들... 리턴 어드레스에는 해당 함수가 종료되고 난 후 다음 실행 코드의 주소를 저장 하고 있다. 함수가 종료되고 난 후 프로세스는 ret를 스택에서 꺼내어 해당 주 소로 이동하여 다음 코드를 계속 수행하게 될 것이다. 변수의 boundary check를 하지 않은 취약한 프로그램에서 변수를 오버플로우 시켜 이 ret를 덮어쓰므로서 프로그램의 흐름을 원하는 곳으로 바꾸는 것이 바로 stack overflow 공격이다. 원하는 명령을 - 75 - 실행시키는 쉘코드의 작성과 이러한 쉘코드를 실행시킬 수 있도록 return address 를 적절히 지정함으로써 완성되어진다.
버퍼 오버플로우 보안대책 운영체제 커널 패치 경계 검사를 하는 컴파일러 및 링크 사용 사용자 스택 영역에 데이터 기록 금지 함수로부터 복귀할 때 스택의 무결성(integrity) 검사 경계 검사를 하는 컴파일러 및 링크 사용 복귀주소 다음에 “canary” word 를 위치 시킴 “canary” word가 변경되면 스택 오버플로우 공격의 시도 감지 및 보고, 시스템 종료 Random canary 실행할 때마다 canary value를 변경시켜 공격자가 예측 못하도록 함 Null canary(0x00000000) 공격자가 버퍼에 널 문자(0x00)를 넣을 수 없다는 점을 이용 Terminator canary(combination of Null, CR, LF, -l) Null 문자로 끝나지 않는 몇몇 문자열 함수의 문자열 끝문자 이용 어떤 프로그램을 실행하게 될때, 스택에는 실행 되는 함수에 관련된 정보들이 쌓이게 된다. 리턴 어드레스(eip), 프레임 포인터(sfp), 지역변수들... 리턴 어드레스에는 해당 함수가 종료되고 난 후 다음 실행 코드의 주소를 저장 하고 있다. 함수가 종료되고 난 후 프로세스는 ret를 스택에서 꺼내어 해당 주 소로 이동하여 다음 코드를 계속 수행하게 될 것이다. 변수의 boundary check를 하지 않은 취약한 프로그램에서 변수를 오버플로우 시켜 이 ret를 덮어쓰므로서 프로그램의 흐름을 원하는 곳으로 바꾸는 것이 바로 stack overflow 공격이다. 원하는 명령을 - 75 - 실행시키는 쉘코드의 작성과 이러한 쉘코드를 실행시킬 수 있도록 return address 를 적절히 지정함으로써 완성되어진다.
버퍼 오버플로우 보안대책 프로그래머 관점에서의 보안대책 사용 자제 함수들 사용 권장 함수들 Overflow_wrapper 사용 Boundary를 검사하는 컴파일러 및 링커 사용 Boundary를 검사하는 함수 사용 사용 자제 함수들 strcat(), strcpy(), gets(), scanf(), sscanf(), vscanf(), vsscanf(), sprintf(), vsprintf(), gethostbyname() 사용 권장 함수들 strncat(), strncpy(), fgets(), fscanf(), vfscanf(), snprintf(), vsnprintf() Overflow_wrapper 사용 버퍼 크기 검사 후 원래의 프로그램 수행 어떤 프로그램을 실행하게 될때, 스택에는 실행 되는 함수에 관련된 정보들이 쌓이게 된다. 리턴 어드레스(eip), 프레임 포인터(sfp), 지역변수들... 리턴 어드레스에는 해당 함수가 종료되고 난 후 다음 실행 코드의 주소를 저장 하고 있다. 함수가 종료되고 난 후 프로세스는 ret를 스택에서 꺼내어 해당 주 소로 이동하여 다음 코드를 계속 수행하게 될 것이다. 변수의 boundary check를 하지 않은 취약한 프로그램에서 변수를 오버플로우 시켜 이 ret를 덮어쓰므로서 프로그램의 흐름을 원하는 곳으로 바꾸는 것이 바로 stack overflow 공격이다. 원하는 명령을 - 75 - 실행시키는 쉘코드의 작성과 이러한 쉘코드를 실행시킬 수 있도록 return address 를 적절히 지정함으로써 완성되어진다.
정리 버퍼 오버플로우 공격의 위험성 원인 대책 리모트 혹은 로컬에서 인증절차 없이 임의의 권한 획득 손쉽게 구할 수 있는 수없이 많은 exploit 코드 존재 원인 운영체제 : 스택 혹은 힙 영역에 데이터 쓰기 및 실행 허용 컴파일러 : 버퍼의 경계검사 소홀 프로그래머 : 버퍼의 경계검사 소홀 및 적절한 함수 선택에 부주의 대책 운영체제 : 사용자 스택 혹은 힙 영역의 쓰기 및 실행권한 제거 컴파일러 : 버퍼의 경계검사 지원 프로그래머 : 버퍼의 경계검사 철저, 적절한 함수선택, 도구사용 어떤 프로그램을 실행하게 될때, 스택에는 실행 되는 함수에 관련된 정보들이 쌓이게 된다. 리턴 어드레스(eip), 프레임 포인터(sfp), 지역변수들... 리턴 어드레스에는 해당 함수가 종료되고 난 후 다음 실행 코드의 주소를 저장 하고 있다. 함수가 종료되고 난 후 프로세스는 ret를 스택에서 꺼내어 해당 주 소로 이동하여 다음 코드를 계속 수행하게 될 것이다. 변수의 boundary check를 하지 않은 취약한 프로그램에서 변수를 오버플로우 시켜 이 ret를 덮어쓰므로서 프로그램의 흐름을 원하는 곳으로 바꾸는 것이 바로 stack overflow 공격이다. 원하는 명령을 - 75 - 실행시키는 쉘코드의 작성과 이러한 쉘코드를 실행시킬 수 있도록 return address 를 적절히 지정함으로써 완성되어진다.