티스토리 뷰

반응형

 

 

 

가. 원인

  - 버퍼 크기보다 큰 데이터를 버퍼에 기록할 경우

  - 버퍼의 영역을 넘어 다른 메모리 영역에 침범할 경우

 

 

나. 영향

  - 메모리 상 중요한 정보를 읽거나 시스템 충돌유도

  - 리턴주소를 조작하여 임의의 코드를 실행하도록 조작

 

 

다. 보안대책

  - 버퍼의 범위를 넘는 데이터를 접근하지 못하도록 버퍼 크기와 인덱스를 정확히 사용

  - 문자열 저장 시 버퍼의 마지막에 NULL로 종료

 

 

라. 안전한 코드

1. 버퍼 크기를 정확히 사용

 

  typedef struct _charvoid {

     char data[16];

     void *prev;

     void *next;

  } charvoid;

 

  public void main( char* args ) {

     charvoid cv_struct;

     ...

     int data_size = sizeof(cv_struct.data);

 

     memcpy( cv_struct.data, args, data_size );

     cv_struct.data[data_size - 1] = '\0';

     ...

  }

 

 

 

마. 진단방법

<버퍼 크기 확인>

  1. 버퍼에 외부입력값을 저장하는지 확인

  2. 외부입력값의 사이즈가 버퍼의 사이즈보다 크게 저장되는지 확인

  3. 문자열 사용 시 버퍼의 마지막에 NULL을 저장하는지 확인

 

 

 

바. 정/오탐 케이스

<정탐 케이스>

  1. 복사하려는 문자열의 크기를 검증없이 제한된 사이즈의 버퍼에 복사할 경우

  2. 호스트 정보를 작은 사이즈(64 byte)의 제한된 버퍼에 문자열 복사할 경우

  3. 버퍼의 마지막에 널을 삽입하지만, 특정 조건 시 위치가 마이너스일 경우 ( buf[-1] = \0 )

 

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