¿Qué es CodeQL?

Completado

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 inicialización para encontrar problemas similares en el código. Se trata de una técnica que los ingenieros de seguridad usan para identificar posibles vulnerabilidades y asegurarse de que estas amenazas se corrigirán 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 de CodeQL contienen datos consultables extraídos de un código base, para un único lenguaje en un momento específico. 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 de CodeQL proporcionan una manera de seleccionar consultas, en función de su nombre de archivo, ubicación en disco o en un paquete QL o propiedades de metadatos. 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 conjunto es una secuencia de instrucciones, donde cada instrucción es una asignación de YAML que, normalmente, 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 de examen de código falsos positivos. En relación con el conjunto de consultas security-extended, el conjunto predeterminado devuelve menos resultados de examen de código de baja confianza.
  • security-extended: este conjunto contiene todas las consultas del conjunto default, además de consultas de seguridad adicionales con una precisión y gravedad ligeramente inferiores. Está disponible con la configuración predeterminada del examen de código y aparece como la opción "Extended" en la lista desplegable de conjuntos de consultas. En relación con el conjunto de consultas default, este conjunto puede devolver un mayor número de resultados de examen de código falsos positivos.

La configuración predeterminada del examen de código usará el conjunto de consultas default. Se puede cambiar mediante la selección del icono de desbordamiento para ver la configuración de CodeQL y, a continuación, la selección del botón Editar. En "Configuración de exploración", puede elegir una de las dos opciones anteriores 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 la ejecución coherente y eficaz de las consultas del paquete.
  • Los paquetes de biblioteca están diseñados para que los usen paquetes de consulta (u otros paquetes de biblioteca) y no contienen consultas. Las bibliotecas no se compilan por separado.
  • Los paquetes de modelos se pueden usar para expandir el análisis de examen de código para incluir dependencias que no se admiten de forma predeterminada. 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 comando pack init. 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 del paquete, CodeQL resolverá todas las instrucciones de importación relativas al 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]