맨위로가기

포맷 스트링 버그

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

포맷 스트링 버그는 C 언어의 `printf`와 같은 함수에서 사용자가 제공한 데이터로 형식 문자열을 구성할 때 발생하는 보안 취약점이다. 이는 프로그램이 의도하지 않은 메모리 영역에 접근하거나, 임의의 코드를 실행하도록 악용될 수 있다. 1990년대에 처음 발견되었으며, 1999년 ProFTPD 데몬에서 공격 벡터로 사용될 수 있음이 밝혀졌다. 이러한 버그는 컴파일러의 정적 검사나, 외부 입력에 대한 검증을 통해 예방할 수 있으며, x86 컴파일 바이너리에서 함수의 인자 개수를 세는 방식으로 탐지할 수 있다.

더 읽어볼만한 페이지

  • 취약점 공격 - 보안 취약점
    보안 취약점은 시스템의 설계, 구현, 운영, 관리상 결함이나 약점으로, 위협에 의해 악용되어 시스템 보안 정책을 위반할 수 있는 요소이며, ISO 27005, IETF RFC 4949, NIST SP 800-30, ENISA 등 다양한 기관에서 정의하고 있다.
  • 취약점 공격 - 인터넷 보안
    인터넷 보안은 사이버 위협, 악성 소프트웨어, 서비스 거부 공격 등으로부터 정보와 시스템을 보호하기 위해 네트워크 계층 보안, 다단계 인증, 방화벽 등 다양한 기술과 방법을 포괄한다.
포맷 스트링 버그
개요
종류소프트웨어 버그
공격 유형악용
악용 가능성원격
일반적인 약점 열거CWE-134 제어되지 않는 형식 문자열
상세 정보
설명형식 문자열 버그는 프로그램이 형식 문자열을 사용자 입력으로 사용하여 문자열을 형식화할 때 발생함.
영향프로그램 충돌
임의 코드 실행
예방사용자 입력을 형식 문자열로 직접 사용하지 않음.
안전한 형식화 함수 사용.
탐지정적 분석 도구
동적 분석 도구
퍼징
역사
최초 발견1980년대 후반
일반적인 악용 시기1990년대 후반

2. 상세

일반적인 익스플로잇은 여러 기법들을 조합하여 프로그램이 라이브러리 함수의 주소나 스택의 반환 주소에 악의적인 셸코드를 가리키는 포인터를 겹쳐쓰게 한다. 포맷 명시자에 대한 패딩 파라미터들은 많은 바이트들의 출력을 제어하는데 사용되며, `%x` 토큰은 자신이 도달하는 포맷 스트링의 시작까지 스택으로부터 바이트들을 pop하는데 사용된다. 포맷 스트링의 시작은, `%n` 포맷 토큰이 악의적인 코드(실행할)의 주소로 겹쳐쓸 수 있는 주소를 포함할 수 있게 다듬어진다.[4]

포맷 버그는 C의 인자 전달 규칙이 타입 안정성이 아니기 때문에 발생한다. 특히 `varargs` 메커니즘은 함수가 임의의 수의 인자를 받아들일 수 있게 하는데(예: `printf`), 이는 원하는 만큼 콜 스택에서 인자를 pop할 수 있기 때문이다(이전의 인자들이 얼마나 많은 추가 인자를 pop해야 하는지, 그리고 어떤 타입인지를 나타낸다고 믿으며).[5]

포맷 스트링 버그는 C 외에도 펄과 같은 다른 프로그래밍 언어에서도 발생할 수 있지만, 훨씬 적게 발견되며 공격자가 원하는 코드를 실행할 수 있을 만큼 익스플로잇되기도 힘들다.[5]

3. 역사

1989년 위스콘신 대학교에서 수행된 퍼즈 테스팅 작업에서 포맷 스트링 버그가 처음 발견되었다. 이 연구에서 C 셸(csh)의 명령 기록 메커니즘과 안전한 문자열 입력을 가정하는 오류 루틴 사이에 "상호 작용 효과"가 발견되었다.

1999년 9월, Tymm Twillman이 ProFTPD 데몬에 대한 보안 감사를 수행하는 과정에서 포맷 스트링 버그가 공격 벡터로 사용될 수 있다는 사실을 발견했다. 사용자 생성 데이터를 형식 문자열 없이 직접 전달하는 `snprintf`가 발견되었고, 이를 통해 권한 상승이 가능하다는 것이 밝혀졌다. 1999년 9월 Bugtraq 메일링 리스트에 이 취약점 유형에 대한 첫 번째 게시물이 올라왔으며, 기본적인 익스플로잇도 포함되었다.

1999년 10-15일, tf8이라는 닉네임으로 익스플로잇과 권고문이 보고되었다.[1]

