5.18.2007

Seguridad en Aplicaciones .NET: Dos Elementos Básicos

Hace unos días revisé una aplicación en .NET de un corporativo con la idea de encontrar posibles vectores de ataque. En general la aplicación está muy bien construida.

Sin embargo, hay un par de cosas que permiten atacarla y que estoy seguro que se presentan en muchos casos como este. En primer lugar la aplicación no estaba ofuscada. Siendo una aplicación cliente en Windows Forms, eso hace que sea fácil para cualquier atacante revisarla simplemente usando una herramienta como .NET Reflector de Lutz Roeder. Esta pequeña herramienta es una maravilla y genera código C# o VB altamente legible a partir de un ejecutable o DLL .NET. La ofuscación hace el código prácticamente ilegible e incremente varios órdenes de magnitud la dificultad de hacer una ingeniería en reversa. La herramienta más popular para ofuscar es Dotfuscator.

Una vez analizando el código es muy fácil invocarlo desde un programa hecho por nosotros para que haga cosas maliciosas. Marcar una clase como internal o un metodo como private o protected no es ninguna protección frente a un atacante ya que las reglas de acceso son aplicadas por el compilador, no por el .NET Framework. Invocar metodos privados o crear instancias de clases internas es perfectamente posible usando reflection.

¿Como protegerse? Este es justamente uno de los escenarios para los que Microsoft incluyó Code Access Security en .NET. Es posible marcar nuestras funciones y tipos para que sólo puedan ser utilizados por código que provee cierta evidencia. La evidencia soportada ya por .NET puede ser:

· URL: El url desde el cual se descargó el código.
· Site: Únicamente el hostname del URL.
· Zone: La zona de seguridad (definida por Internet Explorer)
· Hash: Un hash del assembly.
· Strong Name: El código debe de estar firmado por un publicador específico.

Además es posible definir nuestra propia evidencia a la medida en caso necesario.

Así que, recuerden verificar que quien esté llamando a su código esté autorizado para hacerlo si no quieren que alguien use su código para cosas indebidas.