주통기반- 포맷스트링취약점

황인환·2024년 8월 12일

정의

  • 프로그래밍에서 입력을 제대로 검증하지 않아 발생하는 보안 취약점입니다.
    특정한 함수(예: printf, sprintf, fprintf 등)가 사용자의 입력을 그대로 포맷 스트링으로 해석할 때 발생합니다

원인

  • 사용자 입력의 검증 부족: 사용자로부터 입력받은 데이터가 포맷 스트링 함수(예: printf, sprintf)의 포맷 문자열로 직접 전달되면서 발생합니다.
  • 포맷 스트링 함수의 동작 방식: 포맷 스트링 함수는 주어진 포맷 문자열%s, %d, %x에 따라 가변 인수를 처리합니다. 만약 포맷 문자열이 제대로 정의되지 않았거나 외부 입력으로 동적으로 결정된다면 문제가 발생할 수 있습니다.

위협

  • 변수 값을 출력하거나 입력받을 때 입력받은 갓을 조작하여 프로그램의 메모리 위치를 반환받아 메모리 주소를 변조하여 시스템 관리자의 권한을 획득할 수 있습니다.

한계

  • 메모리를 직접관리하는 C나 C++같은 저수준의 언어에서 발생하며 php나 python같은 고수준의 언어는 메모리를 자동으로 관리하여 포맷스트링으로 인한 조작이 불가능합니다.

  • php에서는 printf 함수에 전달되는 인자를 처리할 때 포맷 스트링을 하드코딩된 방식으로 처리합니다. 즉, %s와 같은 포맷 지정자가 코드 내에 명확히 정의되어 있으며, 이를 통해 변수를 안전하게 출력합니다.

TEST방법

파라미터 값에 입력 아래 패턴을 입력후 전송시 에러반응이나 멈추는등 이상반응 확인

  • 패턴1(쓰인 총 바이트 수)
    %n%n%n%n%n%n%n%n%n%n%n%n%n%n

    설명
    의미%n은 포맷 스트링에서 사용되면, 그 위치까지 출력된 문자의 개수를 인수로 전달된 변수에 저장합니다.
    예상결과1. 제대로 된 변수가 제공되지 않으면, 메모리의 임의의 위치를 참조하게 됩니다. 이로 인해 프로그램이 메모리 접근 오류로 인해 충돌 할 수 있습니다.
    2. 프로그램이 메모리에 잘못된 접근을 시도하면, 오류 없이 조용히 종료되거나 디버깅 메시지가 나타날 수 있습니다.
  • 패턴2(문자 스트링)
    %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s

    설명
    의미%s는 포맷 스트링에서 문자열을 출력하는 데 사용됩니다.
    예상결과1. 프로그램은 스택 또는 다른 메모리 위치에서 해당 위치를 문자열로 간주하고 출력하려고 하기 때문에 메모리의 임의의 위치에 있는 데이터가 문자열로 해석되어 스택에 중요한 정보 등 출력될 수 있습니다.
    2. 만약 %s가 가리키는 메모리 주소가 유효하지 않거나 읽을 수 없는 영역을 참조하거나 데이터를 출력하지 못한다면 이상한 문자가 출력되거나 프로그램이 충돌 및 예기치 않게 종료될 수 있습니다.
  • 패턴3(FormatMessage 함수와 관련)
    %1!n!%2!n!%3!n!%4!n!%5!n!%6!n!%7!n!%8!n!%9!n!%10!n!

    설명
    의미%n: 이 포맷 지정자는 C에서 사용되며, 현재까지 출력된 문자의 개수를 인수로 전달된 변수에 저장합니다.
    ```!n!```: !로 둘러싸인 문자는 그 값의 포맷 타입을 지정하는 데 사용됩니다.
    예상결과%n은 예상되는 포맷 지정자가 아니기 때문에, 프로그램의 동작이 예상치 못한 결과를 낳을 수 있으며 프로그램이 오류를 발생시키거나 비정상적으로 종료시킬 수도 있습니다..
  • 패턴4(FormatMessage 함수와 관련)
    %1!s!%2!s!%3!s!%4!s!%5!s!%6!s!%7!s!%8!s!%9!s!%10!s!

    설명
    의미%1!s! :첫 번째 인수를 문자열로 형식(!s!).
    %2!s!: 두 번째 인수를 문자열로 형식화.
    이와 같은 방식으로 %10!s!까지 열 번째 인수까지 모두 문자열로 형식화하여 출력합니다.
    예상결과여러 문자열 인수를 결합하여 하나의 메시지를 형식화할 때 사용됩니다. 오류를 발생시킬 수 있으며, 프로그램이 비정상적으로 종료되거나 예상치 못한 결과를 반환할 수 있습니다.

대상 & 판단기준 & 조치방법

설명
대상웹어플리케이션 소스코드, 웹 기반 C/S프로그램
판단기준양호 검증로직이 존재 -> 오류x
취약 검증로직 미흡 -> 오류o
조치방법웹서버프로그램 업데이트 및 버그를 발생시키는 문자열에 대한 검증로직 구현

0개의 댓글