소프트웨어 취약점 분류

버그헌팅 공부

2020. 1. 18. 01:06

반응형

1. Memory Corruption 취약점

이 취약점은 이 취약점 외의 여러 취약점에서도 포함될 정도로 여러 곳에서 발생하는 취약점이다.

버그로 인해 메모리가 오염되거나, 예상되자 않은 메모리 값이 변경되거나, 참조 등에 의해 발생하게된다.

원인은 굉장히 다양한데 대부분 안전하지 않은 함수를 사용한것이 원인이다.

가장 잘 알려진 BufferOverflow 또한 이 취약점 종류에 속한다.

 

이 분류의 취약점들은 대부분 Exploit이 가능하지만 일부 제약 조건이 따르기도 한다.

취약점 공개 사이트에 올라오는 취약점들도 대부분 해당 분류의 취약점 공격 코드이다.

 

우선 해당 분류에 해당하는 대표적인 취약점을 알아보자.

1) Stack Buffer Overflow

주로 메모리 경계를 검사하지 않는 함수를 사용하게 되어서 스택을 덮어써버리면 발생하는 취약점이다.

고전이지만 아직도 많이 발생하고 있고, 실제로 퍼징을 하다 보면 여전히 많이 발견되는 취약점이다.

char buf[20];
strcpy(buf, argv[1]); // 경계값을 검사하지 않는다.

위 코드처럼 취약한 함수들이 있다.

대표적으로 strcpy, gets, scanf, strcat, getwd, sprintf 등이 있다.

 

일반적으로 문자열 길이를 검사하는 함수를 사용하면 안전하다고 생각하지만,

프로그래머의 부주의로 인하여 길이를 검사하는 경우에도 취약점이 발생할 수 있다.

char buf[20];
len = strlen(argv[1]);
strncpy(buf, argv[1], len); // 문자열 길이가 20을 넘을시 BOF 발생

이처럼 늘 메모리 복사, 문자열 복사함수는 반드시 정확한 검증을 거친 후 수행해야한다.

 

2) Heap Buffer Overflow

위에서 다루었던 Stack Buffer Overflow와 비슷하나 그 대상이 힙 메모리라는 점이 다르다.

그리고, 메모리 구조가 다르므로 취약점 공격 기법도 다르다.

int *buf = (int*)malloc(20);
strcpy(buf, argv[1]); // 경계값을 검사하지 않음

 

3) Integer Overflow

정해진 자료형보다 큰 수를 저장할 때 발생하는 오버플로우 문제이다.

조건문 등에서 정해진 분기문이 아닌 다른 분기문을 실행하도록 하여서 취약점을 발생시킬 수 있다.

unsigned char maxlen = 0;
char len = 0;
char buf[30] = {0,};

len = strlen(argv[1]); // 128바이트 이상 입력 시 음수로 인식
if(len>30){
		printf("Error!! Max Size:30\n");
}else{
		printf("Vuln!!");
        strcpy(buf,argv[1]);
 }

해당 프로그램에 A를 128개이상 입력하면 signed char에서 음수로 인식하므로 if문을 통과하여 취약함수가 실행된다.

 

4) Format String Bug

포맷스트링을 지정하지 않고 사용할 때 발생한다.

%n, %hn 등의 일부 포맷스트링을 이용해 메모리값을 변조하게 된다.

strcpy(buf, argv[1]);
printf(buf) // FSB

 

5) Use-After-Free

브라우저에서 많이 발견되는 취약점이다.

말 그대로 Free된 포인터를 사용할 때 발생한다.

JS, 파일 로딩 등으로 힙 메모리를 조작할 수 있는 상황에서 공격가능하다.

free(object);
object->method(); // Free된 포인터 사용

 

6) Double Free

Free된 메모리를 다시 Free할 때 발생한다.

대부분 프로그래밍 실수로 인해 발생하게 된다.

Integer Overflow 등의 취약점으로 인해 발생하기도 한다.

int * ptr;
{
...
	free(ptr);
}
...
free(ptr); // Double Free 취약점 발생

 

7) Null Pointer Dereperence

메모리 값이 지정되지 않은 초기화되지 않은 포인터(Null Pointer)에 값을 넣으려 할 때 발생한다.

char * ptr = null;
...
*ptr = '1234' // Null Pointer Dereperence

 

반응형

'버그헌팅 공부' 카테고리의 다른 글

Exploit 분류  (0) 2020.01.18