[Web] 포맷스트링 (FS)

포맷 스트링 FS (format string) 취약점

 

취약점 개요

■ 위험도
- 상

■ 점검 목적
- 포맷스트링 버그로 인한 위험으로부터 예방하기 위한 웹페이지 내 적절한 입력 값 검증 로직을 탑재하기 위함

■ 보안 위협
- C언어로 만드는 프로그램 중 변수의 값을 출력하거나 입력받을 때 입력받은 값을 조작하여 프로그램의 메모리 위치를 반환받아 메모리 주소를 변조하는 시스템의 관리자 권한을 획득할 수 잇음



점검 및 조치 방법

■ 점검 및 판단 기준
- 양호 : 임의의 문자열 입력에 대한 검증이 이루어지는 경우
- 취약 : 임의의 문자열 입력에 대한 검증이 이루어지지 않으며, 오류가 발생하는 경우

 

■ 조치 방법
- 웹 서버 응용프로그램(Apache, Tomcat, IIS 등)을 최신 버전으로 패치하고 임의의 문자열 입력에 대한 검증 로직 구현

■ 점검 방법
Step 1) 웹 사이트 인수 값에 아래와 같은 패턴 입력 후 전송하여 반환된 페이지가 다른 인수 값을 입력했을 때는 발생하지 않는 에러 반응이나 멈추는 등 이상반응을 보이는지 확인

■ 보안설정방법
Step 1) 컴파일러에서는 문자열 입력 포맷에 자체적인 검사를 내장하고 있으므로 문자열 입력 포맷 검증 후 소스 코드에 적용
예) GCC에서는 문자열 입력 포맷과 실제 입력이 맞지 않는 경우에 대해 경고 옵션 존재 하지만, 이 방식은 컴파일 시간에 문제를 발견할 수 있는 경우에 한해 검증 가능함
런타임 상황에서는 퍼지 테스트를 이용하여 프로그램의 입력 값으로 임의의 값을 넣어서 프로그램을 예외 상황으로 빠뜨리는 경우가 있으므로 이러한 경우에 버그가 없는지 확인이 필요함

Step 2) 웹 서버 응용프로그램(Apache, Tomcat, IIS 등)의 최신 보안패치 적용

Step 3) 웹 사이트 인수 값 처리 중에 발생할 경우 사용자가 입력하는 인수 값의 유효성에 대한 검증 로직을 구현


■ 용어 설명
※ 포맷 스트링 버그 : printf 등의 함수에서 문자열 입력 포맷을 잘못된 형태로 입력하는 경우 나타나는 취약점으로 루트 권한을 획득하는 것도 가능함.
%d : 정수형 10진수 상수
%f : 실수형 상수
%lf : 실수형 상수
%c : 문자값
%s : 문자 스트링
%u : 양의 정수(10진수)
%o : 양의 정수(8진수)
%x : 양의 정수(16진수)
%n : 쓰인 총 바이트 수
%n은 이전까지 입력되었던 문자열의 길이 수만큼 해당 변수에 저장시키기 때문에 메모리의 내용도 변조가 가능합니다.
이를 이용해 문자열의 길이를 변조시키고 싶은 값의 길이만큼 만든 후 %n을 써주게 되면 메모리상에 내가 원하는 값을 넣을 수 있게 됩니다.

댓글

Designed by JB FACTORY