lunes, 22 de agosto de 2011

Análisis estático de código con RATS


Durante el proceso de desarrollo, o mantenimiento, de software es necesario prestar atención a todos los aspectos relacionados con la seguridad del mismo y no únicamente al aspecto y/o funcionalidades del mismo.
Entre las acciones que se han de llevar a cabo para vigilar el nivel de calidad en cuanto a términos de seguridad se refiere, nos encontramos con la auditoría de seguridad de caja blanca de todo el código fuente. A pesar de que dicho proceso pueda realizarse manualmente revisando miles y miles de líneas de código es una tarea repetitiva y tediosa que puede automatizarse en gran medida.

Existe gran diversidad de software destinado a ayudar a la auditoría de código (semi)automatizada y, dependiendo del lenguaje auditado, de las necesidades de creación automatizada de informes, etc, necesitaremos usar uno u otro.
En este caso vamos a utilizar RATS (Rough Auditing Tool for Security), de la empresa Fortify y disponible como herramienta Open Source, para analizar de forma estática un programa en C y buscar de forma fácil vulnerabilidades en el mismo.

Para ello, vamos a utilizar el siguiente código:

int main(int argc, char *argv[]){
char buffer[10];
strcpy(buffer, argv[1]);
}

Es un código muy simple que, lo único que hace, es copiar el primer parámetro que se le proporcione en el array de char llamado buffer, sin realizar ningún tipo de comprobación previa. Ello, dependiendo de dicho parámetro, puede conducir a un stack buffer overflow, lo que podría provocar la ejecución de código arbitrario mediante la explotación de dicha vulnerabilidad. Es un ejemplo simple, pero nos servirá para la prueba de RATS.

Primero será necesario instalar RATS, o bien con un conocido ./configure, make, make install o bien directamente del repositorio según la distribución.
La forma más sencilla de ejecución de RATS es indicando únicamente el fichero, o directorio, que contiene el código fuente a auditar.


Como podemos ver en la imagen, RATS ha encontrado que se utiliza un buffer de tamaño fijo, así como la función strcpy, y nos avisa de que ambas acciones son peligrosas y pueden conllevar un desbordamiento de memoria.

Entre las distintas opciones disponibles, existe una que considero que puede resultar de gran utilidad, la opción --xml. Con ella, la salida de RATS se nos mostrará formateada en XML, por lo que podremos volcarlo a un fichero para su posterior tratamiento.
Un ejemplo de dicho tratamiento podría ser un script de entrada en un repositorio SVN para comprobar el número y gravedad de vulnerabilidades y, según los resultados, permitir o no hacer el commit (gracias Leo por la idea).

Esto es sólo un ejemplo muy sencillo pero que vale para demostrar la utilidad de herramientas como RATS que pueden ayudar en gran medida en los tediosos procesos de revisión de código, siempre sin olvidar que se realiza un contenido estático basado en las funciones utilizadas (en RATS dichas funciones peligrosas se declaran en ficheros XML, lo que permite una rápida modificación o expansión de las mismas) y que siempre será necesaria la revisión manual debido a posibles falsos positivos y/o falsos negativos.

Espero que a alguno de vosotros os sea de utilidad en algún momento, saludos.



No hay comentarios:

Publicar un comentario