権限のないユーザーへの機密情報の公開

権限のないユーザーへの機密情報の公開

説明

アクセスを許可されていないユーザーやシステムへ機密情報を公開すると、情報漏えいにつながります。

想定される影響

権限のないユーザーが機密データを取得し、システムや利用者に関する情報を悪用するおそれがあります。

対処方法

  1. 機密情報へのアクセスを厳しく制限してください。
  2. 最小権限の原則に従い、必要なユーザーにだけアクセスを許可してください。
  3. 保存時と通信時の機密データを適切に暗号化してください。暗号化はアプリケーションの認可確認の代わりにはなりません。
  4. セキュリティログを含め、ログから機密値を除外してください。

例

認証とユーザー別のアクセス確認を比較するコントローラーの抜粋です。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

参考資料