2. 포맷 스트링

박소정·2023년 7월 4일
0

IT@Security

목록 보기
4/5

포맷스트링

외부에서 입력한 값을 검증하지 않고, 입출력 함수의 포맷 문자열 그대로 사용하는 경우에 발생하는 취약점이다.
프로그램에 입력된 문자열 데이터가 명령으로 해석될 때 발생하고, 공격자는 코드를 실행하거나 스택 메모리 일부를 읽거나 실행중인 프로그램에 Segmentation Fault를 발생시켜 시스템에 의도되지 않은 동작을 일으킬 수 있다.

※ Segmentation Fault: 프로그램이 허용되지 않은 메모리 영역에 접근을 시도하거나, 허용되지 않은 방법으로 메모리 영역에 접근을 시도할 경우 발생하는 오류이다.

포맷함수

프로그램 언어의 변수를 사람이 읽을 수 있는 문자열 형식으로 변환하는 ANSI C 함수 (printf, sprintf, vprintf 등)

포맷 스트링

포맷 함수의 인자이며 텍스트 및 포맷 인자를 포함하는 ASCII 문자열

포맷스트링 인자

포맷 함수의 변환 형태를 정의한다.

안전한코드

printf('%s', argv[1]);

위험한텍스트코드

printf(argv[1]);

취약점 분석

취약점개요
점검내용웹 애플리케이션에 포맷 스트링 취약점 존재 여부 점검
점검목적공격자의 포맷 스트링 취약점을 통한 악의적인 행위를 차단하기 위함
보안위협C언어로 만드는 프로그램 중 변수의 값을 출력하거나 입력받을 때 입력받은 값을 조작하여 프로그램의 메모리 위치를 반환받아 메모리 주소를 변조하여 시스템의 관리자 권한을 획득할 수 있음

※ 포맷 스트링 버그: printf등의 함수에서 문자열 입력 포맷을 잘못된 형태로 입력하는 경우 나타나는 취약점으로 루트 권한을 획득하는 것도 가능하다. 포맷 스트링의 종류에는 여러 가지가 있으며 그 중 C언어에서 일반적으로 Data를 입출력문에서 일정한 형태로 받아들이거나 출력하기 위해 사용하는 기호로는 %d, %f, %c, %s, %x, %p 등이 있다.

※ %n은 이전까지 입력된 문자열의 길이수 만큼 해당 변수에 저장시키기 때문에 메모리의 내용도 변조 가능하므로 포맷스트링 취약점에서의 핵심이다. 문자열의 길이를 변조시키고 싶은 값의 길이만큼 만든 후 %n을 써주면 메모리상에 공격자가 원하는 값을 넣을 수 있게 된다.



점검대상 및 판단기준
대상웹 애플리케이션 소스코드, 웹 기반 C/S 프로그램
판단기준- 양호: 포맷 스트링 버그를 발생시키는 문자열 입력 시 검증 로직이 존재하여 오류가 발생하지 않는 경우
- 취약: 포맷 스트링 버그를 발생시키는 문자열 입력 시 검증 로직이 미흡하여 오류가 발생하는 경우
조치방법웹 서버 프로그램을 최신 버전으로 업데이트하고 포맷 스트링 버그를 발생시키는 문자열에 대한 검증 로직 구현

점검방법

웹 사이트에서 사용자가 입력한 파라미터 값에 패턴 입력 후 전송 시
다른 값을 입력했을 때는 발생하지 않는 에러 반응이나 멈추는 등 이상 반응을
보이는지 확인한다.

  • %n%n%n%n%n%n%n%n%n%n,
  • %s%s%s%s%s%s%s%s%s%s,
  • %1!n!%2!n!%3!n!%4!n!%5!n!%6!n!%7!n!%8!n!%9!n!%10!n!
  • %1!s!%2!s!%3!s!%4!s!%5!s!%6!s!%7!s!%8!s!%9!s!%10!s!

보안설정방법

  • 컴파일러에서 문자열 입력 포맷에 대한 자체적인 검사를 내장하고 있으므로 문자열 입력 포맷 검증 후 소스코드에 적용
  • 웹 서버 프로그램 최신 보안패치 적용
  • 웹 사이트에서 사용자가 입력한 파라미터 값 처리 중에 발생한 경우 사용자 입력 값의 유효성에 대한 검증 로직을 구현

참고
https://bloofer.net/94
https://ko.wikipedia.org/wiki/%EC%84%B8%EA%B7%B8%EB%A9%98%ED%85%8C%EC%9D%B4%EC%85%98_%EC%98%A4%EB%A5%98
주요정보통신기반시설 기술적 취약점 분석 평가 방법 상세가이드

0개의 댓글

관련 채용 정보