Java


JAVA.LIB.HTTP.COOKIE : Insecure Cookie (Java)

要旨

An insecure cookie is created or used.

Cookies are tokens of information exchanged over a network connection. If that connection is encrypted, cookies are expected to be encrypted as well. However, this might not be the case if a cookie's secure flag is not set. This checker finds such insecure situations.

プロパティ

クラス名 Insecure Cookie (Java)
日本語クラス名 Insecure Cookie (Java)
クラス分類 セキュリティ (security)
ニーモニック JAVA.LIB.HTTP.COOKIE
カテゴリー
CWE CWE:614 Sensitive Cookie in HTTPS Session Without 'Secure' Attribute
対応言語 Java で利用可能です。
有効/無効設定 このワーニングクラスのチェックはデフォルトで有効になっています。チェックを無効にするにはプロジェクト設定ファイル (configuration file)に以下の WARNING_FILTER ルールを追加してください。
WARNING_FILTER += discard class="Insecure Cookie (Java)"

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Cookies extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    test1(resp);
    test2(resp);
    test3(resp);
    test4(resp);
    test5(resp);
    test6(resp);
    test7(resp);
  }

  private void test1(HttpServletResponse resp) {
    Cookie cookie = new Cookie("cake", "special value here");
    cookie.setSecure(true);
    resp.addCookie(cookie);
  }

  private void test2(HttpServletResponse resp) {
    Cookie cookie = new Cookie("cake", "special value here");
    cookie.setSecure(false);
    System.out.println("danger here!");
    resp.addCookie(cookie);  // "Insecure Cookie (Java)" warning issued here
  }

  private void test3(HttpServletResponse resp) {
    Cookie cookie = getSecureCookie();
    resp.addCookie(cookie);           // ok: getSecureCookie() returns a cookie whose secure flag is set    
  }

  private void test4(HttpServletResponse resp) {
    Cookie cookie = getInsecureCookie();
    resp.addCookie(cookie);  // "Insecure Cookie (Java)" warning issued here
  }

  private Cookie getSecureCookie() {
    Cookie cookie = new Cookie("cake", "special value here");
    cookie.setSecure(true);
    return cookie;
  }

  private Cookie getInsecureCookie() {
    Cookie cookie = new Cookie("cake", "special value here");
    cookie.setSecure(System.currentTimeMillis() % 2 == 0);
    return cookie;
  }

  private void test5(HttpServletResponse resp) {
    Cookie cookie = new Cookie("cake", "special value here");
    resp.addCookie(cookie);  // "Insecure Cookie (Java)" warning issued here
  }

  private void test6(HttpServletResponse resp) {
    Cookie cookie = getInsecureCookie();
    Cookie copy = cookie;
    copy.setSecure(true);
    resp.addCookie(cookie);           // ok: secure flag set (via copy)
  }

  private void test7(HttpServletResponse resp) {
    Cookie cookie = getInsecureCookie();
    cookie.setSecure(true);
    Cookie copy = cookie;
    copy.setSecure(false);
    resp.addCookie(cookie);  // "Insecure Cookie (Java)" warning issued here
  }
}

In this example, the programmer should always call setSecure(true) on all cookies that the code creates creates.

解決法

Set the secure flag of the cookie, after its creation.

関連のある設定ファイルパラメータ

設定ファイルの以下のパラメータがこのワーニングクラスのチェックに影響します。