2012-09-13 23 views
3

我們碰巧使用IBM應用掃描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

任何時候你打開一個流,確保finally結束時關閉流。

如果在從您的代碼流流將不會被關閉讀取則拋出IOException,因此警告

Java 7中讓一切變得簡單與資源建設嘗試。 Java 6中或更早,你需要有很多的樣板進行復制,如

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

使用Apache的共享的IOUtils類

您可以編寫自己的closeQuietly,如果你不希望添加的依賴

5

如果AppScan指出與readLine相關的拒絕服務漏洞,可能不是由於關閉關閉該流失敗的任何問題(但這很重要),而是由於readLine的無限性質。由於readLine會繼續讀取輸入,直到讀取換行符或CR-LF,所以如果輸入源不受信任,則可能會在沒有預期的CR-LF的情況下提供過多的數據,導致內存耗盡情況。

要解決這個問題,您可以確保(通過您的應用程序之外的機制)輸入大小被限制在某種安全合理的範圍內(儘管AppScan,Fortify和其他工具將繼續抱怨readLine),或者更好的是,你可以用一個有界的讀取程序替換你的readLine,這個程序設定了讀入緩衝區的字符數量的絕對最大值。