인텔기반 리눅스에서 버퍼 오버플로우 악용방지...?

sliver의 이미지

갑자기 생각났는데 이게 과연 옳은 생각인지 궁금해서 올립니다.

보통 버퍼 오버플로우를 악용할 경우,

리턴 어드레스를 스택상에 존재하는 쉘코드의 주소로 덮어씌웁니다.

보통 코드부분은 2GB이하에 존재하고 스택은 3GB이하에 존재하는데,

스택이 2GB이하까지 커질 가능성은 없기 때문에

USER_CS 디스크립터의 limit값을 2GB정도로 설정을 하면,

2GB이상에 있는 코드를 수행할 수 없기 때문에

스택에 있는 코드는 수행불가능하게 되어 버퍼오버플로우 악용을 방지할 수 있을 것 같은데

헛점은 없는지 궁금합니다. 사실 이렇게 간단하게 된다면 이렇게 안할리도 없을듯 하지만.. :?

ohojang의 이미지

좋은 생각을 하셨군요

저도 몇달 전에 이런 생각을 해서 실제 코드 상에서 실험을 해보았는데

잘되긴 하는데 몇가지 문제점이 있습니다.

리눅스의 가상 메모리 배치 특성 때문에 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 malling-list 를 보세요...
요즘의 핫-이슈로 떠올라 있으니깐요...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

mushim의 이미지

참고로 리눅스의 경우, text, data, heap, stack 등을 각각 vma 라고 하는 연속적인 가상메모리영역에 할당을 해서 사용하게 됩니다.

cat /proc/해당 pid/maps 를 해보시면, 특정 프로세스가 사용하는 메모리맵을 확인할 수 있습니다.

각각의 vma 에는 rwx 권한이 있는데, pax 패치를 하기전에는 stack 의 권한은 rwx 이지만, pax 패치를 한 다음에는 rw- 로 바뀌게 됩니다.

즉, stack 영역은 실행이 불가능해지도록 바꾸는 것이지요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.