説明
ユーザーの身元を確認しない、または確認が不十分な場合に生じる問題です。攻撃者が権限のないデータにアクセスしたり、操作を実行したりする可能性があります。
想定される影響
- 情報漏えい: 認証せずにアプリケーションのデータを読み取られる可能性があります。
- 権限の悪用やなりすまし: 権限のないユーザーが高い権限を得たり、別のユーザーとして操作したりする可能性があります。
- 不正な実行: コードやコマンドを実行する機能が公開されている場合、未認証のユーザーに悪用されるおそれがあります。
対処方法
- 信頼できる認証方式で、ユーザーやシステムの身元を確認します。
- 多要素認証を導入します。
- HTTPSの使用などにより、認証に関するデータを保存時と通信時に保護します。
例
変更前
java
@PostMapping("/login")
public String login(String username, String password, HttpSession session) {
if (username.equals("admin") && password.equals("admin")) {
session.setAttribute("user", "admin");
return "dashboard";
}
return "login";
}
変更後
java
@PostMapping("/login")
public String login(String username, String password, HttpSession session) {
User user = userService.authenticate(username, password);
if (user != null) {
session.setAttribute("user", user);
return "dashboard";
}
return "login";
}
説明:
- 変更前: 固定されたユーザー名とパスワードに依存しているため、攻撃者がそれらを使って本来の本人確認を回避できる可能性があります。
- 変更後: ユーザー名とパスワードの検証を認証サービスに委ねています。メソッドを分けるだけで安全な認証が保証されるわけではありません。サービス側でパスワードハッシュの検証と失敗時の処理を正しく実装する必要があります。
関連するCVE
- CVE-2022-35248: チャットアプリケーションのCAS設定で検証が省略され、認証の第2要素が失われる問題
- CVE-2022-36436: 認証プロキシが初期ハンドシェイクでパスワードを要求せず、'None'認証方式を受け入れる問題
- CVE-2022-30034: Python RPCフレームワークのWeb UIで、ログインメールの正規表現にアンカーがない(CWE-777)ため、OAuthを回避できる可能性がある問題(CWE-1390)