2000년 6월, Przemysław Frasunek과 tf8이 Bugtraq 목록에 동시에 익스플로잇을 게시했다. 2000년 7월, Pascal Bouchareine에 의해 "포맷 버그"라는 용어가 Bugtraq 목록에 게시되었다. 2000년 9월, Tim Newsham의 논문 "포맷 스트링 공격"이 발표되었으며, 2001년 9월에는 Teso 팀의 ''Exploiting Format String Vulnerabilities''와 같은 자세한 기술 설명 논문이 발표되었다.

4. 흔한 발생 원인

포맷 스트링 버그는 프로그래머가 사용자가 제공한 데이터를 포함한 문자열을 출력하고자 할 때 가장 흔하게 발생한다. 프로그래머는 `printf("%s", buffer)` 대신 `printf(buffer)`를 실수로 사용할 수 있다. 전자는 `buffer`의 내용을 그대로 출력하지만, 후자는 `buffer`를 포맷 스트링으로 해석하여 포함된 포맷팅 명령어를 파싱(parse)하게 된다.[4]

이러한 버그는 C 언어의 인수 전달 방식이 타입에 안전하지 않기 때문에 발생한다. 특히, `varargs` 메커니즘은 함수가 임의 개수의 인수를 받을 수 있게 허용한다. 예를 들어 `printf` 함수는 호출 스택에서 원하는 만큼 인수를 꺼내올 수 있는데, 이때 이전 인자들이 몇 개의 추가 인수가 필요한지, 그리고 그 타입이 무엇인지를 나타낸다고 가정한다.[4]

C 외의 다른 프로그래밍 언어에서도 포맷 스트링 버그가 발생할 수 있지만, 빈도는 훨씬 적으며 공격자가 원하는 코드를 실행할 수 있을 만큼 익스플로잇(exploit)되기도 어렵다.[5]

5. 예방

많은 컴파일러가 포맷 스트링을 정적으로 검사하여 의심스러운 포맷에 대해 경고를 표시한다. GNU 컴파일러 모음에서 관련 있는 컴파일러 플래그는 다음과 같다.[6]

플래그설명
` -Wall `모든 경고 메시지를 활성화
` -Wformat `포맷 스트링 관련 문제 검사
` -Wno-format-extra-args `포맷 함수에 필요 이상의 인수가 전달되는 경우 경고 비활성화
` -Wformat-security `포맷 스트링 취약점으로 이어질 수 있는 코드에 대한 경고
` -Wformat-nonliteral `포맷 스트링이 리터럴이 아닌 경우 (변수인 경우) 경고
` -Wformat=2 ``-Wformat`보다 더 엄격한 검사 수행



이 플래그들 대부분은 컴파일할 때 알려진 잘못된 포맷 스트링을 탐지하는 데에만 유용하다. 만약 포맷 스트링이 사용자나 애플리케이션 외부 소스에서 온다면, 애플리케이션은 반드시 사용하기 전에 검증해야 한다. 또한 애플리케이션이 포맷 스트링을 즉석에서 생성하거나 선택하는 경우에도 주의가 필요하며, `-Wformat-nonliteral` 검사가 더 강력하다.

6. 탐지

다른 많은 보안 문제와 달리, 포맷 스트링 취약점의 근본 원인은 x86 컴파일된 실행 파일에서 비교적 쉽게 탐지할 수 있다. `printf` 계열 함수의 경우, 올바른 사용은 포맷 스트링과 포맷될 인수에 대한 별도의 인수를 의미한다. 이러한 함수의 잘못된 사용은 함수에 전달된 인수의 수를 단순히 세는 것으로 파악할 수 있으며, "인수 부족"은 함수가 잘못 사용되었음을 강력하게 시사하는 지표이다.

6. 1. x86 컴파일 바이너리에서의 탐지

x86에서는 호출 규약 때문에 인수의 개수를 세는 것이 종종 쉬운데, 호출자는 호출 후 스택 포인터에 더하여 스택에 푸시된 인수를 제거하므로, 스택 보정을 간단히 검사하면 `printf` 계열 함수에 전달된 인수의 수를 알 수 있다.

참조

[1] URL http://seclists.org/[...]
[2] URL http://gcc.gnu.org/o[...]
[3] 웹인용 CWE-134: Uncontrolled Format String http://cwe.mitre.org[...] MITRE 2010-12-13
[4] 웹인용 Vulnerability Type Distributions in CVE http://cwe.mitre.org[...] 2007-05-22
[5] Bugtraq Format String Vulnerabilities in Perl Programs http://seclists.org/[...]
[6] Warning Options Warning Options - Using the GNU Compiler Collection (GCC) http://gcc.gnu.org/o[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com