티스토리 뷰
가. 원인
- 포멧스트링을 사용하는 함수에 입력값 검증없이 포멧문자열로 사용
- 포멧문자열과 파라미터 숫자가 일치하지 않을 경우
나. 영향
- 프로세스를 공격
- 메모리 데이터를 읽거나 쓰기 (%n)
- 리턴주소를 조작하여 임의코드를 실행
다. 보안대책
- 외부입력값을 포멧스트링으로 사용하지 않고 포멧 문자열 생성에 포함제외
- 포멧스트링에 사용되는 인자와 매개변수의 갯수를 일치
- 포멧문자열을 사용하지 않는 함수를 사용
라. 안전한 코드
1. 입력값을 매개변수로 사용
public static void main( String[] args ) { ... Calendar validate = Calendar.getInstance(); ... // System.out.println("[%s] input command: " + args[0]", validate); // => 포멧스트링으로 입력값이 사용하고 있어 취약함 System.out.println("[%s] input command : %s", validatate, args[0] ); ... }
|
2. 포멧문자열을 사용하지 않는 함수 사용
void check_password( const char *user ) { static const char msg_format[] = "%s cannot be authenticated.\n"; size_t len = strlen(user) + sizeof(msg_format); char *msg = (char *)malloc(len); int ret = snprintf( msg, len, msg_format, user );
// fprintf(stderr, msg); // => msg에 신뢰할 수 없는 값을 포함하고, 이를 포멧문자열 인자로 전달하고 있어 취약함 // 포멧문자열을 사용하지 않는 fputs 함수로 대신 사용 if ( fputs(msg, stderr ) == EOF) { return -1; } }
|
마. 진단방법
<입력값 검증>
1. 포멧스트링이 포함된 함수의 사용확인
2. 외부입력값이 포멧스트링 생성에 사용되는지 확인
3. 포멧스트링에 사용하는 인자와 매개변수의 갯수가 일치하는지 확인
바. 정/오탐 케이스
<정탐 케이스>
1. 입력값을 검증하지 않고 포멧스트링 생성에 사용할 경우
'Web Analytics > SW 보안약점 진단원' 카테고리의 다른 글
[구현보안] 보안기능 02 - 부적절한 인가 (0) | 2019.10.04 |
---|---|
[구현보안] 보안기능 01 - 적절한 인증없는 중요기능 허용 (0) | 2019.10.04 |
[구현보안] 입력 데이터 검증 및 표현 14 - 메모리 버퍼 오버플로우 (0) | 2019.10.04 |
[구현보안] 입력 데이터 검증 및 표현 13 - 보안기능 결정에 사용되는 부적절한 입력값 (0) | 2019.10.04 |
[구현보안] 입력 데이터 검증 및 표현 12 - 정수형 오버플로우 (0) | 2019.10.04 |
- Total
- Today
- Yesterday