IT/영어 공부노트
[Web 보안] 포맷 스트링 본문
주요정보통신기반시설 기술적 취약점 분석 평가 방법 상세가이드 - 웹보안
2. 포맷 스트링
포맷스트링이란?
외부에서 입력한 값을 검증하지 않고, 입출력 함수의 포맷 문자열 그대로 사용하는 경우에 발생하는 취약점이다.
프로그램에 입력된 문자열 데이터가 명령으로 해석될 때 발생하고, 공격자는 코드를 실행하거나 스택 메모리 일부를 읽거나 실행중인 프로그램에 Segmentation Fault를 발생시켜 시스템에 의도되지 않은 동작을 일으킬 수 있다.
※ Segmentation Fault: 프로그램이 허용되지 않은 메모리 영역에 접근을 시도하거나, 허용되지 않은 방법으로 메모리 영역에 접근을 시도할 경우 발생하는 오류이다.
포맷함수
프로그램 언어의 변수를 사람이 읽을 수 있는 문자열 형식으로 변환하는 ANSI C 함수 (printf, sprintf, vprintf 등)
포맷 스트링
포맷 함수의 인자이며 텍스트 및 포맷 인자를 포함하는 ASCII 문자열
포맷스트링 인자
포맷 함수의 변환 형태를 정의한다.
C언어의 포맷 스트링 중 %n은 이전까지 입력되었던 문자열의 길이수 만큼 해당 변수에 저장시키기 때문에 메모리의 내용도 변조 가능하므로, 포맷스트링 취약점의 핵심이다. 문자열의 길이를 변조시키고 싶은 값의 길이만큼 만든 후 %n을 써주게 되면 메모리상에 공격자가 원하는 값을 넣을 수 있게 된다.
안전한코드
printf('%s', argv[1]);
위험한텍스트코드
printf(argv[1]);
취약점 분석
취약점 개요 | |
점검내용 | - 웹 애플리케이션 포맷 스트링 취약점 존재 여부 점검 |
점검목적 | - 공격자의 포맷 스트링 취약점을 통한 악의적인 행위를 차단하기 위함 |
보안위협 | - C언어로 만드는 프로그램 중 변수의 값을 출력하거나 입력받을 때 입력받은 값을 조작하여 프로그램 메모리 위치를 반환받아 메모리 주소를 변조하여 시스템의 관리자 권한을 획득할 수 있음 |
점검대상 및 판단기준 | |
대상 | - 웹 애플리케이션 소스코드, 웹 기반 C/S 프로그램 |
판단기준 | - 양호: 포맷스트링 버그를 발생시키는 문자열 입력 시 검증 로직이 존재하여 오류가 발생하지 않는 경우 |
- 취약: 포맷 스트링 버그를 발생시키는 문자열 입력 시 검증 로직이 미흡하여 오류가 발생하는 경우 | |
조치방법 | - 웹 서버 프로그램을 최신 버전으로 업데이트하고 포맷 스트링 버그를 발생시키는 문자열에 대한 검증 로직 구현 |
점검방법
1. 웹 사이트에서 사용자가 입력한 파라미터 값에 아래와 같은 패턴 입력 후 전송 시 다른 값을 입력했을 때는 발생하지 않는 에러 반응이나 멈추는 등 이상 반응을 보이는지 확인
- %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!
보안설정방법
- 컴파일러에서 문자열 입력 포맷에 대한 자체적인 검사를 내장하고 있으므로 문자열 입력 포맷 검증 후 소스 코드에 적용
- 웹 서버 프로그램 최신 보안패치 적용
- 웹 사이트에서 사용자가 입력한 파라미터 값 처리 중에 발생한 경우 사용자 입력 값의 유효성에 대한 검증 로직을 구현
참고
주요정보통신기반시설 기술적 취약점 분석 평가 방법 상세가이드 p.647-p.648