2016-05-31 9 views
0

私はコードを持つpythonスクリプトを持っています。pythonでシェル= 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で、私はそれをサニタイズすることができます持っている、ことを見出しました。

私のコードを変更しました。だから、

+2

'bandit'は、コマンドの引数が十分に消されているかどうかを判断できません。セキュリティ上の問題である可能性のある方法で 'Popen'を使用していることを検出することしかできません。おそらく 'shell = False'を残し、' exec'によって直接使用できる方法で 'cmd'を自分自身で準備する方がよいでしょう。 – chepner

+0

アナライザは、実行しているコマンドが実行したいコマンドであるかどうかを判断できません。あなたがやっていることに応じて、([codejail](https://github.com/edx/codejail)を使って)intepreterをサンドボックス化するのが適切かもしれません。これには、入力サニタイズと緊密に制御されたオペレーティングシステムのアクセス許可の組み合わせが含まれます。 – gecko

+0

@chepner、 'exec'は' subprocess.exec'を意味しますか? – Nilesh

答えて

2

bandit -r mypackage/myfile.pyを実行したときに

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

しかし、それでもまだ、私は同じエラーを取得し、このエラーを削除するどのような方法があり、利用者は、彼が

ユーザーがいる場合に実行するコマンドを入力します。すでに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 

ユーザーがgrep -e 'a' /dev/null; rm -rf '' 'path'コマンドを生成するquery = "a' /dev/null; rm -rf '"を渡すことができます。

shell=Trueは、意図していない場合でも、この場合任意のコマンドを実行することができます。これはシェルインジェクションと呼ばれます。

素人攻撃を避けるためにpipes.quote(query)と呼ぶことができますが、一般的なケースでは失敗する可能性があります。その理由は、入力が信頼できる発信元からのものでない場合は避けるべきです。

+0

ありがとうSebastian、私は 'shell = True'を取り除くために何かを見つけ出そうとしますが、' shell = False'を作った後も 'bandit' raiseエラーです。 Severityのレベルを 'Hight'から' Low'に変更すると、これも削除する方法はありませんか? – Nilesh

+0

@Lafada 1 - 私の答えのポイントは、あなたのケースでは 'shell = True'を削除するのは無意味である可能性があるということです。あなたのコードをより安全にすることはできません。敵の警告を無効にする方法は、妥当だが異なる質問である。あなたはそれを別の質問として尋ねるべきです。 – jfs

+0

ここに私の新しい質問http://stackoverflow.com/questions/37661695/remove-bandit-notify-for-paramiko-and-subprocess-popen :) – Nilesh

関連する問題