Desarrollando código seguro con Visual Studio

Actualmente somos testigos de la constante evolución del desarrollo de aplicaciones. Sin embargo, algo que también ha ido a la par de este crecimiento son las posibles amenazas que se pueden presentar, las cuales ponen en riesgo y hacen evidente las vulnerabilidades de una aplicación. Por esta razón, consideramos de vital importancia el incluir a la seguridad como parte del ciclo de vida del desarrollo de cualquier aplicación. Respondiendo a esta necesidad, los proveedores de herramientas de desarrollo están incorporando a sus productos capacidades para soportar la creación de código seguro.En el caso de Microsoft, podemos hacer referencia a Visual Studio Team System, y en específico a la edición “Team Edition for Developers”. Esta herramienta provee diversas capacidades para facilitar la escritura de código de mejor calidad, tales como:
• Análisis de código.
• Implementación de muestreo e instrumentación para el análisis dinámico de los programas en ejecución.
• Análisis de cobertura de código.

El análisis de código se enfoca en determinar “qué tan bien hecho” está un programa. Es decir, si se apega a estándares y buenas prácticas de programación y diseño. Adicionalmente, se pueden detectar posibles vulnerabilidades en el código, que serían difíciles de detectar en procesos de pruebas tradicionales. Cuando el análisis se realiza sobre código fuente u objetos compilados sin necesidad de ejecutarlos, se le denomina análisis estático de código. En contraste, el análisis dinámico requiere ejecutar el código para entonces monitorear su comportamiento.

Team Edition for Developers incluye herramientas que analizan el código basándose en patrones de error que corresponden con reglas establecidas. Un detalle importante a distinguir con las reglas, es la flexibilidad que tenemos con la definición de las mismas, ya que podemos deshabilitar aquellas que no apliquen a un proyecto en particular, o bien, crear nuestras reglas para buscar esquemas de código específicos. De esta manera, cuando ejecutamos el análisis y una regla detecta un problema en el código, se genera una advertencia o un mensaje de error, en función de la configuración de la regla.

Veamos ahora a mayor detalle algunas herramientas que provee Visual Studio Team Edition for Developers para asistir el desarrollo de código seguro.

FxCop
Es una herramienta para el análisis de código administrado que se encarga de checar “ensamblados” (assemblies) en .NET para ver si cumplen con los lineamientos de diseño del .NET Framework. Entre los principales aspectos que se verifican están: convenciones de nombre, diseño de bibliotecas, localización, seguridad y rendimiento.

Para poder realizar esta tarea, FxCop se apoya de los espacios de nombre Reflection, la interpretación del MSIL y otros análisis. En cuanto a los aspectos de seguridad, FxCop se encarga de escanear el código en busca de vulnerabilidades, y también ayuda a prevenir que código malintencionado pueda aprovechar el desbordamiento del búfer en aplicaciones.

PreFast
PreFast es otra herramienta incluida en el Team Edition for Developers que realiza análisis estático sobre código de C/C++, para detectar problemas como saturaciones de búfer, memoria no inicializada, problemas de secuencias de comandos de formato y comprobaciones de errores. Prefast es habilitado a través de la opción del compilador /analyze.

Application Verifier
Para realizar análisis dinámico sobre código nativo o no administrado, podemos utilizar el Application Verifier. Esta herramienta analiza aplicaciones durante su ejecución para encontrar errores de programación. Su propósito es detectar y ayudar a depurar corrupciones de memoria y vulnerabilidades críticas de seguridad. Application Verifier también se encarga de monitorear la interacción de la aplicación con el sistema operativo, midiendo el rendimiento del uso de objetos como el registry, el file system y APIs de Win32.

Comprobación de seguridad del búfer a través de /GS
Las vulnerabilidades relacionadas con sobrecargas del búfer son bastante comunes, especialmente al usar lenguajes que permiten un control detallado de la memoria, como es el caso de C o C++. Para mitigar este riesgo, podemos recurrir a la opción del compilador de Visual C++ que se llama /GS.

Esta opción se encargará de detectar saturaciones de búfer que sobrescriben la dirección de retorno, una técnica común para aprovechar código que no impone restricciones de tamaño de búfer. El mecanismo que utiliza es el de establecer un valor cifrado al final de un búfer. Este valor se comprueba durante la ejecución del código y si ha cambiado, se detiene la ejecución del programa y se genera una excepción de seguridad.

Además, el uso de esta opción también protege frente a parámetros vulnerables pasados en una función. Un parámetro vulnerable es un puntero, referencia de C++ o estructura C que contiene un puntero, búfer de cadena o referencia de C++. Es importante expresar que de manera predeterminada, la opción de /GS está habilitada para el compilador.

SAL
Además de las herramientas que hemos comentado, se puede realizar un análisis más exhaustivo a través del uso de una anotación especial como lo es SAL (Standard Annotation Language). A través de SAL podemos agregar anotaciones en los prototipos de las funciones, para describir en mayor detalle el comportamiento que esperamos de dicha función, sus parámetros y valores de retorno. Esto ayuda a que herramientas de análisis como PreFast, tengan mayor efectividad para encontrar errores y problemas de seguridad.

El principal beneficio de usar SAL es que cualquier error que detecte, comúnmente será un error con alto grado de probabilidad de presentarse, y no solamente una suposición.

El uso de cada una de estas herramientas está disponible a través de la configuración de las propiedades de cada proyecto en Visual Studio. Para revisarlo, vaya a la ventana Solution Explorer, seleccione la opción Properties del proyecto y después la opción de Code Analysis. Esto se aprecia en la siguiente figura.


Figura 1. Habilitando el análisis de código en Visual Studio.


Adicionalmente, cabe destacar que estas herramientas también están disponibles de manera gratuita e independiente, sin necesidad de recurrir a Visual Studio. Así que si les ha llamado la atención alguna de ellas, pueden comenzar a beneficiarse de su funcionalidad inmediatamente.

Los invito a adoptar a la seguridad como parte del desarrollo de su próxima aplicación. Esto los beneficiará con aplicaciones menos vulnerables, y sobre todo más confiables.

Conclusión
Es importante que veamos a la seguridad como un aspecto que debe ser incluido como parte del ciclo de vida del desarrollo de cualquier aplicación. Visual Studio Team Edition for Developers no es solamente una herramienta para la escritura de código sino también una de sus características principales será la de proveer un entorno que facilite la generación de código seguro.

Referencias
•Security Guidance for .NET Framework 2.0.
msdn2.microsoft.com/en-us/library/ms954725.aspx
•Visual Studio Team Edition for Software Developers
msdn2.microsoft.com/en-us/teamsystem/aa718809.aspx
•Security Features and Tools
msdn2.microsoft.com/en-us/security/aa570425.aspx