2010-11-17 9 views
23

Esta pregunta es similar a Exploitable PHP Functions.Funciones explotables de Python

Los datos corruptos provienen del usuario, o más específicamente de un atacante. Cuando una variable contaminada alcanza una función de sumidero, entonces usted tiene una vulnerabilidad. Por ejemplo, una función que ejecuta una consulta SQL es un receptor, y las variables GET/POST son fuentes de contaminación.

¿Cuáles son todas las funciones de receptor en Python? Estoy buscando funciones que introduzcan una vulnerabilidad o software weakness. Estoy particularmente interesado en las vulnerabilidades de ejecución remota de código. ¿Hay clases/módulos completos que contienen funcionalmente peligrosos? ¿Tienes algún ejemplo de vulnerabilidades de Python interesantes?

+6

¿Qué le parece hacer de esta una wiki de la comunidad? –

+0

@Sven Marnach ¿cómo podría mejorar esto? No he hecho eso antes. – rook

+0

Es (¿sería?) Muy difícil de asegurar Python en gran medida; el lenguaje es simplemente demasiado flexible para eso. Si intenta crear un entorno de Python seguro, tiene una tarea muy grande por delante. – katrielalex

Respuesta

6

El módulo subprocess contiene funcionalmente desagradable, que desaprueba estas formas de ejecución de comandos/procesos:

os.system 
os.spawn* 
os.popen* 
popen2.* 
commands.* 

También hay exec que ejecutar código python y eval que "evaluar" una expresión y se puede utilizar para manipular variables

14

eval y exec son los clásicos. Sin embargo, open y file se puede abusar demasiado:

open('/proc/kcore', 'w').write('0' * 1000 * 1000 * 1000) 

Luego están los os, sys, subprocess y dircache módulos. Prácticamente todo lo que toca el sistema de archivos o puede usarse para convertir datos en código ejecutable (como os.system) va a estar en la lista.

Como señaló S. Lott en los comentarios, escribir en el sistema de archivos y ejecutar programas externos arbitrarios no son específicos de Python. Sin embargo, merecen la consideración de los auditores de seguridad. La mayoría de estas funciones se pueden usar de forma segura sin preocuparse demasiado por la seguridad. eval y exec, por otro lado, son grandes grandes banderas rojas. Usarlos de forma segura requiere un cuidado meticuloso.

+2

Abrir '/ proc/kcore' requiere privilegios que la mayoría de los procesos no tienen. Este es un tipo diferente de exploit porque requiere privilegios y no es solo una codificación defectuosa. –

+2

@ S.Lott: Claro, pero ese fue solo un ejemplo (dramático). Tal vez un atacante espera estar ejecutándose como el usuario del servidor web y abre '/ var/www/index.html' en su lugar. Buena seguridad está en capas. No podemos esperar que todos los administradores de nuestros usuarios se aseguren de que todo funcione con los permisos óptimos todo el tiempo, por lo que vale la pena prestar un poco más de atención y buscar este tipo de cosas. – nmichaels

+0

"Buena seguridad está en capas". Ese no es el único punto. Los 'eval' y' exec' son exploits de Python que no dependen de la seguridad. El otro exploit es diferente en su tipo: es irrelevante para Python, ya que todos los idiomas lo tienen. Es parte de la administración de privilegios del sistema operativo. Si vas a enumerar eso, entonces debes comenzar a enumerar todos los exploits del SO que no tienen nada que ver con Python. Creo que deberías segregar esto más claramente en tu respuesta como un tipo diferente de exploit que solo usa Python. –

14

derecha desde la documentación pickle:

Warning 

The pickle module is not intended to be secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source. 
+1

La información de escabelado es una de las peores, ya que no está estructurada ni es lo suficientemente legible como para desinfectarse, y se puede ejecutar código arbitrario ** mientras ** se deshace. Por ejemplo, enviar estructuras de datos en escabeche a través de DBUS (o algún otro mecanismo IPC abierto) puede ser un gran vacío de seguridad, pero esto no es necesariamente obvio para alguien nuevo en Python o DBUS. Un mejor enfoque es escribir un método de serialización explícito, usando JSON o XML, y enviar ESTO sobre cualquier protocolo que esté usando. – detly

3

La función input, que evalúa la cadena dada y devuelve el resultado, tiene algunas restricciones, pero todavía puede ser objeto de explotación.

+0

Puede confirmar que es explotable. '__import __ ('os'). system ('ls')' Introduciendo la cadena de arriba en stdin, resulta en la ejecución del comando 'ls' en shell. – gtux

9

Tiendo hacia el paranoico cuando busco este tipo de cosas. Más aún porque tiendo a hacer muchas metaprogramaciones.

  • comandos de efectos secundarios más (que cubren otras publicaciones)
    • de manipulación de archivos (open, tarfile, zipfile, ...)
    • llamadas de red (urllib2, socket, ...)
    • serialización/persistencia de datos (pickle, shelve, ...)
    • proceso/gestión de hilos (subprocess, os.fork, os.kill, ...)
  • builtins
    • getattr
    • setattr
    • delattr
    • eval
    • exec
    • execfile
    • __import__

Y probablemente otros que estoy olvidando. También soy cauteloso con la entrada del usuario que pasa por las funciones en las que estoy modificando sys.path, sys.modules, etc.

Cuestiones relacionadas