Identificando vulnerabilidades en código fuente a través de análisis estático con SonarQube
Tags: cybersecurity, vulnerabilities, beginners, spanish
Published: 2023-09-13 21:33:19

#Introducción

La seguridad de las aplicaciones es una preocupación creciente en la era digital, ya que el uso de estas tecnologías es cada vez mayor, y por lo tanto también incrementan los riesgos asociados con la presencia de vulnerabilidades en el código fuente. Tales vulnerabilidades pueden convertirse en puertas de entrada para ciberataques y amenazar la integridad, confidencialidad y disponibilidad de datos críticos.

En este contexto, la identificación temprana de vulnerabilidades en el código fuente se ha convertido en una práctica esencial para garantizar la seguridad de las aplicaciones y sistemas. Una de las herramientas utilizadas para esa tarea es SonarQube, una plataforma de análisis estático de código que permite a los desarrolladores y equipos de seguridad, examinar de manera exhaustiva el código fuente en busca de debilidades.

Este post tiene como objetivo mostrar la utilidad de SonarQube en la identificación y corrección de vulnerabilidades, se hace un recorrido por su instalación, uso y algunas características clave (métricas).  A modo de ejemplo se realiza el proceso de remediación de vulnerabilidades en dos proyectos desarrollados en distintos lenguajes, haciendo uso de _key vault_ para introducir la idea de administración segura de claves y secretos.

#Desarrollo

El laboratorio se desarrolla en tres partes: primero se realiza la revisión de conceptos previos, después se instalan las herramientas requeridas, por último se lleva a cabo la identificación de vulnerabilidades con SonarQube.

##Conceptos previos

###Métricas en SonarQube

SonarQube es una plataforma ampliamente utilizada para evaluar y mejorar la calidad del código fuente en proyectos de desarrollo de software. Proporciona una serie de métricas que ayudan a identificar problemas en el código y tomar medidas para remediarlos, en la guía de usuario se explican en detalle [1]. A continuación se resumen algunas:

1. Detección de errores (Reliability): SonarQube detecta errores potenciales en el código, como el acceso a variables no inicializadas o la división por cero. El objetivo es eliminar defectos antes de que causen problemas en tiempo de ejecución.

2. Reglas de calidad del código (Maintainability): SonarQube incluye una serie de reglas predefinidas que evalúan el cumplimiento de buenas prácticas de codificación, como el uso de nombres descriptivos de variables o la gestión adecuada de excepciones. El objetivo es mejorar la legibilidad y la mantenibilidad del código.

3. Seguridad (Security): Identifica problemas de seguridad en el código, ya sean vulnerabilidades conocidas o malas prácticas que podrían exponer el sistema a ataques. El objetivo es fortalecer la seguridad del software.

4. Revisión de seguridad (Security Review): Identifica potenciales problemas de seguridad en el código (hotspots), que podrían facilitar la ejecución de ataques. El objetivo es fortalecer la seguridad del software.

5. Cobertura de código (Coverage): Esta métrica mide la proporción del código fuente que ha sido ejecutada por pruebas automatizadas. El objetivo es garantizar que la mayoría del código esté cubierto por pruebas para reducir la probabilidad de errores no detectados.

6. Duplicación de código (Duplications): Mide la cantidad de código duplicado en el proyecto. El objetivo es reducir la duplicación, ya que aumenta la complejidad y el mantenimiento del código.

Este laboratorio se enfoca en los puntos 3 y 4, relacionados directamente con la seguridad. El punto 5 (Coverage) requiere de configuración adicional dependiendo del lenguaje de desarrollo, lo cual puede ser consultado en la documentación oficial disponible en `https://docs.sonarsource.com/sonarqube/latest/analyzing-source-code/test-coverage/overview/`.

###Lenguajes disponibles en la versión comunitaria de SonarQube

De acuerdo a la documentación oficial de SonarQube [2], la versión comunitaria permite realizar escaneo en 21 lenguajes distintos, los cuales se listan en la siguiente tabla:

|      Lenguajes         |            |            |
|------------------------|------------|------------|
| Azure Resource Manager | HTML       | Ruby       |
| CloudFormation         | Java       | Scala      |
| C#                     | JavaScript | Secrets    |
| CSS                    | Kotlin     | Terraform  |
| Docker                 | Kubernetes | TypeScript |
| Flex                   | PHP        | VB.NET     |
| Go                     | Python     | XML        |

###Key vault

Un Key Vault (bóveda de claves) es un servicio de administración de claves y secretos que se utiliza para proteger información confidencial, tales como: contraseñas, certificados, claves de cifrado y otros datos sensibles. De acuerdo a la documentación de Azure Key Vault [3], entre sus características encontramos:

1. Almacenamiento Seguro: Los Key Vaults están diseñados para proporcionar un entorno altamente seguro para almacenar y gestionar secretos y claves criptográficas. Utilizan técnicas de cifrado avanzadas y protocolos de seguridad para proteger los datos almacenados.

