Secure Coding Guide | 널 포인터 역참조


정의

널(null)로 설정된 변수의 주소값을 참조했을 때 발생하는 보안약점이다.

영향

내부 정보 유출

안전하지 않은 소스코드

메소드로부터 반환된 NULL을 참조하는 경우

public Object returnNull() {
    return null;
}

public void testNull() {
    String str = returnNull().toString();
}
public void getInputFromFile() {
    try {
    BufferedReader br = new BufferedReader(new FileReader("input.dat"));
    String str = br.readLine();
    str.toUpperCase();
   ...
}

null을 반환하는 메소드 또는 표준라이브러리 메소드의 결과 값을 사 용할 경우 Null Pointer 역참조가 발생한다.
null을 반환하는 메소드를 사용할 경우 반환 값에 대해 null 검사를 한 후에 사용하도록 한다.

NULL을 직접 참조하는 경우

public class ForwardNullEx {
    public void test() {
        String uppercased = toUpperCase(null);
    }
		
    public String toUpperCase(String arg) {
       arg.toUpperCase();
    }
}

toUpperCase 메소드를 null 상수를 인자로 하여 호출합니다. toUpperCase 메소드 내에서 인자 arg를 참조할 때, arg에 null이 전달되므 로 Null Pointer 역참조가 발생한다.
null dereference가 발생하지 않도록 null 검사를 한 후에 변수를 사용해야 한다.

NULL과 비교한 적이 있는 값을 이후 비교 없이 사용하는 경우

public class UncheckedNullEx {
    public void test(String x) {
        String str = "";
        System.out.println(str);
        if(x != null) {
            str = x.toUpperCase();
        }
        x.toString();
    }
}

변수 “x"가 null일 가능성을 확인 후에 다시 “x"에 대한 null 검사 없이 사용 하였다.
null 가능성이 있는 변수에 대해 항상 null 검사를 하도록 한다.

NULL 검사를 잘못 했을 경우

String url = request.getParameter("url");

if ( url.equals("") || url == null ) {
    ...
}

변수 url에 대해 널검사를 하고 있으나, null 발생시 url.equals 에서 null Pointer 역참조가 발생한다.