Dado que mi código es de código abierto y estoy ejecutando en un servidor, y acepto código casi sin procesar, ¿qué es lo peor que me puede pasar?

Estoy observando varios casos en los que sería mucho más fácil aceptar un código casi sin procesar. Asi que,

  1. ¿Qué es lo peor que puedes hacer con una expresión si no puedes lambda, y cómo?
  2. ¿Qué es lo peor que puede hacer con el código ejecutado si no puede usar la importación y cómo? (no se puede usar X == la cadena se escanea para X)

Además, B no es necesario si alguien puede pensar en una expr tal que d = {key: value, …}: expr.format (key) == d [key]

Sin cambiar el aspecto del formato.

Lo peor que puedes hacer con una expresión es del orden de

__import__('os').system('rm -rf /') 

si el proceso del servidor se ejecuta como root De lo contrario, puede llenar la memoria y bloquear el proceso con

 2**2**1024 

o haga que el servidor se detenga por completo al ejecutar una bomba de bifurcación :

 __import__('os').system(':(){ :|:& };:') 

o ejecuta una bomba de horquilla temporal (pero lo suficientemente destructiva) en Python:

 [__import__('os').fork() for i in xrange(2**64) for x in range(i)] 

Escanear para __import__ no ayudará, ya que hay un número infinito de maneras de llegar a él, incluyendo

 eval(''.join(['__', 'im', 'po', 'rt', '__'])) getattr(__builtins__, '__imp' + 'ort__') getattr(globals()['__built' 'ins__'], '__imp' + 'ort__') 

Tenga en cuenta que las funciones eval y exec también se pueden usar para crear cualquiera de las anteriores de manera indirecta. Si desea una evaluación de expresión segura en un servidor, use ast.literal_eval .

¿Código Python arbitrario?

  • Apertura, lectura, escritura, creación de archivos en la partición. Incluyendo rellenar todo el espacio en disco.
  • Bucles infinitos que ponen carga en la CPU.
  • Asignación de toda la memoria.
  • Hacer cosas que se encuentran en módulos de Python puros sin importarlos copiando / pegando su código en la expresión (jugando con los elementos internos de Python integrados y probablemente encontrando una forma de acceder a archivos, ejecutarlos o importar módulos). …

Ninguna cantidad de listas blancas o negras evitará que las personas lleguen a partes peligrosas de Python. Mencionas que se está ejecutando en una caja de arena donde “abierto” no está definido, por ejemplo. Pero puedo hacer esto para conseguirlo:

 real_open = getattr(os, "open") 

y si dices que no tendré os , entonces puedo hacer:

 real_open = getattr(sys.modules['os'], "open") 

o

 real_open = random.__builtins__['open'] 

etc, etc, etc. Todo está conectado, y el poder real está en alguna parte. Los chicos malos lo encontrarán.