2016-05-31 34 views
0

我有python腳本,它有代碼。在shell中使用shell = True的子進程的消毒輸入

... 
... 
p = subprocess.Popen(cmd, 
        stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE, 
        shell=True) 
output, error = p.communicate() 
... 
... 

當我運行bandit它會給出錯誤。

>> Issue: [B602:subprocess_popen_with_shell_equals_true] subprocess call with shell=True identified, security issue. 
    Severity: High Confidence: High 
    Location: mypackage/myfile.py:123 
123           stderr=subprocess.PIPE, 
124           shell=True) 
125      output, error = p.communicate() 

然後我做了一些谷歌,並發現,我有我的消毒輸入和與shlex.splitshlex.quote我可以清理它。

我將我的代碼更改爲。

... 
... 
p = subprocess.Popen(shlex.split(shlex.quote(cmd)), 
        stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE, 
        shell=True) 
output, error = p.communicate() 
... 
... 

但我仍然得到同樣的錯誤,有沒有辦法消除這種誤差運行bandit -r mypackage/myfile.py

+2

'bandit'無法確定命令參數是否被充分消毒;它只能檢測到你正在使用'Popen',這可能會成爲一個安全問題。你最好離開'shell = False'並準備'cmd',這個方式可以直接被'exec'使用。 – chepner

+0

分析器無法判斷您運行的命令是否是您希望運行的命令。根據你正在做什麼,沙盒化intepreter(例如[codejail](https://github.com/edx/codejail))可能是合適的或必要的。這涉及輸入消毒和嚴格控制的操作系統權限的組合。 – gecko

+0

@chepner,'exec'的意思是'subprocess.exec'? – Nilesh

回答

2

時那麼,用戶輸入他想要運行

如果用戶命令已經可以運行任何命令,包括bash,那麼bandit的關於shell=True的警告不適用。

警告纔有意義,如果用戶只允許選擇一些參數,對於一個固定的命令例如用於grep命令搜索查詢:

rc = call(['grep', '-e', query, path]) 

任何用戶指定的query的;它不會讓它運行一些其他的命令(只有grep運行)。

shell=True比較:

rc = call("grep -e '%s' '%s'" % (query, path), shell=True) #XXX don't do it 

用戶可以通過query = "a' /dev/null; rm -rf '"會產生grep -e 'a' /dev/null; rm -rf '' 'path'命令。

shell=True允許用戶在這種情況下運行任意命令,即使它不是有意的。它被稱爲殼注射。

您可以撥打pipes.quote(query),以避免天真的攻擊,但在一般情況下它可能會失敗,這就是爲什麼shell=True應該避免,如果輸入不是來自可信來源。

+0

謝謝塞巴斯蒂安,我會試圖找出某些東西去除'shell = True',但是在做出shell = False之後,仍然會出現'bandit'的錯誤。它會將'嚴重性'級別從'Hight'更改爲'低級',那麼還有沒有辦法將其刪除呢? – Nilesh

+0

@Lafada 1-我的答案是,在你的情況下刪除'shell = True'很可能毫無意義 - 它不會讓你的代碼更安全。 2-如何禁用強盜的警告是一個有效但不同的問題。你應該把它作爲一個單獨的問題來提出。 – jfs

+0

這裏我的新問題http://stackoverflow.com/questions/37661695/remove-bandit-notify-for-paramiko-and-subprocess-popen :) – Nilesh