Ejecución de código proporcionado por el usuario en C# 2

Parte 2

Como mostré en la primera parte de este articulo, es realmente sencillo el ejecutar código escrito en C# por el usuario de una aplicación.

Sin embargo, ¿Que implica el permitir esta acción? ¿Existen riesgos de seguridad? ¿se debe permitir esta función?

Como ya te has de imaginar, los riesgos que implica el permitir que el usuario pueda escribir su propio código, son muchos, desde acceso a los archivos y aplicaciones instaladas en la maquina, hasta acceso completo al equipo.

Al permitir, que el usuario pueda generar sus propias aplicaciones, por que si bien el ejemplo del articulo anterior, es un visor de imágenes, fácilmente se le puede implementar funcionalidades tan diversas como la imaginación y conocimientos del usuario.

Permitiendo, por ejemplo, el ejecutar el famoso "format c:", mediante la clase Process del ensamblado System.dll, o la descarga de otra aplicación desde una fuente desconocida, con los fines que el usuario desee.

Cabe destacar que para realizar lo anterior, definitivamente el usuario debe tener conocimientos avanzados de programación y de c#, sin embargo, en mas de una ocasión, me he encontrado con personas que nunca han estudiado o tomado ningún curso de programación, y en cambio, pueden realizar macros en Excel como grandes expertos.

¿Se puede hacer algo para prevenir estos riesgo?

De primera instancia, No, sin embargo, con los conocimientos apropiados y el suficiente tiempo, dinero y esfuerzo, seria posible implementar una técnica de SandBox, el cual pueda aislar las acciones de los usuarios en una proceso independiente, que no cuente con privilegios para ejecutar acciones peligrosas o dañinas, adicionalmente seria necesario el discriminar que clases, métodos y ensamblados se permitirian.

Se podría generar también una aislamiento de la ejecución mediante Dominios de applicacion, lo que permitiría que el código proporcionado por el usuario se ejecutar de forma aislada, sin comprometer la aplicación principal, ni sus recursos.

También es posible el generar un parser, el cual discriminaría entre las instrucciones proporcionadas, para filtrar solo aquellas que son permitidas, sin embargo, esta opción requiere de la generación de un sin fin de validaciones y comprobaciones, que pueden pasarse por alto.

En fin, existen muchas técnicas que pueden permitir esta funcionalidad en las aplicaciones, y la mayoría pueden ser combinadas para garantizar un nivel de seguridad mayor.

¿Es recomendado implementar esta funcionalidad?

Bueno, esto depende completamente las capacidades de la aplicación y del desarrollador, si bien, el potencial de la funcionalidad es muy grande, también lo son los riesgos de seguridad que propone, no solo para si misma o el equipo huésped, si no tambien, para los equipos que interactuan con dicho equipo.

Como siempre, los mecanismos necesarios para la correcta implementación, existen, o se pueden crear; sin embargo, es responsabilidad del desarrollar el evaluar e implementar la correcta solución al reto antes propuesto.

En lo personal, considero que si es recomendable la funcionalidad, sin embargo, yo no la implementaría mediante la inclusión de instrucciones en un lenguaje tan poderoso como C#, en su lugar, propondría utilizar un lenguaje como javascript, el cual es mas manejable y por naturaleza es interpretado, o en su defecto el diseño de un lenguaje propio diseñado exclusivamente para este proceso.

Teniendo la ventaja de no poner a la disposición del usuario todo las funcionalidades y recursos que contiene .Net Framework.

¿Tu que opinas? 

Jean Carlo

Entusiasta de la programación, freelance intermitente, lector asiduo, cinéfilo, y editor esporadico en este sitio.

0 comentarios

Agregar un comentario

;