説明
パスワードや認証用の鍵などの認証情報を、ソースコードに直接埋め込んで使用する場合に生じます。
想定される影響
- 漏えいした認証情報を使い、保護された機能やデータに不正にアクセスされる可能性があります。
- アカウントに高い権限がある場合は、その権限を悪用される可能性があります。
対処方法
- 認証情報はアクセスを制限したシークレットストアで管理するか、デプロイ時の設定として渡します。実際の値をリポジトリにコミットしないでください。すでに漏えいした認証情報は無効化して交換します。
- ユーザーのパスワード検証には、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
- CVE-2022-29953: Condition Monitorファームウェアの保守用インターフェースにあるハードコードされた認証情報
- CVE-2022-29960: Engineering Workstationのハードコードされた暗号鍵による不正なファイルシステムアクセスと権限昇格の可能性
- CVE-2022-29964: Distributed Control System(DCS)のローカルシェルアクセスに使われるハードコードされたパスワード