lunes, 17 de febrero de 2014

Receta No. 1-15: Prevenir la Decompilación de Nuestro Código

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica
4.1 PreEmptive Dotfuscator and Analytics
4.2 .NET Reflector
5. Conclusiones
6. Glosario
7. Enlaces & Literatura

0. Introducción

Resulta muy evidente que la propiedad intangible del software y la existencia de Internet para el intercambio de datos a través de sitios Web, redes de intercambio de archivos (P2P), &c. facilite la copia no legal de software. A pesar de que los gobiernos y las mismas empresas desarrolladoras hayan establecidos planes o actas antipiratería, no resultan del todo efectivos para reducir al máximo este fenómeno. Como programadores/desarrolladores debemos pensar en métodos alternativos para proteger nuestros desarrollos: código fuente, algoritmos (producto de trabajo intelectual) competitivos -me refiero a la solución que marca la diferencia frente a otras alternativas del mercado-, entre otros. En esta receta vamos a aprender los básicos acerca de la protección del código fuente y prevenir (en lo máximo posible) la decompilación de nuestros assemblies. Soyez le bienvenu!

1. Problema

Actualmente los assemblies de las aplicaciones desktop se distribuyen tal-cual como son generados desde el IDE Visual Studio o desde los que son escritos a pulso -con esto me refiero a aquellas líneas de código escritas de forma artesal (a mano)-, ahora el equipo de distribución nos ha solicitado que debemos proteger estos assemblies contra la decompilación por parte de hackers mal intencionados.

2. Solución

En [1] nos sugieren:
  • Construir las soluciones software basadas en tecnología cliente-servidor [10]. En donde nuestros assemblies estén localizados en el servidor. Esto evitará que aquellos hackers mal intencionados intenten tener acceso a nuestras librerías representadas en assemblies. Este es un primer paso, también es importante contar con una infraestructura de hardware segura, incluyendo el endurecimiento de máquina [7], en pocas palabras podemos asegurarnos que nuestra infraestructura emplee el modelo de seguridad de defensa en profunidad [8][9].
A lo anterior le podemos sumar algo que en ingeniería de software se conoce como ofuscación de código. En la siguiente sección me extenderé en este concepto y acerca de su utilidad de protección de código fuente C#.

3. Discusión de la Solución

Les voy a contar acerca del concepto de ofuscación del código y la introducción de algunas herramientas de las que nos podemos valer para proteger nuestra propiedad intelectual.

3.1 Ofuscación

En términos simples y prácticos, podemos decir que la ofuscación consiste en generar una representación del código fuente de nuestra solución por una ilegible que, desde luego, dificulte su entendimiento por parte de humanos (parafraseo de la definición en [12])

Además, podemos agregar, que el propósito de la ofuscación del código alcanza un objetivo no-funcional de una solución software: proteger la propiedad intelectual del programador o casa de desarrollo de software a través de security through obscurity [13] (es decir a través de técnicas empíricas de seguridad). Para recalcar, esto evitará la modificación/copia deliberada por parte de otros, ingeniería inversa (acto de obtener el código fuente a partir de MSIL) [14].

3.2.1 Ofuscación en .NET

De acuerdo con [1] (parafraseo) los assemblies en el Framework .NET están constituidos por un conjunto de instrucciones de código y metadatos (descripción de los tipos de datos contenidos en el assembly) independientes de la plataforma, y estandarizados; estas características es lo que facilita el proceso de decompilación. Hay que añadir, que la decompilación casi siempre devuelve una representación del código fuente cercana a la original, y esto ayuda mucho a los programadores que deseen atentar con nuestra propiedad intelectual.

3.2.2 Método simple de protección de assemblies

En la sección 2 mencioné que un método práctico consiste en idear una solución para la construcción de la aplicación que esté basada en la arquitectura cliente servidor (precisamente, el desarrollo de aplicaciones Web ASP.NET [15]), inclusive podemos crear servicios Web [16], el uso de uno o ambos de estos enfoques detendrá el acceso a los assemblies gracias a que todo los recursos que contienen las secciones sensibles de la aplicación se hayan en un servidor remoto inalcazable.

Continuando, cuando la restricción del diseño o la concepción del mismo no opte por una arquitectura cliente-servidor sino por una standalone o desktop, tendremos que buscar otra solución más eficiente para para este último caso. Eso lo vamos a ver en la siguiente sección: 3.2.3.

3.2.3 Ofuscación en assemblies de aplicaciones desktop

En Visual Studio contamos con una herramienta muy poderosa conocida como Dotfuscator and Analytics [2] de PreEmptive como extensión y también la edición desktop. Con esta herramienta tomamos una librería (archivo con extensión .dll) y aplicamos una serie de métodos de ofuscación para volver ilegible la representación original (es decir, el código fuente). En la sección 4 veremos la práctica del uso de esta increíble herramienta.

Algunas características importantes de Dotfuscator:

Renaming: Permite renombrar métodos, variables, &c.
Renaming en Dotfuscator.
Figura 1. Renaming en Dotfuscator [2].
- Control-flow: Incluye construcciones de control de flujo como goto [17].
Control flow en Dotfuscator.
Figura 2. Control flow en Dotfuscator [2].
- String encryption: Ofusca cadenas de caracteres que corresponden con valores asignados estáticamente a variables.

