¿Qué es CodeQL?
CodeQL es el motor de análisis que usan los desarrolladores para automatizar las comprobaciones de seguridad y los investigadores de seguridad para realizar análisis de variantes.
En CodeQL, el código se trata como datos. Las vulnerabilidades de seguridad, los errores y otros problemas se modelan como consultas que se pueden ejecutar en bases de datos extraídas del código. Puede ejecutar las consultas estándar de CodeQL, escritas por investigadores de GitHub y colaboradores de la comunidad, o escribir las suyas propias para usarlas en análisis personalizados. Las consultas que detectan posibles errores resaltan el resultado directamente en el archivo de código fuente.
En esta unidad, obtendrá información sobre la herramienta de análisis estático de CodeQL y cómo usa bases de datos, conjuntos de consultas y paquetes de lenguajes de consulta para realizar análisis de variantes.
Análisis de variantes
El análisis de variantes es el proceso de usar una vulnerabilidad de seguridad conocida como una semilla para encontrar problemas similares en el código. Es una técnica que los ingenieros de seguridad usan para identificar posibles vulnerabilidades y asegurarse de que estas amenazas se corrigieron correctamente en varios códigos base.
La consulta de código mediante CodeQL es la manera más eficaz de realizar análisis de variantes. Puede usar las consultas de CodeQL estándar para identificar vulnerabilidades de inicialización o para buscar nuevas vulnerabilidades escribiendo sus propias consultas de CodeQL personalizadas. Después, puede desarrollar o iterar por la consulta para buscar automáticamente variantes lógicas del mismo error que podrían pasarse por alto al usar técnicas manuales tradicionales.
Bases de datos de CodeQL
Las bases de datos CodeQL contienen datos consultables extraídos de un código base para un único idioma en un momento dado. La base de datos contiene una representación jerárquica completa del código, incluida una representación del árbol de sintaxis abstracta, el gráfico del flujo de datos y el gráfico del flujo de control.
Cada lenguaje tiene su propio esquema de base de datos único que define las relaciones usadas para crear una base de datos. El esquema proporciona una interfaz entre el análisis léxico inicial realizado durante el proceso de extracción y el análisis complejo real del evaluador de consultas de CodeQL. El esquema especifica, por ejemplo, que hay una tabla para cada construcción del lenguaje.
Para cada lenguaje, las bibliotecas de CodeQL definen clases para proporcionar una capa de abstracción sobre las tablas de base de datos. Esto proporciona una vista orientada a objetos de los datos, que facilita la escritura de consultas.
Por ejemplo, en una base de datos de CodeQL para un programa de Java, dos tablas clave son:
- La tabla
expressions, que contiene una fila para cada expresión única del código fuente que se ha analizado durante el proceso de compilación. - La tabla
statements, que contiene una fila para cada instrucción única del código fuente que se ha analizado durante el proceso de compilación.
La biblioteca de CodeQL define clases para proporcionar una capa de abstracción sobre cada una de estas tablas, y las tablas auxiliares relacionadas: Expr y Stmt.
Conjuntos de consultas
Los conjuntos de consultas codeQL proporcionan una manera de seleccionar consultas en función de su nombre de archivo, propiedades de metadatos o ubicación en el disco o en un paquete de QL. Cree conjuntos de consultas para las consultas que desea usar con frecuencia en los análisis de CodeQL.
Los conjuntos de consultas permiten pasar varias consultas a CodeQL sin tener que especificar la ruta de acceso a cada archivo de consulta individualmente. Las definiciones del conjunto de consultas se almacenan en archivos YAML con la extensión .qls. Una definición de suite es una secuencia de instrucciones donde cada instrucción es un mapeo de YAML que, por lo general, tiene una sola clave. Las instrucciones se ejecutan en el orden en que aparecen en la definición del conjunto de consultas. Una vez ejecutadas todas las instrucciones de la definición del conjunto, el resultado es un conjunto de consultas seleccionadas.
Conjuntos de consultas predeterminados
Hay dos conjuntos de consultas integrados para CodeQL:
-
default: estas son las consultas que se ejecutan de forma predeterminada en el examen de código CodeQL en GitHub, disponible con la configuración predeterminada del examen de código. Las consultas de este conjunto de consultas son muy precisas y devuelven pocos resultados positivos falsos en el escaneo de código. En relación con el conjunto de consultassecurity-extended, el conjunto predeterminado devuelve menos resultados de examen de código de baja confianza. -
security-extended: este conjunto contiene todas las consultas del conjuntodefault, además de consultas de seguridad adicionales con una precisión y gravedad ligeramente inferiores. Está disponible con la configuración predeterminada del análisis de código y aparece como la opción "Extendida" en la lista desplegable de conjuntos de consultas. En relación con el conjunto de consultasdefault, este conjunto puede devolver un mayor número de resultados de detección de falsos positivos en el código.
La configuración predeterminada del examen de código usará el conjunto de consultas default. Esto se puede cambiar seleccionando el icono de desbordamiento para ver la configuración de CodeQL y, a continuación, seleccionando el botón editar. En "Configuración del examen", puede elegir una de las dos opciones que se describen como conjunto de consultas.
Paquetes de CodeQL
Los paquetes de CodeQL se usan para organizar los archivos usados en el análisis de CodeQL para que pueda crear, compartir y ejecutar bibliotecas y consultas de CodeQL, así como depender de ellas, fácilmente. Contienen consultas, archivos de biblioteca, conjuntos de consultas y metadatos importantes. Con los paquetes de CodeQL y los comandos de administración de paquetes en la CLI de CodeQL, puede publicar sus consultas personalizadas e integrarlas en su análisis de código base.
Hay tres tipos de paquetes de CodeQL: paquetes de consultas, paquetes de biblioteca y paquetes de modelos.
- Los paquetes de consultas están diseñados para ejecutarse. Cuando se publica un paquete de consultas, la agrupación incluye todas las dependencias transitivas y representaciones compiladas previamente de cada consulta, además de los orígenes de consulta. Esto garantiza una ejecución eficiente y coherente de las consultas en el paquete.
- Los paquetes de biblioteca están diseñados para que los usen los paquetes de consulta (u otros paquetes de biblioteca) y no contengan consultas por sí mismas. Las bibliotecas no se compilan por separado.
- Los paquetes de modelos se pueden usar para expandir el análisis de código para incluir dependencias que no son compatibles por defecto. Los paquetes de modelos están actualmente en versión beta y están sujetos a cambios. Durante la versión beta, los paquetes de modelos están disponibles para el análisis de Java en el nivel de repositorio. Para obtener más información sobre cómo crear sus propios paquetes de modelos, consulte "Creación de un paquete de modelos de CodeQL".
Estructura del paquete de CodeQL
La CLI de CodeQL se puede usar para desarrollar y publicar un paquete mediante el pack init comando . Este comando creará la estructura de directorios y los archivos necesarios, incluido el archivo principal llamado qlpack.yml en su directorio raíz. Los metadatos de cada archivo qlpack.yml indican a CodeQL cómo compilar las consultas del paquete, de qué bibliotecas depende el paquete y dónde buscar definiciones del conjunto de consultas.
El contenido del paquete de CodeQL (consultas o bibliotecas usadas en el análisis de CodeQL) se incluye en el mismo directorio que qlpack.ymlo sus subdirectorios.
El directorio que contiene el archivo qlpack.yml actúa como directorio raíz del contenido del paquete de CodeQL. Es decir, para todos los archivos .ql y .qll en el paquete, CodeQL resolverá todas las instrucciones de importación en relación con el directorio que contiene el archivo qlpack.yml en la raíz del paquete.
Este es un archivo qlpack.yml de ejemplo:
name: codeql/java-queries
version: 0.0.6-dev
groups: java
suites: codeql-suites
extractor: java
defaultSuiteFile: codeql-suites/java-code-scanning.qls
dependencies:
codeql/java-all: "*"
codeql/suite-helpers: "*"
Para obtener más información sobre cómo crear y publicar sus propios paquetes de CodeQL, consulte "Publicación y uso de paquetes de CodeQL".[1]