基本的に、どのpythonの関数がbashをトリガーし(そしてShellshockの影響を受ける可能性があります)、どれをしないのですか?
いくつかのスクリプトでpopen()
関数を見て、この質問を思いつきました。
私の質問はPython 2と3の両方に関係しています。
Anyある時点でbash
を呼び出すプログラムが影響を受けます。特に _os.system
_ 関数は脆弱ですシステムに_/bin/sh
_としてbash
がある場合、それを呼び出すすべてのプログラム(またはいくつかの相当)も脆弱です。
popen
関数canは、渡された引数に応じて脆弱になります。ドキュメントからの引用:
また、これらのバリアントのそれぞれについて、Unixでは
cmd
がシーケンスである場合があります。その場合、引数はシェルの介入なしにプログラムに直接渡されます(-os.spawnv()
と同様) )。cmd
が文字列の場合は、シェルに渡されます(os.system()
の場合と同様)。
私の理解では、これは次のような呼び出しを意味します:
_os.popenx(['executable', 'some', 'arguments'])
_
次の形式のコマンドでシェルが呼び出されないため、安全です。
_os.popenx('executable some argument')
_
シェルは文字列をコマンドラインとして解釈するために使用されるため、脆弱です。
allpopen
関数はpython2.6以降廃止されており、それ以降は回避されるべきであったことにも注意してください。 subprocess
モジュールは、デフォルトでShellshockセーフであるサブプロセスを起動するためのはるかに優れたインターフェイスを提供します。 _Shell=True
_引数を渡さない場合、プログラムはサブシェルを起動しないため、Shellshockの影響を受けません。
subprocess
を安全に使用するには、_Shell=True
_引数をできるだけ使用しないようにする必要があります(これは、Shellshockが発見される前にも当てはまり、セキュリティの危険性として既に十分に文書化されています)。
特に、単に実行可能ファイルを起動したい場合は _subprocess.call
_ を使用します:
_subprocess.call(['executable name', 'arg1', '--opt1', 'opt-arg', ...])
_
文字列のリストを手動で記述したくない場合は、shlex
モジュールを使用できます。
_subprocess.call(shlex.split('executable-name arg1 "quoted arguments are correctly handled" etc'))
_
コマンドの出力を取得する場合は、call
の代わりに _check_output
_ を使用します。
_cmd1 | cmd2 | cmd3
_のようなコマンドのパイプラインを実行する場合でも、シェルの起動を回避できます。
_cmd1 = subprocess.Popen(cmd1_command_line, stdout=subprocess.PIPE)
cmd2 = subprocess.Popen(cmd2_command_line, stdin=cmd1.stdout, stdout=subprocess.PIPE)
cmd3 = subprocess.Popen(cmd3_command_line, stdin=cmd2.stdout, stdout=subprocess.PIPE)
_
厳密に必要な場合にのみ_Shell=True
_を使用します。そのような場合は、env
引数を使用して環境をシェルに明示的に渡すことを検討してください。
はい、popenはShellshockの影響を受けます。しかし、私はあなたに提供する包括的なリストを持っていません-/ bin/bashへの呼び出し(/ bin/bashにリンクする/ bin/shへの呼び出しなど)に裏付けされたものはすべて、以下の引用で想定されています)は脆弱です。
PHP、Python、C++またはJavaで記述された一連のWebアプリは、popen()やsystem()などの関数の呼び出しを使用する場合、/への呼び出しによってサポートされるため、脆弱になる可能性があります順番にbin/sh -cとZalewskiは言います。
http://www.itnews.com.au/News/396256,further-flaws-render-Shellshock-patch-ineffective.aspx
これにより、質問に対する十分な暫定的な回答が得られることを願っています。