ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 시스템 해킹 기초
    System Security/dreamhack 2021. 3. 9. 22:38

     

    드림핵 system exploitation fundamental을 공부하고 정리한 내용이다.

     

    1. 취약점의 분류

     

    익스플로잇 : 악용; 취약점을 이용해 공격자가 의도한 동작을 수행하게 하는 코드 혹은 이를 공격한 공격 행위

     

    소프트웨어 버그 분류

     

    취약점의 분류

     

    버그 : 프로그래머가 의도하지 않은 동작을 수행하는 소프트웨어 버그

    취약점 : 그러한 버그 중 보안에 영향을 줄 수 있는 버그

    익스플로잇 가능한 취약점 : 그러한 취약점 중 이를 이용해 공격자가 의도한 동작을 수행할 수 있는 버그

    안정적으로 익스플로잇 가능한 취약점 : 매우 높은 확률로 공격에 성공할 수 있는 버그

     

    모든 sw 취약점은 sw와 공격자가 상호작용하는 곳인 사용자의 입력 에서부터 발생한다.

    공격자가 sw와 상호작용할 수 있는 곳을 attack vector(공격벡터)라 하며 attack vector의 집합을 attack surface라 한다.

     

     

    2. 취약점의 종류

    공격 방법에 따라 두가지로 나뉜다.

    메모리 커럽션 취약점 / 로지컬 취약점

     

    (1) 메모리 커럽션 취약점 : 메모리를 조작해 공격

    - BOF

    -out-of-boundary

    - off-by-one

    - format string bug

    - double free / use-after-free

    - etc

     

    ① BOF

    지역변수가 할당되는 스택 메모리에서 발생하는 취약점

    데이터를 입력받거나 복사하는 부분에서 길이 검증을 하지 않거나 미흡한 경우(버퍼가 허용할 수 있는 양의 데이터보다 더 많은 값이 저장되어 버퍼가 넘치게 됨) 발생

    힙 메모리에서도 발생 가능

    --> 데이터 입력받거나 복사하는 부분에 대한 길이 검사 필요

     

    ② out-of-boundary

    버퍼의 길이 범위를 벗어나는 인덱스에 접근할 때 발생하는 취약점

    --> 인덱스로 사용할 수 있는 범위의 올바른 값인지 검사 필요

     

    ③ off-by-one

    경계 검사에서 하나의 오차가 있을 때 발생하는 취약점

    버퍼의 경계 계산, 반복문의 횟수 계산 시 인덱스 고려하지 못했을 때 발생

     

    ③ format string bug

    printf, sprintf와 같은 포맷 스트링을 사용하는 함수에서 발생하는 취약점

    사용자의 입력이 포맷 스트링으로 전달될 때 발생하는 취약점

    ex ) printf("%s")

    ex ) fprintf(fp, buf) : fprintf의 두번째 인자는 포맷 스트링이 와야 하는데 사용자의 버퍼 값이 온 경우

    --> 포맷 스트링을 사용하는 함수의 인자 검사

     

    ④ Double free & use-after-free

    - double free : 이미 해제된 메모리를 다시 한 번 해제하는 취약점

    - use-after-free : 해제된 메모리에 접근해서 값을 쓸 수 있는 취약점

     

    ⑤ integer issues

    c/ c++ 언어를 사용할 때 자주 발생하는 취약점 중 하나로 정수의 형변환을 제대로 고려하지 못하는 경우임

    c언어의 정수 자료형이 표현할 수 있는 범위를 정확히 알아야 함

    c언어 자료형 범위

     

    integer issues가 발생할 수 있는 사례를 살펴보자.

     

    다음과 같이 unsigned int 형태로 변수를 받아올 때, 가능한 범위보다 큰 데이터를 받게되면 의도하지 않은 값이 들어가게 된다.

                 unsigned int 자료형 범위                                                int 자료형 범위              

     

     

     

    65536 * 65537을 width와 height 으로 입력한다면, 2^32 + 2^16 값을 넣는건데, unsigned int의 범위에 따라 2^32는 표현불가여서 0이 된다. 즉 오버플로우가 발생한다는 것이다. 고로 n은 2^16(65536)이 된다. 그런데 memcpy 함수에서 반복문을 돌며 메모리를 복사하게 되어, 버퍼 오버플로우가 발생하게 된다는 문제가 나타난다. 즉 buf 값은 65536인데 그 보다 더 많은 값이 복사되어 버퍼 오버플로우가 발생한다는 것이다.

     

     

    (2) 로지컬 취약점

    - command injection

    - race condition

    - path traversal

    - etc

     

     

     

     

    댓글

Designed by Tistory.