Implicaciones de seguridad de la ejecución de Suprocess con un shell activo frente a sin shell

2

Cuando ejecutamos un subproceso como el siguiente:

sub_ret = subprocess.Popen (args, stdout = subprocess.PIPE, shell = True)

Esto plantea un riesgo de seguridad, ya que permite a los usuarios malintencionados inyectar comandos a través del parámetro args.

¿Sería más seguro usar con el shell como falso? Tales como:

sub_ret = subprocess.Popen (args, stdout = subprocess.PIPE, shell = False)

¿O esto también supondría un riesgo para la seguridad?

    
pregunta Nitin_Ramesh 28.06.2017 - 06:09
fuente

1 respuesta

3

La principal diferencia es la forma en que construyes tus comandos:

subprocess.Popen("ls -l /tmp", shell=True)

vs

subprocess.Popen(['ls', '-l','/tmp'])

El primer ejemplo es una cadena y funciona con el conjunto de shell en verdadero, el segundo ejemplo es sin. Esto requiere que cada parte del comando se pase como un elemento separado en la matriz. El peligro es cuando acepta parte del comando como entrada de una fuente no confiable.

Por ejemplo, si aceptaría parte del comando de un usuario, en el primer ejemplo puede literalmente escribir cualquier comando que desee, mientras que en el último ejemplo solo puede definir el parámetro o el destino. Agregar más comandos no será posible ya que el subproceso fallará (siempre que no construya la matriz en función de la entrada del usuario, sino que solo acepte un argumento para una posición específica).

    
respondido por el Lucas Kauffman 28.06.2017 - 12:19
fuente

Lea otras preguntas en las etiquetas