3

我们碰巧使用了 IBM appscan http://www-01.ibm.com/software/awdtools/appscan/

针对我们的 java 代码库,它返回了大约 3000 个高严重性漏洞。

它们中的大多数恰好是系统信息泄漏,当我们在 catch 块中打印堆栈跟踪时它认为正在发生这种情况,但我们只打印它正在发生的文件名和行号,使我们能够更好地调试代码。

还有一些是关于 SQL 注入、输入验证等的。

但是,我的问题是关于资源耗尽(文件描述符、磁盘空间、套接字……),它列出了所有实例java.io.BufferedReader.readLine作为可能的外部攻击的位置。

       InputStream ins=conn.getInputStream();

      String inputLine;

      if (!preserveLinefeeds) {
         BufferedReader in = new BufferedReader(new InputStreamReader(ins));
         while ((inputLine = in.readLine()) != null)
            pr.readThreadResponse+=inputLine;
         in.close();
         ins.close();
      } 

conn 是一个 HttpURLConnection 对象。

如何在代码中添加安全防护以防止这种情况发生?

4

2 回答 2

7

如果 AppScan 指示与 readLine 关联的拒绝服务漏洞,则可能不是由于对关闭流失败的任何担忧(无论这可能多么重要),而是由于 readLine 的无限性质。由于 readLine 会继续读取输入,直到读取换行符或 CR-LF,如果输入源不受信任,则可能会在没有预期 CR-LF 的情况下向您提供大量数据,从而导致内存耗尽情况。

To resolve this you could either ensure (through mechanisms outside your app) that the input size is limited to something safe and reasonable (although AppScan, Fortify and other tools will continue to complain about the readLine) or, better yet, you could replace your readLines with a bounded read routine that sets an absolute maximum on the number of characters that will be read into the buffer.

于 2012-11-16T05:41:22.437 回答
2

每次打开流时,请确保 finally 块在完成后关闭流。

如果从代码中的流读取时抛出 IOException,则流将不会关闭,因此会发出警告

Java 7 使用 try with resources 构造使这变得容易。在 Java 6 或更早版本中,您需要使用大量样板进行复制,例如

InputStream ins = null;
try {
  ins = conn.getInputStream();
  ...
} finally {
  IOUtils.closeQuietly(ins);
}

使用 Apache Commons 中的 IOUtils 类

如果您不想添加依赖项,您可以编写自己的 closeQuietly

于 2012-09-13T18:49:37.483 回答