¿Las funciones popen (y similares) de python están afectadas por Shellshock?

19

Básicamente, ¿qué funciones de Python activan bash (y podrían verse afectadas por shellshock), y cuáles no?

He encontrado esta pregunta al ver en algunos scripts la función popen() .

Mi pregunta se relaciona con Python 2 y 3.

    
pregunta Grzegorz Wierzowiecki 29.09.2014 - 16:27
fuente

2 respuestas

21

Cualquier programa que, en algún momento, las llamadas bash se vean afectadas. En particular, la función os.system es vulnerable si el sistema tiene bash as /bin/sh , por lo que cualquier programa que lo llame (o algún equivalente) también es vulnerable.

Las funciones popen pueden ser vulnerables, dependiendo de los argumentos pasados. Citando de la documentación:

  

Además, para cada una de estas variantes, en Unix, cmd puede ser una secuencia, en   Los argumentos del caso se pasarán directamente al programa sin   intervención de shell (como con os.spawnv() ). Si cmd es una cadena, lo hará   pasar al shell (como en os.system() ).

a mi entender, esto significa que las llamadas como:

os.popenx(['executable', 'some', 'arguments'])

son seguros porque no se invoca shell, mientras que los comandos de la forma:

os.popenx('executable some argument')

son vulnerables porque se usará un shell para interpretar la cadena como una línea de comando.

También tenga en cuenta que todas las funciones popen están en desuso desde python2.6 y deberían haberse evitado desde entonces. El módulo subprocess proporciona una interfaz mucho mejor para iniciar subprocesos, que es Shellshock Safe de forma predeterminada. Si no pasa el argumento shell=True , su programa no lanzará subshells y por lo tanto no será afectado por shellshock.

Para utilizar con seguridad subprocess , debe evitar usar el argumento shell=True tanto como pueda (esto fue cierto incluso antes del descubrimiento de Shellshock y ya está bien documentado como un peligro para la seguridad).

En particular, si desea simplemente lanzar un ejecutable, utilice subprocess.call :

subprocess.call(['executable name', 'arg1', '--opt1', 'opt-arg', ...])

Si no desea escribir la lista de cadenas a mano, puede confiar en el módulo shlex :

subprocess.call(shlex.split('executable-name arg1 "quoted arguments are correctly handled" etc'))

Si desea recuperar la salida del comando, use check_output en su lugar de call .

Si desea ejecutar un flujo de comandos como cmd1 | cmd2 | cmd3 , aún puede evitar lanzar un shell:

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)

Use shell=True solo si es estrictamente necesario, y en tal caso, considere pasar explícitamente el entorno al shell utilizando el argumento env .

    
respondido por el Bakuriu 29.09.2014 - 21:23
fuente
7

Sí, popSh está afectado por ShellShock. Sin embargo, no tengo una lista completa para proporcionarle, nada que esté respaldado por una llamada a / bin / bash (como una llamada a / bin / sh que enlaza con / bin / bash) que se supone en la siguiente cita ) es vulnerable.

  

Una gama de aplicaciones web escritas en PHP, Python, C ++ o Java podrían ser   vulnerables si usan llamadas a funciones como popen () o system (),   A medida que estos están respaldados por llamadas a / bin / sh -c, observa Zalewski.

enlace

Espero que esto le brinde una respuesta provisional suficiente a su pregunta.

    
respondido por el JZeolla 29.09.2014 - 16:50
fuente

Lea otras preguntas en las etiquetas