메뉴 닫기

포맷스트링 공격 대응방법

포맷스트링(Format string)은 프로그램에 입력된 문자열을 특정한 방식으로 출력 및 구성하기 위해 사용하는 기능입니다.

포맷 스트링 공격은 프로그래밍 언어에서 포맷 스트링 기능을 잘못 사용할 경우 발생할 수 있는 보약 취약점인데
이 공격은 주로 C, C++와 같은 저수준 언어에서 주로 발생합니다.


공격개념

포맷 스트링 공격은 사용자로부터 입력받은 데이터를 포맷 스트링 함수에 직접 전달할 때 발생합니다.

공격자는 포맷 지정자를 이용해 프로그램의 메모리에 접근하거나 임의의 값을 읽거나 쓸 수 있습니다.

포맷스트링을 막으려면 어떤 방법이 적합할까요.

포맷스트링 공격을 방지하기 위해 아래와 같은 잘못된 코딩 패턴을 피하길 권장합니다.

C 기준

printf(buffer); // 잘못된 사용 예

위와 같이 작성할 경우 ‘buffer’에 공격자가 입력한 포맷 지정자가 포함될 수 있어
보안 취약점을 초래할 수 있기 때문입니다.

char *사용자 입력 = get_user_input();

printf(user_input); // 잘못된 사용 예

user_input‘이 신뢰할 수 없는 데이터일 경우, 포맷 스트링 공격에 취약합니다.

따라서 포맷 스트링 공격을 방지하기 위해서는 항상 포맷 문자열을 명시적으로 지정하고,

사용자 입력을 포맷 문자열로 직접 사용하는 것을 피해야 합니다.

올바른 사용 예는 하단 예시를 참고하시기 바랍니다. 

printf(“%s\n”, buffer); // 올바른 사용 예

예시

올바른 사용 예 잘못된 사용 예 
#include<stdio.h>

main() { 
char *buffer = “wishfree”
printf ( “%s\n”, buffer);
}

#include<stdio.h>

main() { 
char *buffer = “wishfree”
printf ( buffer);
}

포맷 스트링에 취약한 함수

– fprintf(fp , 서식 문자열 , 인자1 ,인자N)함수

– sprintf(char *str , const char *fmt, )함수

– snprintf(char *str , size_t count, const char *fmt,)함수 

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x