説明
アクセスを許可されていないユーザーやシステムへ機密情報を公開すると、情報漏えいにつながります。
想定される影響
権限のないユーザーが機密データを取得し、システムや利用者に関する情報を悪用するおそれがあります。
対処方法
- 機密情報へのアクセスを厳しく制限してください。
- 最小権限の原則に従い、必要なユーザーにだけアクセスを許可してください。
- 保存時と通信時の機密データを適切に暗号化してください。暗号化はアプリケーションの認可確認の代わりにはなりません。
- セキュリティログを含め、ログから機密値を除外してください。
例
認証とユーザー別のアクセス確認を比較するコントローラーの抜粋です。getUserDetails()はサンプルデータを返す代用で、実際の検索処理は省略しています。Principalはサーバーが認証した主体であり、その名前とuserIdは同じユーザー識別方式を使う必要があります。
変更前
java
@RestController
public class UserController {
@GetMapping("/user")
public String getUserInfo(@RequestParam String userId) {
// ユーザー別のアクセス確認がない
return "Displaying user info: " + getUserDetails(userId);
}
private String getUserDetails(String userId) {
// ユーザー情報の検索を代用
return "User Details"; // 簡略化したサンプルデータ
}
}
変更後
java
@RestController
public class UserController {
@GetMapping("/user")
public ResponseEntity<String> getUserInfo(@RequestParam String userId, Principal principal) {
// 認証主体と要求されたユーザーの一致を確認
if (principal == null || !principal.getName().equals(userId)) {
return new ResponseEntity<>("Access Denied", HttpStatus.FORBIDDEN);
}
return new ResponseEntity<>("Displaying user info: " + getUserDetails(userId), HttpStatus.OK);
}
private String getUserDetails(String userId) {
// ユーザー情報の検索を代用
return "User Details"; // 簡略化したサンプルデータ
}
}
説明:
- 変更前: 実際の検索処理が機密データを返し、別の認可確認もない場合、他のユーザーのIDを指定して情報を取得できるおそれがあります。
- 変更後: 認証主体が存在しない場合や、要求したIDが一致しない場合は拒否します。認証設定とは別に本人の情報へのアクセス条件を確認し、返す項目も必要な範囲に制限してください。
関連CVE
- CVE-2022-31162: Rust library leaks Oauth client details in application debug logs
- CVE-2021-25476: Digital Rights Management (DRM) capability for mobile platform leaks pointer information, simplifying ASLR bypass
- CVE-2001-1483: Enumeration of valid usernames based on inconsistent responses