[시큐어 코딩] #9 정수 오버플로우 :: 잡다한 프로그래밍
반응형

1. 정수 오버플로우의 정의

정수형 변수의 오버플로우는 정수값이 증가하면서, 허용된 가장 큰 값보다 더 커져서 실제 저장되는 값은 아주 작은 수 이거나, 음수인 경우를 의미한다.

 

2. 안전한 코딩기법

언어 별 정수타입의 범위를 확인하여 사용한다. 정수형 변수를 연산에 사용하는 경우 결과값의 범위를 체크하는 모듈을 사용한다. 특히 외부 입력값을 동적으로 할당하여 사용하는 경우 변수의 값 범위를 검사하여 적절한 범위내에 존재하는지 확인한다.

 

3. 예시

다음의 예제는 외부의 입력을 이용하여 동적으로 계산한 값을 배열의 크기(size)를 결정하는데 사용하고 있다. 만일 외부 입력으로부터 계산된 값이 오버플로우에 의해 음수값이 되면 배열의 크기가 음수가 되어 문제가 발생할 수 있다.

따라서 size값이 음수인지 아닌지 검사하는 부분이 필요하다


4. 추가 예시

피드백받은 byte overflow 예시이다.

다음과 같이 InetAddress의 getByName 이용하면 127.0.0.1이 byte배열로 변하게 된다 즉 byte[] i = {127, 0, 0, 1}로 변환하게 된다. 이를 BigInteger에 담아서 BigInteger를 다시 Byte 배열로 변환하여 사용할 수 있다.

import java.math.BigInteger;
import java.net.InetAddress;

public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		 BigInteger i = null;
		  try {
		   InetAddress inet = InetAddress.getByName("127.0.0.1");
		   System.out.println(inet.getAddress()[3]);
		   i = new BigInteger(inet.getAddress());
		  } catch (Exception e) {
		   e.printStackTrace();
		  }
		  
		  System.out.println(i.toByteArray());
	}

}

127.0.0.1을 BigInteger로 변환한 결과는 다음과 같다

하지만 만약 127.0.0.1 대신 128.0.0.1을 사용하게되면 결과는 다음과 같다.

이를 다시 바이트 배열로 변환하여 출력하게되면 다음과 같은 -128.0.0.1이 출력된다

이는 byte가 -128~127까지 표현가능한데 128을 입력했기 때문에 다음과 같은 오버플로우가 발생하는것이다. 이를 정확하게 사용하기 위해서는 저장된 -128을 0xFF(11111111)과 &연산하거나 결과값에 256을 더해주는 방법으로 unsinged처럼 표현할 수 있다.

반응형

+ Recent posts