miércoles, 30 de octubre de 2013

Receta C# No. 1-10: Verificación de Nombre Seguro Ante Intentos de Modificación de un Assembly

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Continuo con recetas relacionadas con la generación y administración de nombres seguros para las librearías que creemos. Un mecanismo que proporciona .NET Framework para validar y versionar los assemblies. En esta oportunidad vamos a incursionar en el tema de verificación o comprobación de la firma de un assembly una vez haya sido construido.

1. Problema

El equipo de integración necesita verificar que los assemblies recibidos corresponden con copias auténticas creadas por el propio equipo de desarrollo.

2. Solución

La utilidad de nombres seguros -sn.exe- permitirá al equipo de integración comprobar la autencidad del assembly. Esto con el fin de proteger la infraestructura y las aplicaciones ante intentos de ataques.

3. Discusión de la Solución

3.1 Ciclo de Verificación de Assemblies

Cada vez que se carga un assembly en memoria, .NET Framework se encarga de forma automática de realizar las siguientes tareas iterativas:
  1. La CLR extrae el código hash encriptado (el cual se encuentra al interior del assembly) y lo desencripta a través de la llave pública del assembly (que también se encuentra embebida en el mismo assembly).
  2. Ahora la CLR se encarga de calcular el código hash inscrito en el manifiesto e inmediatamente lo compara con el hash desencriptado (obtenido en el paso anterior).
Estos dos pasos, en general, se encargan de verificar si el assembly ha sido modificado después del proceso de construcción (build, en inglés).

3.2 Excepciones en la Verificación

En caso que el proceso iterativo de verificación de assemblies falle, la máquina virtual -CLR- arrojará una excepción que corresponde con System.IO.FileLoadException [2]. En la consola o diálogo (dependiendo del tipo aplicación) se adjuntará un mensaje de excepción que identifica la causa de la falla:
Strong name validation failed.

3.3 Opciones (switches) de sn.exe para la verificación

La herramienta sn.exe también provee opciones para la verificación de assemblies. Por ejemplo, en la receta anterior (Receta C# No. 1-9: Asignar un Nombre Seguro a un Assembly desde un Contenedor de Llaves | Experiencias Construcción Software) se creó un programa de demostración llamado Programa.exe, para verificar si corresponde con un assembly auténtico, entonces realizamos lo siguiente:


Con la opción -v indicamos que se debe realizar una verificación sobre el assembly pasado como argumento (Programa.exe); adicionalmente, con -f forzamos la verificación del assembly.

4. Práctica

[Nota: En la receta anterior -Receta C# No. 1-9: Asignar un Nombre Seguro a un Assembly desde un Contenedor de Llaves-, se encuentra la implementación en código fuente C# del assembly Programa.exe. Por lo tanto se omite su reescritura en esta sección.]

Cuando ejecutemos sn.exe con las opciones descritas en 3.3, en pantalla (usando la consola), recibiremos mensajes de notificación, tanto cuando la verificación sea satisfactoria, como cuando se generé la excepción descrita en 3.2. En la Figura 1, se presnta el mensaje de satisfactorio.
Verificación assembly.
Figura 1. Verificación de un assembly con sn.exe.
Por otro lado, en caso de que la verificación sea fallida se motrará el mensaje:
Failed to verify assembly --

5. Conclusiones

Hemos aprendido a verificar assemblies con el fin de comprobar que se trata de un assembly genuino y no una copia modificada por terceros. Con esto garantizamos al equipo de integración la autoría nuestra de los assemblies que hemos consturido.

6. Glosario

  • Encriptación
  • Desencriptación
  • Hash

7. Enlaces & Literatura

[1]: Visual C# 2010 Recibes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: FileLoadException Class (System.IO) - http://msdn.microsoft.com/en-us/library/system.io.fileloadexception.aspx


O

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.