설명
Java에서 null 참조로 인스턴스 메서드를 호출하거나 필드에 접근하면 NullPointerException이 발생합니다. 조회 결과나 외부 입력이 존재한다고 가정하고 바로 사용하면 요청이나 작업이 실패할 수 있습니다.
잠재적 영향
- 처리되지 않은 예외로 요청이나 백그라운드 작업이 중단될 수 있습니다. 반복적인 실패는 가용성에 영향을 줄 수 있지만, 일반적인 Java 참조의
null접근이 곧 프로세스 전체 종료나 메모리 손상을 의미하지는 않습니다.
해결 방법
null을 반환할 수 있는 입력과 조회 결과는 사용 전에 확인하세요.- 값이 없는 정상적인 경우와 프로그램 오류를 구분하고 적절한 응답이나 오류 처리로 연결하세요.
- 필수 입력을 검증하고 메서드의 반환 계약을 명확히 하세요.
예시
변경 전
userService, User, UserNotFoundException 등의 선언을 생략한 예시입니다. 변경 후의 예외는 적절한 오류 응답으로 처리하고, User.toString()이 민감한 정보를 노출하지 않는지도 확인하세요.
java
public class UserController {
public String getUserById(HttpServletRequest request) {
String userId = request.getParameter("id");
User user = userService.findUserById(userId);
return user.toString(); // user가 NULL이면 NullPointerException 발생
}
}
변경 후
java
public class UserController {
public String getUserById(HttpServletRequest request) {
String userId = request.getParameter("id");
User user = userService.findUserById(userId);
if (user == null) {
throw new UserNotFoundException("User not found for id: " + userId);
}
return user.toString();
}
}
설명:
- 변경 전: 호출된 findUserById 메서드가 NULL을 반환할 수 있으며, 그 경우 즉시 user.toString() 메서드가 호출되어 NullPointerException을 발생시킬 수 있습니다.
- 변경 후: findUserById 메서드의 결과를 검사하여, user가 NULL인 경우 적절한 예외를 발생시키므로 NullPointerException을 방지할 수 있습니다.
관련 CVE
- CVE-2005-3274: race condition causes a table to be corrupted if a timer activates while it is being modified, leading to resultant NULL dereference; also involves locking.
- CVE-2002-1912: large number of packets leads to NULL dereference
- CVE-2005-0772: packet with invalid error status value triggers NULL dereference