2012-10-02 1425 views
3

以下簡單的java代碼獲取Fortify Path Manipulation錯誤。請幫我解決這個問題。我很久沒有掙扎了。如何解決某些Java代碼中的「路徑操作漏洞」?

public class Test { 
    public static void main(String[] args) { 
     File file=new File(args[0]); 
    } 

} 
+0

你什麼時候得到錯誤?運行它或編譯它?你是如何編譯的?你在進口什麼? – Joe

+0

你傳遞什麼參數值? – MaVRoSCy

+0

我沒有收到java編譯錯誤,我運行Fortify Sourceanalyzer,然後顯示路徑操作漏洞。 – mohan

回答

4

看着爲Path Manipulation OWASP的頁面,它說

攻擊者可以指定在操作中使用文件系統中的路徑

您正在打開一個文件所界定用戶給定的輸入。你的代碼幾乎就是這個漏洞的完美例子!無論是

  1. 不要使用上面的代碼(不要讓用戶指定輸入文件作爲參數)
  2. 讓用戶從您提供的(文件與文件排列的列表中選擇一個整數選項)
  3. 不要讓用戶提供文件名,刪除可配置性
  4. 接受該漏洞,但通過檢查文件名來防止該漏洞(儘管這是最糟糕的事情 - 有人可能會暈倒它無論如何)。

或重新考慮你的應用程序的設計。

1

只允許輸入alnum和句點。這意味着你會過濾掉控制字符,「..」,「/」,「\」,這會使你的文件變得脆弱。例如,不應該輸入/path/password.txt。

完成後,重新掃描,然後運行Fortify AWB。

0

假設您針對Web應用程序運行Fortify,在對Fortify漏洞進行分類時可能會標記爲「不是問題」。推理是A)顯然這是測試代碼和B)除非你有多重人格障礙,否則當你運行該測試應用程序時,你不會對自己進行路徑操縱漏洞利用。

如果看到很少有測試實用程序被提交到一個產生這種誤報風格的存儲庫中很常見。

至於你的編譯錯誤,通常歸結爲類路徑問題。

-1

使用正則表達式來驗證該文件的路徑和文件名

fileName = args[0]; 
final String regularExpression = "([\\w\\:\\\\w ./-]+\\w+(\\.)?\\w+)"; 
Pattern pattern = Pattern.compile(regularExpression); 
boolean isMatched = pattern.matcher(fileName).matches(); 
0

Fortify的將標記即使路徑/文件並非來自像一個屬性文件中用戶輸入的代碼。處理這些問題的最佳方法是首先對路徑進行規範化,然後然後根據允許路徑的白名單對其進行驗證。

壞:

public class Test { 
    public static void main(String[] args) { 
     File file=new File(args[0]); 
    } 

} 

好:

public class Test { 
    public static void main(String[] args) { 
     File file=new File(args[0]); 
     if (!isInSecureDir(file)) { 
       throw new IllegalArgumentException(); 
      } 
      String canonicalPath = file.getCanonicalPath(); 
     if (!canonicalPath.equals("/img/java/file1.txt") && 
      !canonicalPath.equals("/img/java/file2.txt")) { 
      // Invalid file; handle error 
     } 

     FileInputStream fis = new FileInputStream(f); 
    } 

來源:https://www.securecoding.cert.org/confluence/display/java/FIO16-J.+Canonicalize+path+names+before+validating+them

0

我有一個解決Fortify的路徑操作的問題。

它抱怨的是,如果你從外部源獲取數據,那麼攻擊者可以使用該源來操縱你的路徑。因此,使攻擊者可以刪除文件或以其他方式危害系統。

對此問題的建議補救措施是使用受信任目錄的白名單作爲有效輸入;並拒絕其他一切。

該解決方案在生產環境中並不總是可行的。所以,我建議一個替代解決方案。解析可接受字符的白名單的輸入。從輸入中拒絕任何你不想在路徑中的角色。它可以被刪除或替換。

下面是一個例子。這確實通過了Fortify審查。在這裏記住返回字面值而不是被檢查的字符是很重要的。 Fortify會跟蹤來自原始輸入的部分。如果您使用任何原始輸入,您仍然可能會遇到錯誤。

public class CleanPath { 

    public static String cleanString(String aString) { 
     if (aString == null) return null; 
     String cleanString = ""; 
     for (int i = 0; i < aString.length(); ++i) { 
      cleanString += cleanChar(aString.charAt(i)); 
     } 
     return cleanString; 
    } 

    private static char cleanChar(char aChar) { 

     // 0 - 9 
     for (int i = 48; i < 58; ++i) { 
      if (aChar == i) return (char) i; 
     } 

     // 'A' - 'Z' 
     for (int i = 65; i < 91; ++i) { 
      if (aChar == i) return (char) i; 
     } 

     // 'a' - 'z' 
     for (int i = 97; i < 123; ++i) { 
      if (aChar == i) return (char) i; 
     } 

     // other valid characters 
     switch (aChar) { 
      case '/': 
       return '/'; 
      case '.': 
       return '.'; 
      case '-': 
       return '-'; 
      case '_': 
       return '_'; 
      case ' ': 
       return ' '; 
     } 
     return '%'; 
    } 
} 
+0

這不是一個解決方案,只是簡單地掩蓋了漏洞並且無法解決問題。我將這稱爲不誠實的方法,並建議將漏洞實例標記爲誤報。至少你有機會解釋爲什麼這個漏洞不是一個問題。 – ProbablyJody