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