[웹 취약점 진단/모의해킹/해킹] 포맷 스트링

 

 

FS - 포맷 스트링

 

■ 점검내용

 

웹 애플리케이션에 포맷 스트링 취약점 존재 여부 점검

 

■ 점검목적

 

공격자의 포맷 스트링 취약점을 통한 악의적인 행위를 차단하기 위함

 

■ 보안위협

 

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

 

■ 참고

 

※ 포맷 스트링 버그(format string bug): printf 등의 함수에서 문자열 입력 포맷을 잘못된 형태로 입력하는 경우 나타나는 취약점으로 루트 권한을 획득하는 것도 가능함. 포맷 스트링의 종류에는 여러 가지가 있으며 그 중 C언어에서 일반적으로 Data(변수)를 입·출력문에서 일정한 형태로 받아들이거나 출력하기 위하여 사용하는 기호로는 다음과 같은 것들이 있음
(예) %d, %f, %c, %s, %x, %p ...
%d : 정수형 10진수 상수
%f : 실수형 상수
%lf : 실수형 상수
%c : 문자값
%s : 문자 스트링
%u : 양의 정수(10진수)
%o : 양의 정수(8진수)
%x : 양의 정수(16진수)
%n : 쓰인 총 바이트 수
※ %n 은 이전까지 입력되었던 문자열의 길이(Byte)수 만큼 해당 변수에 저장시키기 때문에 메모리의 내용도 변조 가능하므로 Format String 취약점에서 핵심이기도 함.
문자열의 길이를 변조시키고 싶은 값의 길이만큼 만든 후 %n을 써주게 되면 메모리상에 공격자가 원하는 값을 넣을 수 있게 됨
※ 소스코드 및 취약점 점검 필요

 

 

점검대상 및 판단기준

 

■ 대상 : 웹 애플리케이션 소스코드, 웹 기반 C/S 프로그램

 

양호

포맷 스트링 버그를 발생시키는 문자열 입력 시 검증 로직이 존재하여 오류가 발생하지 않는 경우

 

취약

포맷 스트링 버그를 발생시키는 문자열 입력 시 검증 로직이 미흡하여 오류가 발생하는 경우

 

■ 조치방법

 

웹 서버 프로그램을 최신 버전으로 업데이트하고 포맷 스트링 버그를 발생시키는 문자열에 대한 검증 로직 구현

 

 

점검 및 조치 방법

 

■ 점검방법

 

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

 

패턴1 - %n%n%n%n%n%n%n%n%n%n,
패턴2 - %s%s%s%s%s%s%s%s%s%s,
패턴3 - %1!n!%2!n!%3!n!%4!n!%5!n!%6!n!%7!n!%8!n!%9!n!%10!n!
패턴4 - %1!s!%2!s!%3!s!%4!s!%5!s!%6!s!%7!s!%8!s!%9!s!%10!s!

 

■ 보안설정방법


* 컴파일러에서 문자열 입력 포맷에 대한 자체적인 검사를 내장하고 있으므로 문자열 입력 포맷 검증 후 소스 코드에 적용
(예) GCC 컴파일러는 문자열 입력 포맷과 실제 입력이 맞지 않는 경우 경고 옵션이 존재하나 해당 방식은 컴파일 과정에서만 검증 가능하며, 런타임 상황에서는 Fuzz testing을 이용하여 포맷 스트링 버그가 존재하는지 검증이 필요함
* 웹 서버 프로그램 최신 보안패치 적용
* 웹 사이트에서 사용자가 입력한 파라미터 값 처리 중에 발생한 경우 사용자 입력 값의 유효성에 대한 검증 로직을 구현

 

 

조치 시 영향 : 일반적인 경우 영향 없음

 

댓글

Designed by JB FACTORY