2. Gestión Centralizada: Un Key Vault permite centralizar la gestión de claves y secretos en un solo lugar. Esto simplifica la administración y reduce los riesgos asociados con la dispersión de información confidencial en múltiples ubicaciones.

3. Auditoría y Registro: Proporciona registros de auditoría detallados para rastrear quién accede a los secretos y claves, cuándo lo hacen y qué acciones realizan. Esto es esencial para cumplir con los requisitos de conformidad y detectar actividades sospechosas.

4. Integración con Aplicaciones: Los Key Vaults se pueden integrar fácilmente con aplicaciones y servicios en la nube, permitiendo que estos accedan a secretos y claves de manera segura. Esto evita la necesidad de almacenar información sensible en el código fuente de la aplicación.

5. Rotación Automatizada: Un Key Vault facilita la rotación automática de claves y secretos, lo que mejora la seguridad al garantizar que las claves no estén en uso durante períodos prolongados.

6. Control de Acceso Granular: Los administradores pueden definir políticas de control de acceso detalladas para especificar quién tiene permiso para acceder a qué secretos y claves, y bajo qué circunstancias.

7. Integración con Herramientas de DevOps: Los Key Vaults se pueden integrar con herramientas de desarrollo y operaciones (DevOps) para automatizar la gestión de secretos y claves en el ciclo de vida de las aplicaciones.

En términos de seguridad un Key Vault es esencial para mejorar la seguridad en la nube y proteger información confidencial de la siguiente manera:

1. Protección contra Amenazas Internas y Externas: Al centralizar la gestión de claves y secretos, un Key Vault ayuda a proteger los datos confidenciales contra amenazas tanto internas como externas. Esto incluye el acceso no autorizado y el robo de datos.

2. Conformidad Regulatoria: Los Key Vaults permiten cumplir con regulaciones de seguridad y privacidad al proporcionar un control riguroso sobre el acceso y la auditoría de los secretos y claves.

3. Reducción de Riesgos: La rotación automática de claves y secretos reduce el riesgo de que las claves sean comprometidas debido a la exposición prolongada.

4. Simplificación de la Gestión de Claves: Facilita la gestión de claves y secretos en entornos complejos de nube y reduce la carga operativa.

5. Integración Segura: Permite a las aplicaciones acceder a secretos y claves de manera segura sin almacenar información sensible en el código fuente.

##Instalación de herramientas

Para disponer de SonarQube, se ofrecen dos opciones en la web oficial: descargar un archivo zip ó ejecutarlo utilizando Docker. Para este laboratorio se llevó a cabo la instalación utilizando la segunda opción. En caso de no contar con Docker, puede instalarse siguiendo la guía disponible en `https://docs.docker.com/desktop/install/windows-install/`.

Desde la consola de Powershell puede instalar y ejecutar SonarQube utilizando el siguiente comando:
```
docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube:latest
```

Si todo ha funcionado correctamente, desde Docker Desktop podrá observar el contenedor de SonarQube corriendo de manera similar a la mostrada en la siguiente imagen:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v9vz8zusjyunldty66r0.PNG)

Utilizando el navegador web, debe dirigirse a la URL `http://localhost:9000`. Si es la primera vez que utiliza SonarQube le aparecerá una pantalla de login, las credenciales son admin/admin, se le solicitará asignar una nueva contraseña. Una vez ingrese verá una pantalla como la que se muestra a continuación:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xku2vr9cy0n83pnrefd2.PNG)

## Identificando vulnerabilidades con SonarQube

Se realizará el análisis de 2 proyectos con las siguientes características:

| Proyecto                        | Lenguajes | Tipo  | Repositorio                                      |
|---------------------------------|-----------|-------|------------------------------------------|
| Damn Vulnerable Web Application | PHP/MySQL | Web   | https://github.com/digininja/DVWA        |
| ParticipAR                      | Kotlin    | Móvil | https://github.com/djhuertasg/ParticipAR |

###DVWA

DVWA es una aplicación web intencionalmente vulnerable. Se realiza la descarga del código en zip, y se procede a crear el proyecto en SonarQube.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/htln98jnr4re218saxeo.PNG)

Como método de análisis se selecciona la opción local, para lo cual se debe generar un token como se muestra a continuación:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vsroum7c25o46t94knjx.PNG)

Posteriormente se selecciona entre las herramientas de construcción automatizada de código u otro y el sistema operativo desde el cual se esta ejecutando el análisis. Adicionalmente, antes de ejecutar el escaneo, se debe descargar el escáner y añadirlo al path, cómo se muestra en las imágenes:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u4mvinxet63hx2rzcqf0.PNG)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xlzrvigppaajp55unkoj.PNG)

