Unsigned-Numeric-overflow 부호 없는 정수 경계 오버플로우 정수 오버플로우 예 u_char * make_table ( unsigned int width , unsigned int height , u_char * init_row ) { unsigned int n ; int i ; u_char * buf ; n = width * height ; buf = ( char * ) malloc ( n ) ; if ( ! buf ) return ( NULL ) ; for ( i = 0 ; i < height ; i ++ ) memcpy ( & buf [ i * width ] , init_row , width ) ; return buf ; } make_table() 함수의 목적은 너비와 높이, 초기 배열을 받아들여 각 행이 init_row 값과 동일한 값으로 초기화된 테이블을 메모리에 생성하는 것이다. 만약 사용자에게 width 와 height 에 대한 제어권을 갖고 있다면 오버플로우 공격을 일으킬 가능성이 있다. 너비가 1,000,000이고 높이가 3,000 같은 큰 값을 지정한다면 malloc() 함수를 호출하여 3,000,000,000 바이트를 할당하는 과정에서 에러를 감지하고 실패할 확률이 높다. 하지만 결과 값에서 1 비트만 큰 산술 오버플로우를 유도한다면 성공할 가능성이 높다. 실제 초기화는 for 루프에서 이루어지기 때문이다. 사용자가 width 를 0x400으로, height 를 0x1000001로 할당한다면 곱셈 결과 0x400000400이며, 이 값의 모듈로 0x100000000은 0x00000400 또는 1024가 된다. 그러므로 1024바이트가 할당되고 for 루프에서 init_row 를 약 천육백만 번 정도 더 많이 복사하게 된다. OpenSSH 시도 응답 정수 오...