¿Cómo se verifica que un script de Python es una función matemática pura?

0

Tengo un proyecto de Python que carga dinámicamente los scripts de Python desde un conjunto de directorios especificados y ejecuta una función esperada fuera de ellos (el marco espera un nombre de función que toma un cierto número de parámetros, pero la implementación es desconocida). Para reforzar la seguridad de esta aplicación, me gustaría analizar los scripts para garantizar que sean solo funciones matemáticas y, por lo tanto, no interactuar con ningún componente del sistema, como el HDD / SDD, la red, una base de datos, etc. Es esto es posible hacer en Python?

    
pregunta josiah 28.07.2016 - 18:00
fuente

3 respuestas

2

Me temo que esto no es posible. Después de todo, su problema se reduce a preguntar "¿es este código malicioso?", Y podríamos responder de manera confiable a esta pregunta, ya que el malware ya no existe.

Puede mitigar este problema permitiendo a los usuarios crear su secuencia de comandos utilizando un conjunto de funciones permitidas que usted considera seguras (aunque nada es totalmente seguro y puede haber errores en esas funciones que permiten hacer cosas malas) y solo permite que ciertos argumentos (enteros y referencias a variables previamente definidas) compliquen aún más la tarea de un atacante (no pueden simplemente pasar una cadena a una función vulnerable, otra cosa más que necesitan para solucionar). Por supuesto, tendrá que hacer todo este lado del servidor de validación, no confíe en Javascript del lado del cliente para hacer cumplir esto.

Otra opción sería aceptar cualquier código (con un límite de tamaño razonable) y ejecutarlo en una máquina virtual sin acceso a la red y que solo pueda comunicarse con el host a través de un puerto serial emulado para obtener los datos y devolver su resultado ( puede proporcionar funciones de ayuda en su entorno como get_input y set_output que usarían internamente el puerto serie para comunicarse con el host. Puede hacer que sea aún más seguro ejecutando las máquinas virtuales en máquinas separadas físicamente que se consideran no confiables y solo ellas mismas. tener un puerto en serie para hablar con el mundo exterior. De esa manera, incluso si son explotados, al atacante le será difícil hacer uso de ellos.

    
respondido por el André Borie 28.07.2016 - 18:15
fuente
1

Agregando lo que dijo André, creo que la inclusión en listas blancas sería su mejor opción.

Algunos recursos que podrían ayudarte enlace O más específicamente enlace Como incluye algunas capacidades de listas blancas.

Si desea encontrar su propia solución, puede encontrar o compilar (dado que Python está en blanco, no sería demasiado difícil) un analizador de Python que use magia regex y, no, solo para permitir cierto código en un script dado.

    
respondido por el Leon Harvey 28.07.2016 - 18:29
fuente
1

Posible: tal vez. Factible: parece poco probable. Simplemente restringir las importaciones no asegurará el sistema. Deberá analizar el script y buscar cosas como exec ()

El mayor obstáculo es que es muy difícil saber que has logrado bloquear todas las operaciones peligrosas.

Si no puedes confiar en los scripts, creo que la forma más segura de hacerlo es utilizar un lenguaje creado específicamente para lo que quieres hacer o construir el tuyo. Tratar de restringir el uso de un lenguaje de propósito general a lo que se conoce como seguro parece una tarea de Sisyphean. Lo que realmente quieres es un lenguaje de expresión matemática, ¿verdad?

Aquí hay un código para darle una idea de a qué se enfrenta:

e = eval

g = e("glo" + "bals")

f = chr(101)
f += chr(120)
f += chr(101)
f += chr(99)
f += chr(102)
f += chr(105)
f += chr(108)
f += chr(101)

b = getattr(g()["__" + "builtins" + "__"], f)

print b

b("badstuff.py")

Si no puede molestarse en ejecutarlo, la impresión b muestra:

<built-in function execfile> 

Esto es justo lo que se me ocurrió en unos minutos. Claramente, debe restringir el uso de globales, eval, exec, execfile, pero no afirmo que esta lista sea exhaustiva.

    
respondido por el JimmyJames 28.07.2016 - 19:49
fuente

Lea otras preguntas en las etiquetas