ハードコードされた認証情報

ハードコードされた認証情報の使用

説明

パスワードや認証用の鍵などの認証情報を、ソースコードに直接埋め込んで使用する場合に生じます。

想定される影響

  • 漏えいした認証情報を使い、保護された機能やデータに不正にアクセスされる可能性があります。
  • アカウントに高い権限がある場合は、その権限を悪用される可能性があります。

対処方法

  • 認証情報はアクセスを制限したシークレットストアで管理するか、デプロイ時の設定として渡します。実際の値をリポジトリにコミットしないでください。すでに漏えいした認証情報は無効化して交換します。
  • ユーザーのパスワード検証には、Spring SecurityのPasswordEncoderなど、実績のある機能を使用します。
  • ユーザーのパスワードは、復号できる暗号化や平文ではなく、パスワードの保存に適した一方向ハッシュで保存します。

例

変更前

java
@RestController
public class LoginController {

    private static final String USERNAME = "admin";
    private static final String PASSWORD = "admin123"; // ハードコードされたパスワード

    @PostMapping("/login")
    public String login(@RequestParam String username, @RequestParam String password) {
        if (USERNAME.equals(username) && PASSWORD.equals(password)) {
            return "로그인 성공";
        }
        return "로그인 실패";
    }
}

変更後

java
@RestController
public class LoginController {

    @Value("${credentials.username}")
    private String username;

    @Value("${credentials.password}")
    private String password;

    @PostMapping("/login")
    public String login(@RequestParam String username, @RequestParam String password) {
        if (this.username.equals(username) && this.password.equals(password)) {
            return "로그인 성공";
        }
        return "로그인 실패";
    }
}

説明:

  • 変更前: コードにアクセスできる人は、埋め込まれたパスワードを読み取れます。
  • 変更後: @Valueで外部設定を読み込む方法を示しています。実際のパスワードを設定ファイルにコミットせず、受け渡し経路とアクセス権限を保護してください。この平文比較は完全なログイン実装ではありません。ユーザー認証には適切なパスワードハッシュの検証が必要です。

関連するCVE

参考資料