示例 1:从源到接收器

在以下代码样本中,main 方法调用方法 getVulnerableSource,后者返回一个字符串。请注意,虽然该方法从完全未知的文件读取数据,但是它从不检查所返回数据的有效性。然后,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 方法(通过 main 连接两个调用堆栈)。“数据流”部分显示了 main 方法的操作中传递感染的行号。在此示例中,两个方法调用存在于方法内的同一行(第 15 行)上(在上面的样本代码中,这将转换为第 7 行,因为在截屏中,文件包含 8 行注释)。