본문 바로가기
Back/Java

[JAVA][시큐어코딩] Null Pointer 역참조에 대응하기

by 은z 2024. 8. 1.

상황

프로젝트 마무리 단계에서 소스코드 보안약점 진단 실행 후, 수정이 필요한 사항이 생겼다.

Null Pointer 역참조에 대한 개념과 수정 방안에 대해 정리해보겠다.

 

 


 

✔️Null Pointer 역참조 ???

널 포인터(Null Pointer) 역참조는 ‘일반적으로 그 객체가 널(Null)이 될 수 없다’라고 하는 가정을 위반했을 때 발생한다. 

공격자가 의도적으로 널 포인터 역참조를 발생시키는 경우, 그 결과 발생하는 예외 상황을 이용하여 추후의 공격을 계획하는 데 사용될 수 있다.

이 취약점으로 인해 의도치 않게 프로그램이 종료되는 경우가 생길 수 있으니 주의 깊게 다루어야 중요한 부분이다.

 

📌 이 게시글은 이전에 작성한 게시글 내에 있는 코드에서 Null Pointer 역참조가 발생할 수 있는 부분을 찾아 수정해보겠다.

(아래 게시글에서 CodeToEnumConverterFactory.java 부분 참고)

2024.04.15 - [Back/Spring Boot] - 컨트롤러에서 Enum 타입 @RequestParam @PathVariable로 매핑하기

 

컨트롤러에서 Enum 타입 @RequestParam @PathVariable로 매핑하기

상황 컨트롤러 단에서 Get Mapping 시, Enum 타입의 코드 값을 넘겨주고 받도록 코드를 구현했다. 그런데 해당 api 호출 시에 에러를 뱉었다. /api/enum-test?enumType=T 로 호출 시 에러 발생 (enum 타입의 코드

zoetechlog.tistory.com

 

 

 

✔️보안 대책

미리 해당 값이 Null 값을 체크해주는 로직을 만들어주면 된다.

 

✔️보안 취약점 대응

📌 [수정 전]CodeToEnumConverterFactory.java

// 단순 설명을 위해 일부 메소드는 발췌함

@Override
public T convert(String source) {
    if (source.isEmpty()) {
        return null;
    }

    T[] constants = enumType.getEnumConstants();
    for (T c : constants) { // constants 가 null 일수 있기에 check하는 로직이 필요하다.
        if (constantEnum) {
            if (((CommonType) c).getCode().equals(source.trim())) {
                return c;
            }
        } else {
            if (c.name().equals(source.trim())) {
                return c;
            }
        }
    }
    return null;
}

✏️ 10라인을 보면 constants 가 null 일수 있기에 check하는 로직이 필요하다.

 

 

 

📌 [수정 후]CodeToEnumConverterFactory.java

@Override
public T convert(String source) {
    if (source.isEmpty()) {
        return null;
    }

    T[] constants = enumType.getEnumConstants();
    if (constants == null) { // constants 가 null일 경우를 check 하고 있다.
        return null;
    }

    String trimmedSource = source.trim();
    for (T c : constants) {
        if (c == null) {
            continue;
        }

        if (constantEnum) {
            String code = ((CommonType) c).getCode();
            if (code != null && code.equals(trimmedSource)) {
                return c;
            }
        } else {
            if (c.name().equals(trimmedSource)) {
                return c;
            }
        }
    }
    return null;
}

✏️위에 수정된 코드를 보면 constants 가 null일 경우를 check 하고 있다.

 

 

댓글