La importancia del Análisis de Seguridad en el código de tu proyecto

analisis-seguridad-codigo

análisis-seguridad-codigo

Este articulo presenta las técnicas para la detección de vulnerabilidades en el código de una aplicación a través del análisis de los flujos de datos y llamadas entre métodos internos de la aplicación.

Este tipo de análisis identifica las conexiones internas entre los métodos de la aplicación, reflejando como las llamadas entre métodos se propagan desde las interfaces de la aplicación (puntos de enlace con el exterior) hacia los métodos internos que pueden ser objetivo de un ataque.

Se presentan algunas técnicas propias de este tipo de análisis de forma que el lector adquiera los conocimientos básicos para comprender cuál es la finalidad de este tipo de análisis y como se ejecutan. Aunque este artículo refleja aspectos generales del análisis que es posible utilizar con cualquier tipo de herramienta, la bibliografía utilizada y los ejemplos prácticos se apoyan en las herramientas de análisis de código de McCabe81.

Las herramientas usadas para este tipo de análisis emplean diferentes técnicas que ayudan al analista a seguir los caminos de ejecución del código, a localizar el uso de métodos vulnerables y detectar puntos donde determinados tipos de datos pueden inducir un malfuncionamiento de la aplicación, y ser explotados por un ataque o generar inestabilidad en el funcionamiento de la aplicación.

El resultado de este análisis es válido para detectar vulnerabilidades debidas a implementaciones inadecuadas del código, pero también sirve para mejorar la calidad de la aplicación. El resultado obtenido de la herramienta refleja las vías en que un ataque podría provocar un mal funcionamiento, sin embargo, en muchas ocasiones la criticidad de la vulnerabilidad es baja. Ello puede ser debido a que el impacto resultante, en caso de que el ataque consiga su objetivo, es bajo; o también porque las probabilidades de que un ataque ocurra por esa vía son despreciables.

Análisis inicial

El análisis comienza identificando las conexiones entre los puntos de entrada a una aplicación, es decir puntos de acceso desde el exterior, y puntos internos de la aplicación susceptibles de recibir un ataque. Esas conexiones serían las que un ataque explotaría para obtener su efecto. El ataque accedería a través del punto de entrada, llegando a ese punto interno que provoca el efecto no deseado, como por ejemplo, el desbordamiento de un puntero.

Usando la terminología de estas herramientas, el conjunto de todos los puntos de acceso es la attack surface (superficie de ataque); mientras que los puntos internos se denominan attack target (blanco del ataque). La representación de los caminos recorridos por las llamadas entre métodos de la aplicación desde attack surface hasta attack target se denomina battle map (mapa de batalla).

Ajuste del análisis

Tras la creación del attack map asociando una attack surface y un attack target, se inicia una fase de ajuste de las conexiones sobre las que el analista centra el análisis.

En primer lugar podemos realizar un ajuste sobre los métodos reflejados en el battlemap, excluyendo aquellos métodos no conectados entre los métodos de attack surface y attack target de un mismo attack map. De esta forma clarificamos la vista, visualizando solo los métodos invocados en la cadena de llamadas desde los métodos de entrada, o bien que procesan los datos introducidos en los puntos de entrada.

Otra forma de agrupar los métodos es agrupar los métodos bien de attack surface, o bien de attack target de forma que en la visualización del battlemap los métodos aparezcan representados de forma simplificada por un único elemento, y las conexiones correspondientes se concentran alrededor de estos elementos.

Análisis de métodos raíz

Un método raíz es aquel que no es llamado desde ningún otro punto de la aplicación; podría ser el punto de inicio de la aplicación, por ejemplo el método main; y también puede haber múltiples métodos raíz, por ejemplo en aplicaciones que atienden eventos. El battlemap muestra los árboles encontrados que cuelgan desde los métodos raíz y crecen mediante ramas que representan las cadenas de llamadas entre métodos.

Con este análisis se detectan patrones de ataque no analizados previamente, que solo consideraban los métodos entre puntos de entrada de datos y métodos vulnerables. La aplicación obtiene datos del mundo exterior que aun no provocando un ataque directamente, pueden ocasionar que una llamada entre métodos, no pertenecientes a la cadena de llamadas entre attack surface y attack target, produzca una alteración en el correcto funcionamiento de la aplicación.

El análisis se inicia con una revisión automática del conjunto de código que compone la aplicación, obteniendo como resultado una lista de potenciales problemas de seguridad. Cada punto de la lista es revisado conjuntamente entre personal de desarrollo y personal de seguridad, identificando cual es el riesgo asociado y el impacto sobre el uso final de la aplicación. Desarrollo ha de estar presente para identificar los riesgos asociados con el aviso detectado por la herramienta y valorar el impacto en el contexto de la aplicación.

Seguridad ha de velar por la mejora del código e identificar las vías reales que un ataque podría usar para explotar una vulnerabilidad. La siguiente fase consiste en elaborar una lista de acciones que corrijan los problemas de seguridad, e igualmente una lista de riesgos que son asumidos.  Este procedimiento es el más comúnmente utilizado.