2010-06-13 6 views
7

Disculpas por la brevedad de la pregunta, sin embargo, no creo que necesite mucha elaboración.CSharpCodeProvider - ¿Es abusable?

¿Hay alguna implicación de seguridad causada por usar el CSharpCodeProvider y podría abrir un servidor para atacar?

Respuesta

5

Depende de cómo lo use. A continuación se presenta un resumen ordenado desde el uso seguro de un uso que desde luego no desea permitir (cuando se ejecuta el código en el servidor o algún ambiente que se desea controlar):

  • Si utiliza CSharpCodeProvider solo para generar el código fuente de C#, entonces solo necesita un permiso para guardar los archivos generados en algún directorio o para observar (si es posible obtener el código generado en una secuencia de memoria)

  • Si lo usa para compilar la fuente de C# generada, necesita un permiso para ejecutar csc.exe (que puede no estar disponible en algunos entornos limitados, como los alojamientos compartidos).

  • Si acaba de generar archivos & compilarlas, entonces probablemente no será perjudicial (aunque probablemente alguien podría abusar de su aplicación para generar muchos, muchos archivos y atacar al servidor utilizando algún tipo de ataque DOS.

  • Si también carga & ejecute el código generado, entonces depende de cómo lo genere.Si supone que no hay errores en C#/CodeDOM y puede garantizar que el código generado es seguro, entonces debería estar bien.

  • Si su código contiene cosas como CodeSnippetExpression que se pueden proporcionar d por el usuario (de alguna manera) de lo que el usuario puede escribir y ejecutar cualquier cosa que desee en su servidor, entonces esto podría ser potencialmente bastante peligroso.

+0

Imagine por un momento que este será un sistema abierto disponible para cualquiera, ¿cómo usarían CodeSnippetExpression para causar estragos? No entiendo muy bien cómo se usa. El código solo compilará el código proporcionado con la configuración: GenerateExecutable = false; GenerateInMemory = verdadero; y luego se llamará a provider.CompileAssemblyFromSource. – GenericTypeTea

+0

@GenericTypeTea: El último punto fue suponer que lo anterior es cierto, es decir, carga y ejecuta el ensamblado. –

2

Tipo de. En la superficie no es un riesgo directo, porque no está ejecutando el código, solo compilando. Sin embargo, no hay nada que diga que el compilador de C# no contenga algún tipo de error que, dada la entrada maliciosa correcta, ocasione que se libere y comience a ejecutar comandos directamente.

Sin embargo, si luego ejecuta el código compilado (y presumiblemente lo hace, de lo contrario, ¿por qué compilarlo?), Se ejecutará en el mismo contexto que usted. Obviamente, eso tiene todo tipo de implicaciones de seguridad desagradables, al igual que el uso de la característica cuasi análoga eval() de otros idiomas.

+0

Nunca ejecutaré un ejecutable. La entrada solo se usa para asegurar algunas compilaciones de código. Entonces, aparte de que el compilador tenga un error, ¿significa esto que es perfectamente seguro para el ejemplo que acabo de mencionar? – GenericTypeTea

+0

Si solo está comprobando que algún código es sintácticamente válido y se compila sin errores, no puedo ver el daño. –

1

Depende de la fuente que está compilando. Si tiene suficiente control sobre la fuente, entonces podría ser un riesgo aceptable. Si está permitiendo que alguien fuera de su esfera de código de suministro de confianza al compilador, podría ser un riesgo inaceptable.

Cuestiones relacionadas