포멧스트링 방어

typkdev·2024년 10월 9일

리눅스 서버 보안에서 포맷 스트링 취약점은 매우 중요한 이슈입니다. 이 취약점의 특징과 대응 방안을 자세히 설명해 드리겠습니다.

포맷 스트링 취약점 개요

포맷 스트링 취약점은 주로 C/C++ 언어에서 printf 계열 함수를 부적절하게 사용할 때 발생합니다. 이 취약점은 1996년에 처음 발견되었으며, 공격자가 프로그램의 메모리를 읽거나 쓸 수 있게 하여 심각한 보안 위협이 될 수 있습니다.

취약점의 원리

  1. 포맷 지정자 악용: printf("%s", user_input) 대신 printf(user_input)와 같이 사용할 경우, 공격자가 %s, %x 등의 포맷 지정자를 입력하여 스택의 데이터를 읽을 수 있습니다.

  2. 메모리 읽기: %x나 %p를 사용하여 스택의 데이터를 16진수 형태로 읽을 수 있습니다.

  3. 임의 코드 실행: %n 지정자를 사용하여 메모리에 값을 쓸 수 있어, 공격자가 악성 코드를 실행할 수 있습니다.

포맷 스트링 취약점의 위험성

  1. 정보 유출: 시스템의 중요한 정보(비밀번호, 암호화 키 등)가 노출될 수 있습니다.

  2. 권한 상승: 공격자가 시스템 권한을 획득할 수 있습니다.

  3. 서비스 거부(DoS): 프로그램을 비정상적으로 종료시킬 수 있습니다.

  4. 원격 코드 실행: 공격자가 원격에서 임의의 코드를 실행할 수 있습니다.

대응 방안

  1. 안전한 함수 사용:

    • printf() 대신 snprintf()를 사용합니다.
    • 예: snprintf(buffer, sizeof(buffer), "%s", user_input);
  2. 포맷 문자열 고정:

    • 사용자 입력을 직접 포맷 문자열로 사용하지 않습니다.
    • 예: printf("%s", user_input);
  3. 입력 검증:

    • 사용자 입력에 포맷 지정자가 포함되어 있는지 확인하고 필터링합니다.
  4. 컴파일러 경고 활용:

    • gcc의 -Wformat-security 옵션을 사용하여 취약한 코드를 탐지합니다.
  5. ASLR(Address Space Layout Randomization) 활성화:

    • 메모리 주소를 무작위화하여 공격을 어렵게 만듭니다.
  6. 최소 권한 원칙 적용:

    • 프로그램을 필요한 최소한의 권한으로만 실행합니다.
  7. 정적 분석 도구 사용:

    • 소스 코드 분석 도구를 사용하여 취약점을 사전에 탐지합니다.
  8. 보안 패치 적용:

    • 시스템과 라이브러리를 최신 버전으로 유지합니다.

결론

포맷 스트링 취약점은 오래된 문제이지만 여전히 위험합니다. 개발자와 시스템 관리자는 이 취약점의 위험성을 인식하고, 안전한 코딩 practices를 적용하며, 지속적인 보안 감사를 통해 시스템을 보호해야 합니다. 특히 리눅스 서버 환경에서는 이러한 취약점에 더욱 주의를 기울여야 합니다.

Citations:
[1] https://bluegoatcyber.com/blog/understanding-format-string-vulnerabilities-risks-and-prevention/
[2] https://beaglesecurity.com/blog/vulnerability/format-string-vulnerability.html
[3] https://securityboulevard.com/2020/09/how-to-mitigate-format-string-vulnerabilities/
[4] https://www.comparitech.com/blog/information-security/format-string-attack/


+적용추가예정

profile
좋아한다 지엽적 연구를, 갖는다 끊임 없는 의문을

0개의 댓글