SV.AUTH.BYPASS.MUST

不正確な認証

loggedIn クッキーをチェックして、そのユーザーが既にログインしているかを確認するユースケースもありえます。ログインしていない場合、そのコードはユーザーが指定したユーザー名とパスワードを使用して認証を実行します。正常に実行されると、コードはユーザーが既にログインしていることを「記憶」するように loggedIn とユーザーのクッキーを設定します。SV.AUTH.BYPASS.MUST チェッカーは、ユーザー認証に使用されている方法が十分でかつ認証がバイパスされないものであるかどうかを検証します。

このチェッカーは、本体で .getParameter() または .get() のいずれかと一緒に "userName" と "password" が使用されている場合に欠陥を報告します。

脆弱性とリスク

アクターがその特定のアイデンティティを主張していても、その主張の正しさがソフトウェアで (十分に) 証明されない場合、この脆弱性は意図しないアクターへのリソースまたは機能の露出につながりかねません。この脆弱性があると、攻撃者に機密情報が漏れたり、任意のコードを実行するチャンスを与えたりする可能性があります。

脆弱コード例 1

コピー
  import jakarta.servlet.http.*;
   public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       Map<String, String> result = new HashMap<>();
 
       // result contains cookie values from request
       ...
       if ("true".equals(result.get("loggedIn"))
       {
           if (! AuthenticateUser(request.getParameter("password"), ...)) { // user authentication
               System.out.error("Error: you need to log in first");
          }
          else {
              Cookie loggedIn = new Cookie("loggedIn", "true");
              ...
          }
      }
  }

Klocwork は、7 行目で SV.AUTH.BYPASS.MUST の欠陥を報告し、「クッキー 'loggedIn' の使用は認証のバイパスを引き起こす可能性があります」を示します。この例では、ブラウザーで loggedIn クッキーが設定されて認証がバイパスされる可能性があります。

修正コード例 1

コピー
   import javax.servlet.http.*;
   public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       Map<String, String> result = new HashMap<>();
     
       if (! AuthenticateUser(request.getParameter("password"), ...)) { // user authentication
           System.out.error("Error: you need to log in first");
       }
       else {
           Cookie loggedIn = new Cookie("loggedIn", "true");
           ...
      }
  }

修正されたこの例では、認証のバイパスに使用される可能性のあるクッキーが使用されていないため、Klocwork はもはや欠陥を報告しません。

関連チェッカー

セキュリティトレーニング

Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。