En [2] podemos encontrar el listado completo de Dotfuscator. Estas guías también son de utilidad para ir más a fondo de esta herramienta: [18], y [20].

4. Práctica

En la receta Receta No. 1-14: Gestión del Global Assembly Cache (GAC) a partir del assembly Calculadora.dll creado a partir del siguiente código fuente:



vamos a usar la herramienta .NET Reflector [5] para pretender ver el código de nuestro assembly. Así:

1. Descargamos la versión gratuita de .NET Reflector desde [5].
2. Realizamos la instalación.
3. Abrimos .NET Reflector.
4. Nos dirigimos al menú File y luego hacemos clic en el comando Open Assembly... abrir el assembly Calculadora.dll. Una vez abierto tendremos algo como en la Figura 3.
Vista del assembly Calculadora.dll en .NET Reflector.
Figura 3. Vista del assembly Calculadora.dll en .NET Reflector.


Como observan, el código fuente de nuestra solución es totalmente explorable desde .NET Reflector. Si desarrollamos una librería de forma análoga como lo hicimos con Calculadora.dll tendríamos resultados similares. Y evidente los algoritmos de nuestra librería estarían dispuestos a cualquiera que tenga acceso a ella.

Para atacar este problema, vamos a recurrir Dotfuscator mencionada en la sección 3.2.3. Veamos.

1. Creamos un registro para descargar Dotfuscator desde el sitio oficial [2].
2. Aplicamos el número de serie que nos llega al correo que registramos.
3. Abrimos Dotfuscator y creamos un nuevo proyecto.
4. Especificamos como input el assembly Calculadora.dll.
Selección de assembly Calculadora.dll en Dotfuscator.
Figura 4 Selección de assembly Calculadora.dll en Dotfuscator.

5. Luego nos dirigimos a la pestaña 'Rename', y nos ubicamos en la subpestaña 'Options', y enseguida seleccionamos la opción 'Unprintable' desde la lista desplegable 'Renaming Scheme'.
Renaming en Dotfuscator.
Figura 5. Renaming en Dotfuscator.

6. Finalmente repetimos los pasos para visualizar el contenido del assembly por medio de .NET Reflector de arriba. Parte del resultado:
Assembly Calculadora.dll ofuscado.
Figura 6. Assembly Calculadora.dll ofuscado.

Cabe mencionar que en el mercado existen otras herramientas como:
  • Aldaray [3]
  • Agile.net Code Protection [4]
  • Eazfuscator.NET [6]

Conclusiones

En el seguimiento de esta receta hemos consignado otro concepto importante a nuestra alcancía de conocimientos y es el de ofuscamiento. Técnica que nos ha enseñado a proteger a nuestros assemblies de la intromisión de otros programadores a nuestros algoritmos que son parte de los tipos de datos que comprenden un assembly determinado.

Glosario

- Assembly
- Decompilación
- Desktop
- Encriptación
- IDE
- Ingeniería de Software
- Instrucción
- Ofuscar
- P2P
- Propiedad intelectual

Enlaces & Literatura

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: .NET Obfuscation | Dotfuscator - http://www.preemptive.com/products/dotfuscator/overview
[3]: Aldaray - http://www.aldaray.com/
[4]: Agile.net Code Protection - http://secureteam.net/.NET-Obfuscator.aspx
[5]: .NET Reflector.NET code - http://www.red-gate.com/products/dotnet-development/reflector/
[6]: Eazfuscator.NET - .NET Obfuscator and Optimizer - http://www.gapotchenko.com/eazfuscator.net
[7]: Hardening (computing), the free encyclopedia - http://en.wikipedia.org/wiki/Hardening_%28computing%29
[8]: Defense in depth (computing), the free encyclopedia - https://en.wikipedia.org/wiki/Defense_in_depth_%28computing%29
[9]: Windows Server 2008 in an Organization's Defense in Depth Strategy - http://technet.microsoft.com/en-us/library/cc512681.aspx
[10]: Client-server model, the free encyclopedia - http://en.wikipedia.org/wiki/Client%E2%80%93server_model
[11]: Software engineering, the free encyclopedia - http://en.wikipedia.org/wiki/Software_engineering
[12]: Obfuscation (software), the free encyclopedia - http://en.wikipedia.org/wiki/Obfuscation_%28software%29
[13]: Security through obscurity, the free encyclopedia - http://en.wikipedia.org/wiki/Security_through_obscurity
[14]: Reverse engineering, the free encyclopedia - http://en.wikipedia.org/wiki/Reverse_engineering
[15]: Home : The Official Microsoft ASP.NET Site - http://www.asp.net/
[16]: Web service, the free encyclopedia - http://en.wikipedia.org/wiki/Web_service
[17]: goto (C# Reference) - http://msdn.microsoft.com/en-us/library/13940fs2.aspx
[18]: LolTutoriales FTW: Dotfuscator - http://www.youtube.com/watch?v=PCZ3GiznUpg
[19]: Getting Started with Dotfuscator - http://www.youtube.com/watch?v=vXvHXK1iO20


M

No hay comentarios:

Publicar un comentario

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