2014-01-09 2 views
1

Я понимаю, почему использование оболочки «shell = True» может представлять угрозу безопасности, если у вас есть ненадежный ввод. Однако я не понимаю, как «shell = False» избегает одинаковых рисков.Безопасность подпроцесса Python

Предположительно, если бы я хотел, чтобы позволить пользователю, чтобы обеспечить ввод он мог бы вход: Var = «гт -rf /»

Мой код может просто:

subprocess.call(var,shell=True) # bad stuff 

Или я мог бы сделать:

varParts=var.split() 
subprocess.call(varParts,shell=False) # also bad, right? 

Похоже, что предположение заключается в том, что не будет решена проблема обработки ввода, как это было во втором примере, и поэтому этого было бы/не могло бы случиться?

+0

Ummmm в любое время вы передаете ненадежный вход как вызов вы работаете значительные риски .... где ты слышать shell = False делает его безопасным? http://docs.python.org/2/library/subprocess.html#frequently-used-arguments ... все, что он делает, это прекратить инъекцию оболочки, которая является всего лишь одной атакой ... –

+0

В самой ссылке, которую вы указали, есть заметка что «Предупреждение: Вызов системной оболочки с оболочкой = True может быть угрозой безопасности в сочетании с ненадежным вводом». Это означает, что использование shell = False обеспечивает некоторую защиту от этого. – user3175543

ответ

4

С shell=Falseargs[0] - это программа, которая должна быть выполнена, и args[1:] переданы в качестве аргументов для этой программы.

Так, например,

subprocess.call(['cat','nonexistent;','rm','-rf']) 

вызывает программу cat и отправляет 3 строки 'nonexistent;', 'rm', '-rf' в качестве аргументов cat. Это совершенно безопасно, хотя и недействительно, поскольку -r является недопустимым вариантом для cat.

Однако произвольный вход пользователя все еще может быть небезопасным. Если, например, вы должны были позволить пользователю управлять программой будет называться, как и в

subprocess.call(['rm','-rf']) 
+0

Это хорошая информация. Поэтому я предполагаю, что вариант использования для ввода пользователем будет состоять в том, чтобы позволить пользователю «заполнить» предопределенную команду, но не «предоставить» ее. Я использую XML-файл, чтобы предоставить некоторую команду оболочки, которая позволяет мне проверить, что какое-то произвольное условие встречается в операционной системе. Команда может быть цепочкой команд, соединенных вместе. Это затрудняет чтение и выполнение команды с помощью команды «shell = False». Мне просто интересно, если shell = False обеспечил некоторую внутреннюю защиту от опасных команд типа «rm -rf /». – user3175543

+0

Если XML указывает команду для запуска, выполнение «subprocess.call» по своей сути опасно. Возможно, вы можете запустить скрипт как [пользователь с ограниченными правами] (http://askubuntu.com/questions/253027/how-to-sandbox-bash-shell-to-affect-only-current-directory). – unutbu

Смежные вопросы