Tabla de Contenido
0. Introducción1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Enlaces & Literatura
0. Introducción
Ahora queremos que nuestros assemblies sean firmados en una etapa posterior. Esto con el fin de garantizar la posesión de la llave privada sólo por un grupo de miembros (por ejemplo, al personal encargado de hacer las entregas y/o despliegues de los assemblies).
1. Problema
El líder (arquitecto de software, o desarrollador jefe) encargado del proyecto ha decidido proteger los assemblies a través de nombres seguros, pero además, ha impuesto que la llave privada no sea entregada a miembros del equipo de desarrollo (programadores). Sólo se firmarán los assemblies con la llave privada en el momento de realizar integración sobre la infraestructura de producción, o simplemente se entregará al cliente el assembly por el personal autorizado.
2. Solución
.NET Framework cuenta con atributos de assembly que permiten especificar de forma explicita por medio de atributos la firma pospuesta (delay-sign) para un assembly. El atributo en particular para llevar a cabo esta tarea es AssemblyDelaySignAttribute [4]; y el uso de la opción /delaysign [5] del compilador de C#.
3. Discusión
.NET provee un mecanismo conocido como firma postpuesta (o en inglés, delay-sign) que permite firmar un assembly una vez esté listo para distribución y/o despliegue. La idea bajo este mecanismo es reducir el riesgo de secuestro o piratería (utilizo este par de términos para referirme al acto de compilar un assembly o distribuirlo sin permiso para fines comerciales ilegales, o la creación de software malicioso que pueda afectar el sistema destino) por parte de un miembro inescrupuloso del equipo de desarrollo.
Continuando, en [6] se comenta sobre los riesgos potenciales de seguridad que se pueden mitigar a través de este mecanismo:
- A malicious user replaces an assembly in your program with a different assembly with the same file name, but which contains malicious code, and convinces your program to load and execute it.
- A malicious user replaces an assembly in your program with a different version of the same assembly, but which has known bugs that have since been fixed.
El aspecto técnico de este mecanismo de firma es incluir en los propios assemblies la llave pública y dejar un espacio reservado para incluir los datos relacionados con la firma del assembly en una etapa posterior con la llave privada.
4. Práctica: Código C#
En la línea 5 especificamos el nombre del archivo (generalmente con extensión .snk) que contiene la llave pública. Luego, a resaltar, en la línea 6 utilizamos el atributo AssemblyDelaySignAttribute [4] con el cual indicamos que se trata de una firma pospuesta (delay-sign), para que esto sea así especificamos como argumento true en el constructor.
El siguiente comando consiste en compilar el assembly con la opción (switch) /delaysign, así:
A continuación, como paso final, procedemos a firmar nuestro assembly:
El siguiente comando consiste en compilar el assembly con la opción (switch) /delaysign, así:
A continuación, como paso final, procedemos a firmar nuestro assembly:
5. Conclusiones
Hemos aprendido acerca de un mecanismo que nos facilita .NET para firmar nuestros assemblies de manera postpuesta (delay-sign). Reconocimos que este mecanismo reduce el riesgo de manipulación de los componentes. Vimos un ejemplo muy sencillo donde usamos el atributo AssemblyDelaySignAttribute para postponer la firma del assembly y ejecutamos el compilador de C# con la opción /delaysign para indicar que la firma se realizará más adelante; finalmente firmamos el assembly usando la herramienta sn.exe y la opción -R.
6. Glosario
- Delay-sign
- Firma
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]: Delay Signing an Assembly - http://msdn.microsoft.com/en-us/library/t07a3dye.aspx
[3]: How to: Delay Sign an Assembly (Visual Studio) - http://msdn.microsoft.com/en-us/library/9fas12zx(v=vs.100).aspx
[4]: AssemblyDelaySignAttribute Class (System.Reflection) - http://msdn.microsoft.com/en-us/library/system.reflection.assemblydelaysignattribute.aspx
[5]: /delaysign (C# Compiler Options) - http://msdn.microsoft.com/en-us/library/vstudio/ta1sxwy8(v=vs.110).aspx
[6]: c# - What exactly are Delay signing and strong names in .net? - Stack Overflow - http://stackoverflow.com/questions/8394357/what-exactly-are-delay-signing-and-strong-names-in-net
J