2014-01-09 3 views
1

신뢰할 수없는 입력이있는 경우 'shell = True'를 사용하면 보안 상 위험 할 수 있습니다. 그러나 'shell = False'가 동일한 위험을 피하는 방법을 이해하지 못합니다. 나는 사용자가 자신이 입력 수도 입력 제공 할 수 있도록하고 싶었 아마도 경우파이썬 하위 프로세스 보안

: VAR을 = "RF RM은 /"

내 코드 수도 단순히 :

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

또는 내가 할 수 있습니다

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

두 번째 예에서와 같이 입력을 처리하는 과정을 거치지 않는다고 가정하는 것처럼 보일 수 있습니다.

+0

ummmm 신뢰할 수없는 입력을 호출로 전달할 때 심각한 위험을 초래할 때 사용자가 프로그램을 호출하도록 제어 할 수있게하려면 ... 듣다 껍데기 = 거짓은 안전한가요? http://docs.python.org/2/library/subprocess.html#frequentlyused-arguments ... 모든 것은 단지 하나의 공격 인 쉘 주입을 막습니다. –

+0

제공 한 바로 링크에 메모가 있습니다 "경고 : shell = True로 시스템 쉘을 호출하면 신뢰할 수없는 입력과 결합하면 보안 상 위험 할 수 있습니다." 이것은 shell = False를 사용하는 것이 쉘에 대한 방어책을 제공한다는 것을 의미합니다. – user3175543

답변

4

shell=False으로, args[0]은 실행할 프로그램이고 args[1:]은이 프로그램의 인수로 전달됩니다.

따라서, 예를 들어,

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

cat 프로그램을 호출하고 인수로 'nonexistent;', 'rm', '-rf'cat에 3 문자열을 보냅니다. -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

관련 문제