인텔기반 리눅스에서 버퍼 오버플로우 악용방지...?
글쓴이: sliver / 작성시간: 금, 2003/08/15 - 12:02오전
갑자기 생각났는데 이게 과연 옳은 생각인지 궁금해서 올립니다.
보통 버퍼 오버플로우를 악용할 경우,
리턴 어드레스를 스택상에 존재하는 쉘코드의 주소로 덮어씌웁니다.
보통 코드부분은 2GB이하에 존재하고 스택은 3GB이하에 존재하는데,
스택이 2GB이하까지 커질 가능성은 없기 때문에
USER_CS 디스크립터의 limit값을 2GB정도로 설정을 하면,
2GB이상에 있는 코드를 수행할 수 없기 때문에
스택에 있는 코드는 수행불가능하게 되어 버퍼오버플로우 악용을 방지할 수 있을 것 같은데
헛점은 없는지 궁금합니다. 사실 이렇게 간단하게 된다면 이렇게 안할리도 없을듯 하지만.. :?
Forums:
괜찮은 방법이긴 합니다만
좋은 생각을 하셨군요
저도 몇달 전에 이런 생각을 해서 실제 코드 상에서 실험을 해보았는데
잘되긴 하는데 몇가지 문제점이 있습니다.
리눅스의 가상 메모리 배치 특성 때문에 heap 영역, 기타 메모리영역
에서의 overflow 를 막기가 힘들어집니다.
결국엔 shellcode 가 stack 상에 존재할 경우에만 가능한 방법입니다.
중요한 것은 이미 이것이 많은 보안 LINUX 에서 채택하고
있다는 점입니다. ( 저도 만들고 난 다음에 알았습니다. )
그리고 더더욱 중요한것은 이것 보다 더 잘 나가는 것이 있습니다.
일명 PaX 라고 이름 붙여진 것입니다.
현재 많은 underground 해커 들이 로컬에서는 이것을 회피하는 방법을
몇몇 개발하기도 했었으나 remote 공격일 경우는 매우 힘듭니다.
PaX 는 리눅스 커널을 패치하는 형태이며 OpenBSD 에서도 거의
동일한 방법으로 포팅되어 있습니다.
이곳이 PaX 홈페이지 --> http://pageexec.virtualave.net
-_- 정말 그런게 사능하다면...아마도 크래커들도 그 부분을 물고
-_- 정말 그런게 사능하다면...
아마도 크래커들도 그 부분을 물고 늘어질 것입니다.
그 데이타 형이 있으면 그걸 사용하거나...
아님 상수로 그냥 집어 넣거나...
이건 시간 벌기 밖에 되지 않을듯 한데...
시스템 오버 헤드는 그만큼 줄어 들지 않을까 저어되는군요...
이런 비효율적인 방법으론 막기가 힘들것 같고...
그냥 그부분 스택을 실행을 권한을 없게 만들면 될거 같은데...
요즘 이쪽 방향으로 가고 있지 않나요?
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
여기에 관한 좀 더 다양한 답변이나 글을 원하시면은...bugtraq
여기에 관한 좀 더 다양한 답변이나 글을 원하시면은...
bugtraq malling-list 를 보세요...
요즘의 핫-이슈로 떠올라 있으니깐요...
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
참고로 리눅스의 경우, text, data, heap, stack 등을
참고로 리눅스의 경우, text, data, heap, stack 등을 각각 vma 라고 하는 연속적인 가상메모리영역에 할당을 해서 사용하게 됩니다.
cat /proc/해당 pid/maps 를 해보시면, 특정 프로세스가 사용하는 메모리맵을 확인할 수 있습니다.
각각의 vma 에는 rwx 권한이 있는데, pax 패치를 하기전에는 stack 의 권한은 rwx 이지만, pax 패치를 한 다음에는 rw- 로 바뀌게 됩니다.
즉, stack 영역은 실행이 불가능해지도록 바꾸는 것이지요.
댓글 달기