상황
프로젝트 마무리 단계에서 소스코드 보안약점 진단 실행 후, 수정이 필요한 사항이 생겼다.
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 하고 있다.
'Back > Java' 카테고리의 다른 글
[JAVA][시큐어코딩] 적절하지 않은 난수 값 사용 (0) | 2024.08.01 |
---|---|
[JAVA] 파일 관련 Stream, I/O 성능 개선 (File 복사 기능) (2) | 2024.07.24 |
[JAVA] Stream Collectors.groupingBy 널(null) 사용하기 (0) | 2023.04.07 |
[Java] Stream 스트림으로 중복 값 찾기 (0) | 2023.02.22 |
[Java] Optional 개념, 사용법 (1) | 2023.02.21 |
댓글