El proyecto titulado Evaluación automática de la seguridad y calidad del código fuente mediante búsqueda inteligente en grafos de conocimiento con código C005/21-EDse desarrolla a través de una colaboración entre el grupo de investigación Tecnología Electrónica e Informática Industrial y la empresa Bosonit S.L.
El proyecto se centró en la creciente exposición de software y aplicaciones de entidades a terceros, debido a la transición hacia entornos web, móviles y en la nube. Los métodos de seguridad tradicionales se consideraban insuficientes, lo que había llevado a un aumento significativo de ataques exitosos en los últimos años. Además, más del 92% de las vulnerabilidades explotables se encontraban en el software, según el National Institute for Standards and Technology.
Para abordar estos problemas, se desarrolló una herramienta llamada BALDER, que se centró en la seguridad de aplicaciones. La mayoría de las aplicaciones carecían de auditorías de ciberseguridad durante su desarrollo, lo que llevaba a la presencia generalizada de vulnerabilidades. BALDER realizó un análisis de código basado en grafos de conocimiento, utilizando algoritmos de Machine Learning y Big Data para la detección de vulnerabilidades de seguridad en el código fuente.
El objetivo de BALDER fue fortalecer el eslabón más débil de la cadena tecnológica, es decir, las aplicaciones, mejorando su seguridad y evitando el robo de datos o códigos. La herramienta abordó la brecha educativa existente al proporcionar un análisis exhaustivo respaldado por tecnologías innovadoras.
Las principales técnicas usadas en el estado del arte actual de la detección de vulnerabilidades están basadas en: fuzzing, security scanning, static análisis, binary comparison, y dynamic análisis. Para aplicar estas técnicas es necesario aplicar una serie de técnicas de preprocesamiento del código fuente que permitan realizar una representación del código compatible con dichas técnicas, para ello suelen utilizarse representaciones de secuencia, árboles de sintaxis abstracta y grafos de control de flujo, dichas representaciones permiten realizar detecciones más eficaces en el código, simplificando los patrones a detectar. Estas técnicas suelen combinarse con distintos algoritmos clásicos como XGBoost, Random Forest, Logistic Regression, KNN, Decision Tree, etc.
La solución propuesta extiende el tradicional concepto del Árbol abstracto de sintaxis (Abstract Syntax Tree) con funciones avanzadas. El AST se construye durante la fase de análisis sintáctico del proceso de compilación y consta de nodos que representan los elementos del lenguaje de programación utilizados en el código fuente. Estos nodos están organizados en una jerarquía donde cada nodo tiene uno o más nodos hijos que representan sus componentes o subexpresiones.
La estructura específica del AST varía según el lenguaje de programación y el compilador utilizado, pero generalmente sigue una estructura similar. Por ejemplo, en un lenguaje de programación como Java, el AST puede contener nodos para representar declaraciones de clases, métodos, variables, expresiones y operaciones.
Para enriquecer el AST se añaden distintas técnicas como el análisis de flujo de datos, permitiendo registrar no solo el flujo de ejecución sino también las posibles asignaciones para cada variable e identificador, con el objetivo de establecer patrones de vulnerabilidades que permite no solo eliminar los falsos positivos, sino también reducir los falsos negativos.
En el ámbito de la detección de vulnerabilidades en código fuente, el algoritmo de análisis de flujo de datos puede ser una herramienta muy útil para identificar posibles puntos débiles y vulnerabilidades en el software. Algunas posibilidades y mejoras específicas en este contexto incluyen:
- Detección de Vulnerabilidades Específicas: el análisis de flujo de datos puede ayudar a identificar patrones de flujo de datos que son indicativos de vulnerabilidades específicas, como inyecciones de SQL, cross-site scripting (XSS), desbordamientos de búfer, deserialización insegura, entre otros.
- Análisis de Cadena de Confianza: el algoritmo puede rastrear cómo se propaga la confianza y la validación de datos a través del código fuente, identificando posibles puntos donde se pierde o se compromete la integridad de los datos.
- Detección de Errores de Validación de Entrada: identificar áreas de código donde se realizan operaciones de entrada de datos sin suficiente validación o sanitización, lo que podría llevar a vulnerabilidades de seguridad como inyecciones de código o manipulación de datos maliciosos.
- Análisis de Flujo de Control y Autenticación: el análisis de flujo de datos puede complementarse con el análisis de flujo de control para identificar posibles rutas de ejecución que podrían evadir mecanismos de autenticación o autorización, lo que podría conducir a violaciones de seguridad.
- Identificación de Dependencias Inseguras: rastrear dependencias entre componentes de software y bibliotecas externas para identificar posibles vulnerabilidades conocidas o vulnerabilidades de terceros que podrían introducir riesgos de seguridad en el sistema.
En términos de mejoras potenciales:
- Mejora de las Reglas de Análisis: desarrollar reglas de análisis más sofisticadas y específicas para detectar vulnerabilidades conocidas y patrones de código potencialmente peligrosos.
- Incorporación de Contexto y Semántica: integrar información contextual y semántica en el análisis de flujo de datos para mejorar la precisión y reducir los falsos positivos.
- Aprendizaje Automático y Análisis de Comportamiento: incorporar técnicas de aprendizaje automático y análisis de comportamiento para identificar anomalías y patrones inusuales en el flujo de datos que podrían indicar posibles vulnerabilidades.
- Integración con Herramientas de Desarrollo: integrar el análisis de flujo de datos con herramientas de desarrollo para proporcionar retroalimentación en tiempo real a los desarrolladores sobre posibles problemas de seguridad mientras escriben y editan el código.
Fuente: Prof. Carlos León, coordinador del proyecto.