例 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 つのコメント行が含まれています)。