2011-06-14 79 views
4

我想使用org.apache.commons.exec Java庫來調用可執行文件。 CommandLine對象是否可以防止命令行注入?例如,如果我稱之爲:apache commons CommandLine對象可以防止命令行注入嗎?

String singleStringArgument = "-whatever;rm -rf ~/*"; // evil looking argument! 
CommandLine cl = new CommandLine(new File(pathToExe,exeName)); 

cl.addArgument(singleStringArgument); // oh no! 

Executor exe = new DefaultExecutor(); 
exe.execute(cl); 

rm -rf ~/*也除了本來的命令運行?如果確實如此,防止這種情況的最佳方法是什麼?

該API說addArgument()「處理引用」,但我不確定這意味着在這種情況下。我可以掀起一個測試案例來看看我的Linux機器上發生了什麼,但我想確保它在其他平臺上也是安全的。

回答

4

;是shell的一個特性。如果你沒有創建一個圍繞sh -c或類似的命令行,你不能注入。這並不是說普通人是安全的,它甚至沒有運行具有可調性的程序。

Commons CLI正在封裝Process類。 Process類沒有文檔來啓動shell。它被記錄在一個exec與您指定的內容的指定參數。

根據評論,開源的奇蹟之一是你可以閱讀源代碼。如果commons-CLI的版本X按照你喜歡的方式進行操作,請依賴它,並且不要在沒有重新檢查的情況下進行升級。

+0

我不打算直接運行'sh -c',但是我擔心apache commons的內部可能會在某些情況下通過系統shell進行調用 - 或者它們會以某種方式繞過shell嗎?在C中,我知道用用戶提供的普通輸入調用'system()'是不安全的,因爲'system()'用給定的參數調用'/ bin/sh -c'。 – 2011-06-14 00:55:13

+0

如果文檔沒有明確描述行爲,你可以看看源代碼 - 但是你會依賴於實現而不是規範。 – jdigital 2011-06-14 01:15:19

1

所以你控制命令(pathToExe),只擔心這個參數?你怎麼知道命令?有沒有可能執行另一個程序?即使沒有調用輔助命令,它是否有可能做一些破壞性的事情?程序是否有其他漏洞(緩衝區溢出等)?

作爲一般的答案,這種方法似乎對我來說很麻煩,特別是如果你想讓它跨平臺工作的話。如果你知道要執行的命令並且可以限制輸入,那麼你可能會吱吱嘎嘎,但是我個人不會使用這種方法,除非有充分的理由這樣做。

+0

總的來說,我會同意。不過,在這種情況下,pathToExe和可執行代碼本身是已知的,並且已經過很好的測試。如果有人惡意將文件系統中的真正exe文件替換爲其他惡意exe文件,那麼他們有足夠的權限對​​初始Java執行相同的操作。欣賞反饋雖然 - 我upvoted你:) – 2011-06-14 01:10:49

0

我的建議是儘可能讓程序在安全方面犯錯,只發出命令本身,而不是愚蠢地執行命令片段或傳遞由最終用戶發佈的參數。注射劑有很多種類。 ;已經討論過。您也可以使用反引號(反包中的rm -rf ~/*使得shell首先解釋它)用戶還可以意外或有意地調用別名。可能出錯的事情清單是無止境的。

+1

所有這些* shell *功能。 – bmargulies 2011-06-14 15:17:40

相關問題