説明
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になります。 - 変更後: 検索結果を確認し、ユーザーが存在しない場合はアプリケーション固有の例外を返すため、そのnull参照の使用を防げます。
関連CVE
- CVE-2005-3274:タイマーとテーブル更新の競合によるnull参照
- CVE-2002-1912:大量のパケットによるnull参照
- CVE-2005-0772:不正なエラー状態を持つパケットによるnull参照