Una vez se tenga todo configurado, se procede a lanzar la ejecución del análisis desde Powershell, ubicado en la carpeta del proyecto a analizar con la siguiente línea de código:
```
sonar-scanner.bat -D"sonar.projectKey=DVWA" -D"sonar.sources=." -D"sonar.host.url=http://localhost:9000" -D"sonar.token=sqp_6479b25b30a19dff8cd009d3d4bcc9f478b799f3"
```

Tenga en cuenta que en una implementación en un ambiente real, el token debe mantenerse secreto, a fin de evitar el uso no autorizado de recursos.

Una vez ejecutado el análisis se obtiene el resultado mostrado a continuación:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kcwy6hxasp6ob1ruenm3.PNG)

En el detalle de las vulnerabilidades de seguridad, se encuentran las siguientes:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xvo5cqkcu9k9auhvd73b.PNG)

Ambas vulnerabilidades están asociadas a 'código quemado', es decir, credenciales que se dejaron en el código (en este caso de base de datos), lo cual va en contra de los lineamientos de desarrollo seguro. Para cada una de las vulnerabilidades SonarQube detalla cuál es el problema (indicando el archivo y línea de código correspondiente), por qué es un problema y cómo se puede solucionar.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hbsqyf10tjq7e3fy38q7.PNG)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vvdtzfj01dmqgtq8hfrq.PNG)

A continuación se muestra el código vulnerable en el archivo compose.yml

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bi0619x1sjeg1tmpw8jj.PNG)

Una opción para resolver esta vulnerabilidad es utilizar un _key vault_, suponiendo que contamos con uno, se ajusta el código como se muestra en la imagen:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cwtt14ju8wp274yfdbh1.PNG)

A continuación se muestra el código vulnerable en el archivo test.php

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y0erqjdlzuvjgbnztwy9.PNG)

Suponiendo el uso de un _key vault_, se ajusta el código como se muestra a continuación:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4ov8hockj6pyfmrw3xlb.PNG)

Realizados los ajustes, se procede a ejecutar nuevamente el análisis en SonarQube, obteniendo cero vulnerabilidades.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e6c4xj30kbvwnj6cf523.PNG)

###ParticipAR

ParticipAR es una aplicación móvil desarrollada en Kotlin para la plataforma android.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hcmifamfu1259eop5772.PNG)

Se procede a crear el proyecto en SonarQube.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ljjtwyte6ar6ai9te423.PNG)

De manera similar se procede a ejecutar el análisis:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zdxmnj8ge55b7l4s96vq.PNG)

Se observa que SonarQube no identifica vulnerabilidades, pero si hotspots.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bbltqgw6gcf1rpiktpwg.PNG)

Se identifica que no se obliga a ejecutar conexiones seguras, lo cual en versiones menores a Android 9 podría llevar el uso de protocolos no cifrados. También se muestran alertas referentes a permisos para realizar backup, utilizar la cámara y acceder a la ubicación del dispositivo.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2ozknri2sm483z4q0nua.PNG)

Se modifica el archivo AndroidManifest.xml para deshabilitar el uso de protocolos inseguros y backup.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zvqvfrvuhq52pfzb7mci.PNG)

Dado que la aplicación requiere los permisos de cámara y ubicación, se procede a declararlos seguros, como se observa en la imagen:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qhjpdkp1clzd7q70yno7.PNG)

Una vez realizados esos ajustes, se procede a ejecutar el análisis nuevamente, obteniendo cero hotspots.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rs3ad14hq8tbyvi442zl.PNG)

#Conclusiones

La identificación temprana de vulnerabilidades en el código fuente es esencial para garantizar la seguridad de las aplicaciones y sistemas, SonarQube es una herramienta versátil para automatizar esa tarea, proporcionando métricas, identificando el código a corregir y sugiriendo las remediaciones a realizar.

El uso de un Key Vault es fundamental para la gestión segura de claves y secretos, lo que contribuye a proteger información confidencial y reducir los riesgos asociados con la exposición de datos sensibles.

Se debe integrar la seguridad en el ciclo de desarrollo de software, a través de prácticas de operaciones de desarrollo seguras (DevSecOps).

#Referencias

[1] “An overview of the key concepts used within SonarQube.” SonarQube 10.2. Accedido el 13 de septiembre de 2023. [En línea]. Disponible: https://docs.sonarsource.com/sonarqube/latest/user-guide/concepts/

[2] “Languages overview”. SonarQube 10.2. Accedido el 13 de septiembre de 2023. [En línea]. Disponible: https://docs.sonarsource.com/sonarqube/latest/analyzing-source-code/languages/overview/

[3] “Azure Key Vault documentation”. Microsoft Learn: Build skills that open doors in your career. Accedido el 13 de septiembre de 2023. [En línea]. Disponible: https://docs.microsoft.com/en-us/azure/key-vault/