security

Total 112
Today 0
profile_image
운영자
01-02-06 09:24 0개 2,444회
Stack based Overflow
Subject 1. The methods of Stack based overflow



Stack은 Function이 Call될 때 Push된다. 이 때, Function이 끝나고 다시 원래의 흐름으로 돌아갈 것을 위해서 Return Address를 저장하게 되는데 이 값을 바꾸어서 다른 곳의 Code를 실행시킬 수 있다면 Set-User ID가 붙은 프로그램에서는 전혀 엉뚱한 프로그램을 Root의 Permission으로 실행하게 되는 것이다. 즉 다음 과정을 통해서 공격을 하게 된다.



Suid가 걸린 프로그램을 실행시킨다.

return address를 buffer overflow를 이용해서 우리가 원하는 코드를 실행시키도록 바꾼다.

shell을 띠우고 곱게 프로그램이 종료되어야 한다.

위를 만족하는 여러 공격형태가 존재 하지만 attacker가 공격에 성공하기 위해 서는 다음 세가지 조건을 만족해야 한다.



victim program's address space의 실행 가능한 (!!) 영역에 공격 code를 집어 넣어야 한다. (Shell code 만드는 방법은 reference 2 or 4 참고

buffer overflow 방법을 사용해서 적정한 code pointer의 값을 바꿔야 한다. code pointer로는 다음과 같은 것들이 사용될 수 있다.

return address in an activation record (classic stack smash)

function pointer (as found in the SuperProbe exploit)

longjmp buffer (as found in the Perl 5.003 exploit)

victim program 이 이 바뀐 code pointer를 실행시키길 기다린다.

이 조건 중에 이상한 단어들을 추려보자.



실행 가능한 ... 즉 삽입된 코드의 영역이 실행 가능하지 않으면 공격은 실패한다.

buffer overflow ... 왜 멀쩡한 buffer를 overflow시키는가?

code pointer 의 값을 바꿔야 ... 이것 역시 정상적인 일은 아니다.

즉 위에 있는 조건들이 충족되지 않으면 공격은 실패하는 것이다.







--------------------------------------------------------------------------------



Subject 2. A way to prevent Stack based overflow



Stack based overflow에 당하지 않으려면 위의 조건들을 만족시켜주지 않으면 된다. 그런데 그럴려면 어떻게 해야 하는가? 현재 나와있는 두가지 대처방법에 대해서 설명하겠다.



1. The Mechanism of StackGuard



이 프로그램은 다음의 site를 참고할 것. http://www.cse.ogi.edu/DISC/projects/immunix/StackGuard



StackGuard는 stack에 저장된 return address가 바뀌는 것을 감시한다. 이는 함수가 호출되면 return address뒤에 canary(밀고자) value를 set해주는데 함수가 return될 때 canary value가 바뀌어 있으면 stack smashing attack 이 실행 된 것으로 간주하고 syslog에 기록을 하고 프로그램을 정지시킨다.



이 과정이 효과적으로 진행되기 위해서는 attacker가 이 canary value를 미리 예측 하고서 string에 끼워 넣는 것을 막아야 한다. 그래서 다음과 같은 technique을 사용한다.



-Random canaries : 프로그램의 runtime 때마다 canary value를 바꿔 줘서, 이전에 실행시켜서 얻은 canary값을 다시 사용하지 못하게 한다.



- Null canary : attacker가 그의 string에 0x00 은 절대로 넣을 수 없다는 것을 이용한 방법이다.



- Terminator canary : 대부분의 string operation 이 Null에서 끝나기는 하지만 Null에서 끝나지 않는 몇몇 함수의 terminator value (i.e. 0xFF (-1) ) 을 을 사용한다. 즉 Null, CR, LF, -1등을 조합해서 canary value를 만든다.







StackGuard는 gcc code generator 의 patch형태로 작용한다.



function_prolog() -> function이 시작할 때 canary를 집어 넣는다.



function_epilog() -> function이 return 될 때 canary를 확인한다.



2. Secure Linux - Kernel patch



이 프로그램은 다음의 site를 참고할 것. http://www.false.com/security/linux-stack



- 대부분의 stack based overflow는 stack에 저장되 함수의 return address를 바꿔서 어떠한 임의의 코드 (이 역시 stack 에 저장되어 있는) 를 실행시키는 방법을 사용한다. 만약 stack area가 non executable 하다면 buffer overflow는 더 힘들어 질 것이다. 즉 stack area를 non-executable하도록 patch해준다.



- 또 다른 buffer overflow는 함수의 return address를 libc의 system()을 가르키도록 하는데 이 patch는 그러한 공유된 library내의 함수들의 default 값들을 항상 Null값이 들어가도록 고쳤다. 따라서 위 Null canary value와 같은 역할을 한다.







위 두가지를 조합하면 현존하는 거의 모든 stack overflow를 막을 수 있다. 물론 가장 근본적인 대책으로는 buffer overflow를 막는 것이지만 이를 compiler수준에서 구현할 경우 어느정도 프로그램이 복잡해 지면 아예 컴파일을 하지 못하게 된다.

댓글목록

등록된 댓글이 없습니다.