例 1: ソースからシンク

以下のサンプル・コードでは、文字列を返す getVulnerableSource というメソッドが main メソッドから呼び出されます。メソッドは全くの未知のファイルからデータを読み取りますが、返されたデータの妥当性をチェックしないことに注意してください。次に、この汚染されたデータが main メソッドから writeToVulnerableSink に渡されます。writeToVulnerableSink メソッドは、受け取ったデータをファイルに書き出します。その際、データの妥当性は検査されません。

import java.io.*;

public class TestCase_IOT_Static {
  public static void main(String[] args) {
    try {
      writeToVulnerableSink(getVulnerableSource(args[0]));
    } catch (Exception e) {
    }
  }

  public static String getVulnerableSource(String file)
    throws java.io.IOException, java.io.FileNotFoundException {
    FileInputStream fis = new FileInputStream(file);
    byte[] buf = new byte[100];
    fis.read(buf);
    String ret = new String(buf);
    fis.close();
    return ret;
  }

  public static void writeToVulnerableSink(String str)
    throws java.io.FileNotFoundException {
    FileOutputStream fos = new FileOutputStream(str);
    PrintWriter writer = new PrintWriter(fos);
    writer.write(str);
  }
}

このコード・サンプルは次のトレースを生成します。


「トレース」ビュー

このペインは、maingetVulnerableSource を呼び出し、これが FileInputStream.read を呼び出す入力スタックと、mainwriteToVulnerableSink を呼び出し、これが PrintWriter.write を呼び出す出力スタックを示しています。グラフには、read メソッドから write メソッドまでのデータ・フローと、2 つの呼び出しスタックをつなぐ main が表示されていますデータ・フローのセクションには、main メソッドにおいて汚染されたデータが渡される操作の行番号が表示されています。この例では、両方のメソッド呼び出しがメソッド内の同じ行 (15 行目) に存在します (上のサンプル・コードでは、これが行番号 7 になっています。画面キャプチャーでは、ファイルに 8 つのコメント行が含まれています)。