포맷 스트링(Format String)
개요
- printf( ), fpringf( ), sprintf( )와 같은 포맷 스트링을 사용하는 함수를 사용할 때, 외부로부터 입력된 값을 검증하지 않고 입출력 함수의 포맷 문자열로 그대로 사용하는 경우 발생할 수 있는 취약점임
- 공격자는 포맷 문자열을 이용해 취약한 프로세스를 공격하거나 메모리 내용을 읽거나 쓸 수 있음. 이를 통해 공격자는 취약한 프로세스의 권한을 취득하여 임의의 코드를 실행할 수 있음
포맷 스트링 문자의 종류
%d : 정수형 10진수 상수(integer)
%f : 실수형 상수(float)
%lf : 실수형 상수(double)
%s : 문자 스트링
%u : 양의 정수(10진수)
%o : 양의 정수(8진수)
%x : 양의 정수(16진수)
%s : 문자열
%n : 이전까지 출력한 총 바이트 수를 지정한 변수에 저장(4바이트 단위)
%hn : %n의 반인 2바이트 단위로 저장
공격 원리
#include <stdio.h>
int main(int argc, char **argv){
printf(argv[1]); // 사용자의 입력을 그대로 포맷 문자열로 사용(위험)
}
#include <stdio.h>
int main(int argc, char **argv){
printf("%s", argv[1]); // 포맷 문자열을 지정함
}
취약점의 위협 요소
프로그램의 파괴
- 포맷 스트링 취약점을 사용한 간단한 공격은 프로세스를 죽게 만드는 것임
- core를 덤프하는 데몬을 죽이는 데 유용하게 사용될 수 있음. 또는 몇몇 네트워크 공격에서 DNS 스푸핑을 할 때 어떤 서비스가 반응하지 않도록 하는 데도 유용하게 사용될 수 있음
프로세스 메모리 보기
- 공격자는 %x, %p와 같은 포맷을 사용하여 스택 정보나 함수 포인터와 같은 중요한 정보를 추출할 수 있음. 공격자는 이 결과를 통해 포맷 스트링이 무엇을 하며, 프로세스 배치가 어떻게 구성되어 있는지에 대한 정보를 획득하는 데 사용할 수 있음
임의의 메모리 덮어쓰기
- 공격자는 %n, %hn을 사용하여 특정 메모리 위치에 값을 쓰거나, 반환 주소를 조작하여 코드 실행 흐름을 변경할 수 있음. 이는 어떤 프로세스의 명령(instruction) 통제권을 장악할 수 있음
보안 대책
- printf( ), snprintf( ) 등 포맷 문자열을 사용하는 함수를 사용할 때는 사용자 입력값을 직접적으로 포맷 문자열로 사용하는 것을 피하고, 포맷 문자열 생성에 사용자 입력을 포함하지 않음
- 포맷 문자열을 사용하는 함수에 사용자 입력 값을 사용할 때는 사용자가 포맷 스트링을 변경할 수 없도록 해야 함. 특히, %n, %hn은 공격자가 이를 이용해 특정 메모리 위치에 특정 값을 변경할 수 있기 때문에 포맷 스트링 매개변수로 사용하지 않음
- 사용자 입력 값을 포맷 문자열을 사용하는 함수에 사용할 때는 가능하면 %s 포맷 문자열을 지정함. 또한 snprintf( ), vsnprintf( )와 같은 함수는 출력 크기를 명시적으로 제한할 수 있어 유용함
'정보보안 > 시스템보안' 카테고리의 다른 글
시스템 보안위협 백도어 (0) | 2025.02.24 |
---|---|
시스템 보안위협 레이스 컨디션 공격 (0) | 2025.02.23 |
시스템 보안위협 버퍼 오버플로 공격 (0) | 2025.02.21 |
서버 보안 서버 해킹 기법 (0) | 2025.02.20 |
서버 보안 SW 설치 및 운영 (0) | 2025.02.19 |