Exploración de CodeQL en GitHub
Qué es CodeQL
CodeQL es un motor de análisis de código semántico desarrollado por GitHub que trata el código como datos. En lugar de simplemente buscar patrones de texto, CodeQL entiende la estructura y el significado del código, lo que permite un análisis sofisticado de seguridad y calidad.
Las herramientas de análisis estático tradicionales suelen producir falsos positivos porque usan coincidencias de patrones simples. El enfoque semántico de CodeQL comprende el contexto de código, las relaciones entre los elementos de código y el flujo de datos a través de aplicaciones, lo que da lugar a una detección de vulnerabilidades más precisa.
Características clave de CodeQL
CodeQL trata el código como una base de datos:
- Representación estructural: Convierte el código fuente en una base de datos que captura árboles de sintaxis, gráficos de flujo de control y rutas de flujo de datos.
- Formato consultable: Hace que el código sea consultable mediante un lenguaje de consulta especializado, similar a consultar una base de datos tradicional.
- Enfoque independiente del lenguaje: Admite varios lenguajes de programación, como C/C++, C#, Java, JavaScript/TypeScript, Python, Ruby, Go y Swift.
- Cobertura completa: Analiza no solo archivos individuales, sino código base completo con todas sus interconexiones.
CodeQL permite un análisis preciso de seguridad:
- Análisis de variantes: Una vez que identifique una vulnerabilidad, puede escribir consultas para encontrar problemas similares en todo el código base.
- Análisis de flujo de datos: Realiza un seguimiento de cómo se mueven los datos a través de la aplicación desde orígenes (entrada de usuario) a receptores (operaciones confidenciales).
- Seguimiento taint: identifica cuándo los datos que no son de confianza llegan a operaciones confidenciales sin una validación o saneamiento adecuadas.
- Análisis de flujo de control: Comprende las rutas de acceso de ejecución y la lógica condicional para encontrar vulnerabilidades que solo se producen en condiciones específicas.
Funcionamiento de CodeQL
El análisis de CodeQL implica tres fases distintas que transforman el código fuente en hallazgos de seguridad accionables:
Fase 1: Crear una base de datos CodeQL
El primer paso extrae una representación estructurada del código:
- Extracción de código: Analiza los archivos de origen durante la compilación o a través del análisis estático.
- Creación de la base de datos: Crea una base de datos completa que representa la estructura del código, incluidos árboles de sintaxis abstractos, gráficos de flujo de control y dependencias de datos.
- Captura de metadatos: Registra ubicaciones de archivos, números de línea, ámbitos de variables, llamadas de función y jerarquías de clases.
- Optimización: Indexa la base de datos para realizar consultas eficaces, incluso en bases de código grandes.
Esta base de datos se convierte en la base de todos los análisis posteriores. Se crea una vez y se puede consultar varias veces, lo que hace que el análisis de seguridad iterativo sea eficaz.
Fase 2: Ejecución de consultas codeQL
Una vez que la base de datos existe, ejecute consultas para encontrar problemas de seguridad:
- Paquetes de consultas estándar: GitHub proporciona conjuntos de consultas mantenidos para vulnerabilidades comunes (estándares de OWASP Top 10, CWE).
- Consultas personalizadas: Escriba sus propias consultas para buscar patrones de seguridad específicos de la organización o infracciones de estándares de codificación.
- Ejecución de consultas: El motor de CodeQL ejecuta consultas en la base de datos, buscando patrones de código que coincidan con las firmas de vulnerabilidad.
- Rendimiento: Las consultas se ejecutan rápidamente porque funcionan en la base de datos indexada en lugar de en archivos de código fuente sin procesar.
Entre las categorías de consulta de ejemplo se incluyen:
- Vulnerabilidades de inyección: Inyección de código SQL, inyección de comandos, scripting entre sitios.
- Problemas de autenticación: Directivas de contraseñas débiles, comprobaciones de autenticación que faltan, administración de sesiones no seguras.
- Problemas de criptografía: Algoritmos débiles, credenciales codificadas de forma rígida, aleatoriedad insuficiente.
- Administración de recursos: Fugas de memoria, agotamiento de recursos, consumo de recursos no controlado.
Fase 3: Interpretación de los resultados
En la fase final se presentan los resultados en formatos accionables:
- Clasificación de resultados: CodeQL prioriza los resultados por gravedad, nivel de confianza y vulnerabilidad.
- Información contextual: Cada búsqueda incluye ubicaciones de archivos, números de línea, fragmentos de código afectados y rutas de flujo de datos.
- Guía de corrección: Los resultados incluyen explicaciones de la vulnerabilidad y las recomendaciones para corregirla.
- Integración: Los resultados se integran con la pestaña Seguridad de GitHub, anotaciones de solicitud de incorporación de cambios y archivos SARIF para herramientas externas.
Lenguaje de consulta CodeQL
Las consultas CodeQL se escriben en un lenguaje declarativo diseñado específicamente para analizar código:
Estructura y sintaxis de consultas
CodeQL usa la programación lógica orientada a objetos:
- Clases y predicados: Defina lo que está buscando mediante clases que representan elementos de código (funciones, variables, expresiones).
- Enfoque declarativo: Describa lo que desea encontrar en lugar de cómo encontrarlo.
- Coincidencia de patrones: Use predicados para buscar coincidencias con patrones de código y relaciones.
- Composabilidad: Cree consultas complejas mediante la combinación de predicados más sencillos.
Estructura de consulta de ejemplo:
import javascript
from SqlExecution sql, Source source
where source.flowsTo(sql.getAnArgument())
select sql, "SQL query vulnerable to injection from $@.", source, "user input"
Esta consulta busca vulnerabilidades de inyección de SQL por:
- Identificación de puntos de ejecución de SQL.
- Búsqueda de orígenes de entrada de usuario.
- Seguimiento del flujo de datos de entrada a ejecución de SQL.
- Generación de informes de vulnerabilidades con contexto.
Bibliotecas de consultas estándar
GitHub proporciona amplias bibliotecas de consultas:
- Consultas de seguridad: Detecte las 10 vulnerabilidades principales de OWASP, las categorías de CWE y los problemas de seguridad específicos del lenguaje.
- Consultas de calidad del código: Busque los olores de código, los problemas de mantenimiento, los problemas de rendimiento y las infracciones de procedimientos recomendados.
- Contribuciones de la comunidad: Miles de consultas aportadas por investigadores y desarrolladores de seguridad.
- Actualizaciones periódicas: GitHub Security Lab agrega continuamente nuevas consultas para las vulnerabilidades emergentes.
Puede usar estas consultas as-is o personalizarlas para sus necesidades específicas.
CodeQL en la seguridad de GitHub
CodeQL se integra profundamente con las características de seguridad de GitHub:
Análisis de código con CodeQL
Análisis de seguridad automatizado:
- Configuración predeterminada: Habilite el examen de CodeQL con un clic en la configuración del repositorio.
- Exámenes programados: Escanee automáticamente en cada push, pull request, o según un horario.
- Compatibilidad con varios idiomas: Detecta automáticamente los idiomas en el repositorio y ejecuta las consultas adecuadas.
- Presentación de resultados: Los resultados de seguridad aparecen en la pestaña Seguridad con explicaciones detalladas.
Integración de solicitud de incorporación de cambios:
- Anotaciones insertadas: los resultados de seguridad aparecen como comentarios directamente en las líneas vulnerables de código en las solicitudes de incorporación de cambios.
- Comprobaciones de bloqueo: configure CodeQL como verificación obligatoria que debe pasar antes de combinarse.
- Escaneo diferencial: Solo notifica nuevas vulnerabilidades introducidas por la solicitud de incorporación de cambios, lo que reduce el ruido.
- Comentarios para desarrolladores: Los desarrolladores ven problemas de seguridad inmediatamente mientras el código está fresco en sus mentes.
GitHub Advanced Security
Para las organizaciones, GitHub Advanced Security proporciona funcionalidades adicionales:
- Examen de repositorio privado: Ejecute CodeQL en repositorios privados.
- Ejecución de consultas personalizadas: Cargue y ejecute consultas específicas de la organización.
- Introducción a la seguridad: Panel que muestra la posición de seguridad en todos los repositorios.
- Administración de alertas: Evaluar, asignar y realizar un seguimiento de los resultados de seguridad en todos los equipos.
Uso de CodeQL en canalizaciones de CI/CD
CodeQL se extiende más allá de GitHub para integrarse con varios sistemas de CI/CD:
Enfoques de integración
Integración de Acciones de GitHub:
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: javascript, python
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
Este flujo de trabajo:
- Inicializa CodeQL para los lenguajes especificados.
- Compila su aplicación (o analiza sin compilar).
- Ejecuta consultas de seguridad.
- Carga los resultados en la pestaña Seguridad de GitHub.
Integración de Azure Pipelines:
CodeQL se puede ejecutar en Azure Pipelines mediante la interfaz de la línea de comandos:
- Instale la CLI de CodeQL: Descargue e instale el paquete CodeQL en la canalización.
-
Crear base de datos: Ejecute
codeql database createdurante la compilación. -
Analizar base de datos: Ejecute
codeql database analyzecon paquetes de consulta seleccionados. - Exportar resultados: Genere archivos SARIF para su visualización en Azure DevOps.
Otros sistemas de CI/CD:
La CLI de CodeQL admite cualquier plataforma de CI/CD:
- Jenkins: Ejecute el análisis de CodeQL como pasos de compilación.
- CI/CD de GitLab: Ejecutar CodeQL en las pipelines de GitLab con salida en formato SARIF.
- CircleCI: Integrar los análisis de CodeQL en los flujos de trabajo de CircleCI.
- Sistemas personalizados: Use la CLI de CodeQL desde cualquier entorno que pueda ejecutar herramientas de línea de comandos.
Puertas de seguridad
Use los resultados de CodeQL como puertas de calidad:
- Errores en las compilaciones: Configure las canalizaciones para que fallen cuando CodeQL detecte vulnerabilidades de alta gravedad.
- Análisis de tendencias: Realice un seguimiento de las métricas de seguridad a lo largo del tiempo para medir la mejora.
- Requisitos de cumplimiento: Genere evidencias de examen de seguridad para auditorías y certificaciones de cumplimiento.
- Corrección automática: Desencadene flujos de trabajo automatizados cuando se detecten vulnerabilidades específicas.
Herramientas de desarrollo de CodeQL
CodeQL proporciona herramientas para crear y probar consultas:
Extensión de Visual Studio Code
La extensión oficial codeQL para VS Code ofrece:
- Desarrollo de consultas: escribir y probar consultas CodeQL con resaltado de sintaxis, autocompletar y documentación insertada.
- Análisis de base de datos local: Ejecute consultas en bases de datos creadas a partir de código base local.
- Visualización de resultados: Consulte los resultados de la consulta con rutas de navegación de código fuente y flujo de datos.
- Soporte para la depuración: Ejecute paso a paso la ejecución de consultas para comprender los resultados y optimizar el rendimiento.
Interfaz de línea de comandos
La CLI de CodeQL habilita el análisis scriptable:
-
Creación de la base de datos:
codeql database createextrae el código en formato consultable. -
Ejecución de consultas:
codeql database analyzeejecuta consultas y genera resultados. -
Consultas de prueba:
codeql test runvalida las consultas en casos de prueba. - Administración de módulos: Descargue y administre paquetes de consultas estándar.
Ventajas de CodeQL para la automatización de la seguridad
La integración de CodeQL en el proceso de DevSecOps proporciona ventajas significativas:
Productividad del desarrollador
Detección temprana:
- Seguridad de desplazamiento a la izquierda: busque vulnerabilidades durante el desarrollo en lugar de en producción.
- Corrección más rápida: Corrija los problemas cuando el código es nuevo y los cambios son pequeños.
- Oportunidades de aprendizaje: Los desarrolladores aprenden prácticas de codificación seguras a partir de comentarios inmediatos.
- Reducción del cambio de contexto: Los resultados de seguridad aparecen en herramientas de desarrollo conocidas.
Resultados precisos:
- Falsos positivos bajos: El análisis semántico genera resultados más precisos que la coincidencia de patrones.
- Información contextual: Los resultados incluyen rutas de flujo de datos que muestran exactamente cómo se producen las vulnerabilidades.
- Conclusiones prioritarias: Céntrese en problemas aprovechables en lugar de preocupaciones teóricas.
- Detección de variantes: Busque todas las instancias de un patrón de vulnerabilidad, no solo ejemplos obvios.
Seguridad de la organización
Cobertura completa:
- Código base completo: Analice todo el código, incluidas las dependencias de terceros y los componentes heredados.
- Varios idiomas: Análisis uniforme de seguridad en aplicaciones poliglot.
- Estándares coherentes: Aplique las mismas reglas de seguridad en todos los repositorios.
- Análisis histórico: Examine el código existente para establecer líneas base de seguridad.
Seguridad escalable:
- Escaneo automatizado: No se requieren revisiones de seguridad manuales para cada commit.
- Supervisión continua: Los exámenes regulares detectan vulnerabilidades recién divulgadas.
- Seguridad como código: Codifique los requisitos de seguridad como consultas almacenadas en el control de versiones.
- Uso compartido de conocimientos: Las bibliotecas de consultas capturan el conocimiento de seguridad institucional.
Cumplimiento y gobernanza
Seguimientos de auditoría:
- Historial de exámenes: Registro de todos los exámenes de seguridad con marcas de tiempo y resultados.
- Seguimiento del ciclo de vida: Realice un seguimiento de las vulnerabilidades desde la detección hasta la corrección.
- Cumplimiento de directivas: Demostrar que se producen exámenes de seguridad para cada versión.
- Generación de evidencias: Generar informes para auditores y marcos de cumplimiento.
Para obtener más información sobre CodeQL, vea Introducción a CodeQL.
Para obtener las herramientas disponibles, consulte CodeQL Tools.