Home Format String Bug 취약점과 예시
Post
Cancel

Format String Bug 취약점과 예시

Format String Bug(FSB) 취약점은 프로그램의 입력 처리 과정에서 발생할 수 있는 보안 취약점 중 하나로, 잘못된 형식 문자열을 통해 공격자가 프로그램의 메모리를 읽거나 수정할 수 있는 상황을 노출시키는 문제입니다. 이번 글에서는 FSB 취약점의 개념을 상세히 설명하고, 실제 예시를 통해 그 작동 원리와 예방 방법을 살펴보겠습니다.

Format String Bug 취약점이란?

포맷 문자열 취약점은 프로그램이 입력을 받아들이고, 이를 서식화된 문자열로 처리할 때 발생합니다. 일반적으로 printf, sprintf, fprintf와 같은 함수에서 서식 문자열을 사용할 때, 서식 문자열에는 % 기호와 서식 지정자가 포함됩니다. 이 서식 지정자는 변수의 값을 서식화하여 출력할 때 사용됩니다. 그러나 프로그래머가 사용자 입력을 제대로 처리하지 않아 사용자가 임의의 포맷 문자열을 제공하면, 보안 문제가 발생할 수 있습니다.

Format String Bug 예시

가정해보겠습니다. 어떤 프로그램이 사용자의 이름을 입력받아 printf 함수로 출력하는 기능을 가지고 있습니다.

1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main(int argc, char *argv[]) {
    char name[100];
    printf("이름을 입력하세요: ");
    scanf("%s", name);
    printf(name);
    return 0;
}

만약 사용자가 이름 대신 포맷 문자열을 입력한다면 어떻게 될까요?

사용자 입력: %x %x %x %x

이 입력은 프로그램의 동작을 변경하게 될 수 있습니다. 포맷 문자열에 사용된 %x는 메모리에 저장된 값을 16진수로 출력하는 서식 지정자입니다. 따라서 사용자 입력에 의해 프로그램이 스택 메모리에 저장된 값들을 출력하게 됩니다. 이를 이용하여 공격자는 메모리 값을 유출하거나, 시스템을 조작하는 악의적인 작업을 수행할 수 있습니다.

FSB 취약점 방지 방법

FSB 취약점을 예방하기 위해 다음과 같은 조치를 취할 수 있습니다.

  1. 사용자 입력 검증: 사용자 입력을 받을 때, 입력 값이 포맷 문자열을 포함하고 있는지 검사합니다. 만약 포맷 문자열이 감지된다면, 해당 입력을 거부하거나 적절한 에러 처리를 수행합니다.

  2. 고정된 서식 문자열 사용: 사용자 입력과 별개로 서식 문자열을 고정된 형태로 사용합니다. 사용자 입력이 서식 문자열에 직접 적용되지 않도록 합니다.

  3. 서식 문자열을 사용하지 않는 방법 선택: 포맷 문자열을 사용하는 대신, 안전한 방법으로 출력하는 방법을 선택할 수 있습니다. 예를 들어, printf 대신 puts 함수를 사용하거나, 문자열 결합 함수를 이용할 수 있습니다.

결론

FSB 취약점은 프로그램의 입력 처리 과정에서 발생할 수 있는 중요한 보안 문제입니다. 개발자는 사용자 입력을 신중하게 다루고, 안전한 출력 방식을 선택하여 이러한 취약점으로부터 시스템을 보호해야 합니다. 정확한 입력 검증과 고정된 서식 문자열 사용을 통해 포맷 문자열 취약점을 예방할 수 있습니다.

This post is licensed under CC BY 4.0 by the author.

Double Free Bug 취약점과 예시

Heap Overflow 취약점 이해 - 예시와 방지 방법