¿Es este un uso seguro de python eval ()?

Si un atacante puede controlar el valor de attacker_controlled_nasty_variable , ¿es este segmento de código vulnerable?

 dic={"one":1, "nasty":attacker_controlled_nasty_variable, } store=str(dict) ... dic=eval(store) 

Use ast.literal_eval() lugar de eval() .

Sí. Podría reemplazarse con un objeto que tenga un __repr__() que tenga una carga útil, o que devuelva una cadena que podría ser insegura cuando se pasa a eval() .

Prueba de concepto:

 class MyClass(object): def __repr__(self): return 'os.system("format c:")' bad = [MyClass()] print str(bad) 

Es seguro siempre que pueda estar seguro de que __repr__ nunca es un objeto en el que el atacante pueda controlar __repr__ (o __str__ ) ya que de lo contrario podría inyectar el código python.

Sin embargo, es mejor usar repr(dic) lugar de str(dic) ya que solo se espera que repr reproduzca un código Python válido.

Además, como lo menciona @payne, use ast.literal_eval() más seguro en lugar de eval() .

Vamos a intentarlo:

 >>> attacker_controlled_nasty_variable="`cat /etc/passwd`" >>> dic={"one":1, ... "nasty":attacker_controlled_nasty_variable, ... } >>> store = repr(dic) >>> store "{'nasty': '`cat /etc/passwd`', 'one': 1}" >>> dic=eval(store) >>> dic {'nasty': '`cat /etc/passwd`', 'one': 1} >>> attacker_controlled_nasty_variable="'hello',}" >>> dic={"one":1, ... "nasty":attacker_controlled_nasty_variable, ... } >>> repr(dic) '{\'nasty\': "\'hello\',}", \'one\': 1}' >>> eval(repr(dic)) {'nasty': "'hello',}", 'one': 1} 

Es posible que desee probar más casos, pero empíricamente parece que __repr__ está citando el contenido correctamente.