EN JP CN

Java チューニングチュートリアル 1 および 2 - 誤検知を低減するための SV.XSS.REF のチューニング

Java チューニングチュートリアル 1 および 2 - 誤検知を低減するための SV.XSS.REF のチューニング

Java チューニングチュートリアル 1 および 2 - 誤検知を低減するための SV.XSS.REF のチューニング

Java チューニングチュートリアル 1 および 2 - 誤検知を低減するための SV.XSS.REF のチューニング
注: これらの例では、プロジェクトソースディレクトリを使用し、以下を PATH に追加していることを前提としています。<User_install>/bin.

次のサーブレットがあるとします。

package com.klocwork.jdefects.checkers.tuning_walkthrough;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import java.io.IOException;

public class CheckTrueSample1 extends HttpServlet {

   
   protected void doGet(final HttpServletRequest request,  final HttpServletResponse response)        
         throws ServletException, IOException {     
      super.doGet(request, response);     
      String name = request.getParameter("name");     
      ServletOutputStream outputStream = response.getOutputStream();     
      outputStream.println("<html><body>");     
      outputStream.println("Name: " + name);      
      outputStream.println("<body></html>");   
   }
}

kwcheck は抜粋の SV.XSS.REF を検出します。

unchecked user data 'name' coming from the request (String name = request.getParameter("name");0 is used to form the web content (outputStream.println("Name:" + name);) which leads to a cross-site scripting (XSS) vulnerability.

2 種類の検証の可能性

指摘を修正するために、検証ルーチンが開発されています。

  • isValid はユーザー入力が安全な場合に true を返し、それ以外の場合は false を返します。
  • isInvalid はユーザー入力が安全な場合に false を返し、それ以外の場合は true を返します。

例:

public class Validation {


   private Validation() {   
   }

   public static boolean isValid(String s) {      
      boolean b = s.length() < 256;     
      // add your validation code here      
      return b;  
   }

   public static boolean isInvalid(String s) {     
      boolean b = s.length() >= 256;     
      // add your validation code here     
      return b; 
   }
}

チュートリアル 1:指摘を修正するための IsValid メソッドの追加

isValid を使用して XSS を修正します。

package com.klocwork.jdefects.checkers.dfa.binding_walkthrough;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import java.io.IOException;

public class CheckTrueSample2 extends HttpServlet {

      protected void doGet(final HttpServletRequest request, final HttpServletResponse response)       
         throws ServletException, IOException {    
      super.doGet(request, response);   
      String name = request.getParameter("name");  
      ServletOutputStream outputStream = response.getOutputStream();     
      outputStream.println("<html><body>");  
      if (Validation.isValid(name)) {       
         outputStream.println("Name: " + name);   
      }  
      outputStream.println("<body></html>");  
   }
}

フィールド解析を再度実行すると、検証が追加されます。

kwcheck run

検証が追加されても、チェッカーでは検証メソッドが登録されず、引き続き kwcheck によって指摘が報告されます。

.jkb ファイルの作成および isValid メソッドの記述

  1. 拡張子 .jkb のテキストファイルを作成します。たとえば、checktrue.jkbなどです。
  2. ファイルにメソッドを記述し、メソッドが true を返す場合はデータが有効であることを指定します。
public class Validation {  
   public static boolean isValid(@CheckTrue String s);  
}

CheckTrue レコードのチェッカーへのバインド

@CheckTrue レコードを追加した後は、@Bind 注釈を使用してSV.XSS.REFチェッカーにバインドする必要があります。

.jkb がネイティブの knowledge base (ナレッジベース) を直接編集できない既存チェッカーの動作を変更するため、バインドが必要になります。

@Bind("SV.XSS.REF")
public class Validation {  
   public static boolean isValid(@CheckTrue String s);  
}

knowledge base (ナレッジベース) のテスト

knowledge base (ナレッジベース) をテストするには:

  1. kwcheck を使用して knowledge base (ナレッジベース) をプロジェクトにインポートします。
    kwcheck import checktrue.jkb
    
  2. 解析を実行します。
    kwcheck run
    

入力が使用前に検証され、knowledge base (ナレッジベース) によって検証の存在が SV.XSS.REF チェッカーに「通知」されるため、指摘が報告されなくなります。

チュートリアル 2:指摘を修正するための IsInvalid メソッドの追加

IsInvalid メソッドを使用して指摘を修正します。

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import java.io.IOException;

public class CheckFalseSample2 extends HttpServlet {


   protected void doGet(final HttpServletRequest request, final HttpServletResponse response)     
         throws ServletException, IOException {      
      super.doGet(request, response);   
      String name = request.getParameter("name");     
      ServletOutputStream outputStream = response.getOutputStream();      
      outputStream.println("<html><body>"); 
      try {      
         if (Validation.isInvalid(name)) {         
            return;       
         }      
         outputStream.println("Name: " + name);     
      } finally { 
         outputStream.println("<body></html>");     
      }   
   }
}

汚染されている場合はメソッドを終了し、Web ページの 'name' を使用しないため、XSS が修正されます。

フィールド解析を再度実行すると、検証が追加されます。

kwcheck run

検証が追加されても、チェッカーでは検証メソッドが登録されず、引き続き kwcheck によって指摘が報告されます。

.jkb ファイルの作成および isInvalid メソッドの記述

  1. checkfalse.jkb のように、拡張子が .jkb のテキストファイルを作成します。
  2. ファイルに isInvalid メソッドを記述します。
public class Validation {   
   public static boolean isInvalid(@CheckFalse String s);  
}

CheckFalse レコードの指摘へのバインド

@CheckFalse レコードを追加した後は、@Bind 注釈を使用して指摘を SV.XSS.REF にバインドする必要があります。

.jkb がネイティブの knowledge base (ナレッジベース) を直接編集できない既存チェッカーの動作を変更するため、バインドが必要になります。

@Bind("SV.XSS.REF")
public class Validation {
   public static boolean isInvalid(@CheckFalse String s);  
}

knowledge base (ナレッジベース) のテスト

knowledge base (ナレッジベース) をテストするには:

  1. kwcheck を使用して knowledge base (ナレッジベース) をプロジェクトにインポートします。
    kwcheck import checkfalse.jkb
    
  2. 解析を実行します。
    kwcheck run
    

指摘が報告されなくなります。