如何防范资源耗尽和其他漏洞?

时间:2012-09-13 18:01:56

标签: java resources exploit

我们碰巧使用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对象。

如何在代码中添加safegaurds来防止这种情况?

2 个答案:

答案 0 :(得分:5)

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

要解决此问题,您可以确保(通过应用程序以外的机制)输入大小限制为安全合理(尽管AppScan,Fortify和其他工具将继续抱怨readLine),或者更好的是,你可以使用有界读取例程替换readLines,该例程设置将被读入缓冲区的字符数的绝对最大值。

答案 1 :(得分: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