Por Michael V., experto en ciberseguridad

CodeQL es una herramienta que permite detectar vulnerabilidades mediante el análisis del código fuente de tus aplicaciones.
Se puede utilizar tanto para pruebas automatizadas durante el ciclo de vida del desarrollo de software (SDLC) como por investigadores en seguridad para proyectos específicos.
Probablemente, uno de sus usos más habituales sea el análisis automático de proyectos de GitHub, al que se puede acceder de forma gratuita [1].
La herramienta se distingue por estas «consultas» en formato « de dónde seleccionar » que se puede ejecutar directamente en línea [2].

También es posible adaptar la herramienta para buscar vulnerabilidades en el código alojado o transferido localmente a una máquina dedicada. Es aquí donde entra en juego CodeQL-CLI.
Esta herramienta ya está muy bien documentada [3]. El objetivo de este artículo es centrarse en lo esencial para agilizar la búsqueda de vulnerabilidades en una aplicación objetivo, con el fin de realizar posteriormente pruebas más específicas.
Para ello, es necesario descargar las herramientas para poder utilizarlas de forma local, a saber:
- Los binarios que permiten ejecutar nuestras consultas (queries) [4];
- Las propias consultas [4], que servirán de base para iniciar la búsqueda de vulnerabilidades.
A continuación, estos dos elementos se colocan uno al lado del otro en una misma carpeta. Como ambos tienen el mismo nombre, hay que cambiar el nombre de uno de ellos. En nuestro caso, la carpeta que contiene nuestras consultas se llama « codeql-queries ». Cabe señalar que CodeQL se puede añadir a la ruta, aunque no es imprescindible:
Modo Hora de última escritura Longitud Nombre
---- ------------- ------ ----
da---l 06/06/2021 10:52 codeql
da---l 06/06/2021 10:48 codeql-queries
Nuestro código y sus dependencias también deben convertirse a una base de datos que CodeQL pueda analizar posteriormente.
Para ello, el comando crear base de datos intentará recuperar automáticamente, o bien tomará como entrada, las opciones de compilación del proyecto y creará una base de datos que luego se podrá mantener a lo largo del tiempo.
A continuación se muestra un ejemplo de comando ejecutado desde el directorio actual de un proyecto; en este caso concreto, la herramienta localiza automáticamente el archivo pom.xml del proyecto Spring y el comando Maven adecuado.
Evidentemente, no siempre será así y la opción--comandopermite corregir posibles errores o utilizar una herramienta específica para la compilación:
..\codeql-home\codeql\codeql.cmd database create ..\java-spring-POC1 --language=javaUna vez finalizada la compilación, la herramienta confirma que la base de datos se ha creado correctamente con el siguiente mensaje:
Successfully created database at <PATH>Dado que el objetivo inicial es realizar una búsqueda preliminar de vulnerabilidades, es preferible ejecutar toda una serie de consultas. Desde el punto de vista de la seguridad, las consultas preexistentes clasificadas según la CWE (Common Weakness Enumeration) constituyen un buen punto de partida.
En resumen, hay unos directorios llamados «
codeql-suites» contienen listas de consultas especificadas en archivos.qls.Cabe señalar que la extensión.qlcontenerá la consulta CodeQL que se analizará por separado.
Por último, el comando ` database analyze ` y las siguientes opciones permiten especificar la ruta de los «helpers» necesarios para nuestra lista de consultas, así como el formato deseado para el resultado del análisis:
.\codeql-home\codeql\codeql.cmd database analyze java-spring-POC1-database .\codeql-home\codeql-queries\codeql-main\java\ql\src\codeql-suites\java-lgtm.qls --format=sarifv2.1.0 --output=OUTPUT.sarif --search-path .\codeql-home\codeql-queries\codeql-main\misc\suite-helpersLos resultados pueden presentarse en distintos formatos; a continuación se muestra un extracto en formato JSON con nuestro archivo y la línea que contiene una vulnerabilidad de tipo inyección SQL:
"results" : [ {
"ruleId" : "java/sql-injection",
"ruleIndex" : 54,
<…SNIP…>
"uri" : "src/main/java/com/appli/test/testsqli.java",
"uriBaseId" : "%SRCROOT%",
<…SNIP…>
"region" : {
"startLine" : 18,
"startColumn" : 44,
"endColumn" : 45
}
Una vez completada esta primera etapa, la búsqueda de vulnerabilidades puede continuar mediante consultas CodeQL más específicas, una revisión manual del código o pruebas dinámicas.
Referencias
- Licencia: https://securitylab.github.com/tools/codeql/license/
- Consola de consultas: https://lgtm.com/
- Documentación: https://codeql.github.com/docs/codeql-cli/
- Archivos binarios: https://github.com/github/codeql-cli-binaries
- Consultas: https://github.com/github/codeql
