외부에서 입력한 값을 검증하지 않고, 입출력 함수의 포맷 문자열 그대로 사용하는 경우에 발생하는 취약점이다.
프로그램에 입력된 문자열 데이터가 명령으로 해석될 때 발생하고, 공격자는 코드를 실행하거나 스택 메모리 일부를 읽거나 실행중인 프로그램에 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 프로그램 |
판단기준 | - 양호: 포맷 스트링 버그를 발생시키는 문자열 입력 시 검증 로직이 존재하여 오류가 발생하지 않는 경우 - 취약: 포맷 스트링 버그를 발생시키는 문자열 입력 시 검증 로직이 미흡하여 오류가 발생하는 경우 |
조치방법 | 웹 서버 프로그램을 최신 버전으로 업데이트하고 포맷 스트링 버그를 발생시키는 문자열에 대한 검증 로직 구현 |
웹 사이트에서 사용자가 입력한 파라미터 값에 패턴 입력 후 전송 시
다른 값을 입력했을 때는 발생하지 않는 에러 반응이나 멈추는 등 이상 반응을
보이는지 확인한다.
참고
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
주요정보통신기반시설 기술적 취약점 분석 평가 방법 상세가이드