시큐어코딩
- home
- 보안소식
- 시큐어코딩
15. [입력 데이터 검증 및 표현] 포맷 스트링 삽입
2019.04.30 09:57
안녕하세요, 지에스인포입니다.
이번에는 행자부 개발보안 가이드라인 47개 항목 중 "입력 데이터 검증 및 표현"의 마지막 15번째 항목인 '포맷 스트링 삽입'에 대해 알아보겠습니다.
포맷 스트링 삽입은 행정자치부에서 발표한 '소프트웨어 개발보안 가이드'에 속해있는 주요 항목입니다. 분석, 설계 단계의 보안 요구항목에서는 '입력 데이터 검증 및 표현'의 '허용된 범위 내 메모리 접근'이라는 항목으로, 구현 단계 보안약점에서는 '입력 데이터 검증 및 표현'의 '포맷 스트링 삽입'이라는 항목으로 명시가 되어있습니다.
#포맷 스트링 삽입이란?
포맷 스트링 삽입이란, 외부로부터 입력된 값을 검증하지 않고 입, 출력 함수의 포맷 문자열로 그대로 사용하는 경우 발생할 수 있는 보안약점으로, 공격자는 포맷 문자열을 이용하여 취약한 프로세스를 공격하거나 메모리 내용을 읽거나 쓸 수 있습니다. 그 결과로 취약한 프로세스의 권한을 탈취하여 임의의 코드를 실행할 수 있게 됩니다.
예를 들어 살펴보겠습니다.
위 소스 코드는 날짜를 설정하고 사용자 입력 값을 매개변수(args[0])로 받아 11번째 줄에서 출력하고, 힌트로써 설정된 날짜 중 일(day)을 출력해주는 소스 코드입니다. 출력 시 System.out.printf 메서드를 사용하여 포맷 스트링을 사용할 수 있고, 입력받은 매개변수를 검증 없이 사용하고 있어 공격자가 매개변수에 "%1$tY-%1$tm-%1$te"라고 포맷 스트링을 입력하면 입력받은 포맷대로 출력을 하게 되고, 힌트로 일(day)만 출력해야 하지만 결과적으로는 년, 월, 일이 모두 출력됩니다.
위 소스 코드는 포맷 스트링 삽입 보안약점을 제거한 소스 코드입니다. 11번째 줄에서 입력값을 출력할 때 %s 포맷으로 출력하여, 문자열로써 출력하므로 공격자가 포맷 스트링을 입력하더라도 입력한 문자 그대로 출력이 됩니다.
#포맷 스트링 삽입을 막기 위한 보안 대책은?
포맷 스트링 삽입을 방어하기 위한 대책은 소프트웨어 개발 생명 주기에 따라 크게 두 가지로 나눌 수 있습니다.
소프트웨어 개발보안 가이드에서 제시하는 "포맷 스트링 삽입"에 대한 보안 대책은 위와 같으며, 각각의 상황에 맞게 적절히 시큐어코딩을 적용하기를 권장하고 있습니다.
오늘은 "포맷 스트링 삽입"에 대해 살펴보았으며, 구현 단계 보안약점의 첫 번째 구분인 "입력 데이터 검증 및 표현"의 모든 항목에 대해 알아봤습니다.
다음은 시큐어코딩 16번째 항목이자 2번째 구분인 "보안 기능"의 "적절한 인증 없는 중요 기능 허용"에 대해 알아보겠습니다.
댓글 0
본사주소 : 서울특별시 금천구 가산디지털1로 181, 가산더블유센터 1508호 COPYRIGHT ⓒ ALL RIGHT RESERVED.