티스토리 뷰

반응형

 

 

 

가. 원인

  - 포멧스트링을 사용하는 함수에 입력값 검증없이 포멧문자열로 사용

  - 포멧문자열과 파라미터 숫자가 일치하지 않을 경우

 

 

나. 영향

  - 프로세스를 공격

  - 메모리 데이터를 읽거나 쓰기 (%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. 입력값을 검증하지 않고 포멧스트링 생성에 사용할 경우

 

반응형
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday