Skip to content

CodeQL Rules Analysis - MCP-Scan

Este documento describe el análisis exhaustivo de las reglas CodeQL del proyecto y las nuevas reglas creadas para cubrir los gaps identificados.

Resumen Ejecutivo

Estado Anterior (7 reglas)

  • Go: 4 reglas (Clases A, B, C, D)
  • Python: 3 reglas (Clases A, B, G)
  • JavaScript/TypeScript: 0 reglas

Estado Actual (22 reglas)

  • Go: 11 reglas (Clases A, B, C, D, E, F, G, H, I, K, L, M)
  • Python: 6 reglas (Clases A, B, C, D, E, G)
  • JavaScript/TypeScript: 5 reglas (Clases A, B, C, G)

Matriz de Cobertura por Clase de Vulnerabilidad

Clase Nombre Go Python JS/TS Pattern (Go)
A RCE / Command Injection
B Filesystem / Path Traversal
C SSRF / Network
D SQL Injection ⚠️
E Secrets Exposure ⚠️
F Authentication (JWT) ⚠️ ⚠️
G Tool Poisoning
H Prompt Injection Flow ⚠️ ⚠️
I Privilege Escalation ⚠️ ⚠️
J Cross-Tool Data Leakage ⚠️ ⚠️ ⚠️
K Authentication Bypass ⚠️ ⚠️
L Plugin Lifecycle ⚠️ ⚠️
M Hidden Network ⚠️ ⚠️
N Supply Chain ⚠️ ⚠️ ⚠️

Leyenda: - ✅ Regla CodeQL implementada - ⚠️ Cubierto por pattern matching en Go (no CodeQL) - ❌ No cubierto


Reglas Existentes (Anteriores)

Go (resources/codeql/queries/)

Archivo Clase ID Descripción
mcp-command-injection.ql A go/mcp-command-injection RCE desde MCP tool input a exec.Command
mcp-path-traversal.ql B go/mcp-path-traversal Path traversal a operaciones de archivo
mcp-ssrf.ql C go/mcp-ssrf SSRF desde tool input a HTTP requests
mcp-sql-injection.ql D go/mcp-sql-injection SQLi desde tool input a queries

Python (codeql-queries/mcp/)

Archivo Clase ID Descripción
UnsafeExec.ql A mcp/unsafe-exec RCE desde decoradores @tool
PathTraversal.ql B mcp/path-traversal Path traversal en file tools
PromptInjection.ql G mcp/prompt-injection Pattern matching de injection

Nuevas Reglas Creadas

Go (resources/codeql/queries/)

Archivo Clase ID Descripción
mcp-secrets-exposure.ql E go/mcp-secrets-exposure Detecta hardcoded secrets (AWS, GitHub, OpenAI, etc.)
mcp-jwt-vulnerabilities.ql F go/mcp-jwt-vulnerabilities JWT sin verificación, algoritmo "none", verificación deshabilitada
mcp-prompt-injection-flow.ql H go/mcp-prompt-injection-flow Taint flow de MCP input a LLM APIs (OpenAI, Anthropic)
mcp-plugin-lifecycle.ql L go/mcp-plugin-lifecycle Dynamic plugin loading, go plugin.Open() inseguro
mcp-hidden-network.ql M go/mcp-hidden-network DNS exfiltration, timing channels, conexiones ocultas
mcp-auth-bypass.ql K go/mcp-auth-bypass Bypass de autenticación, user input en auth decisions
mcp-privilege-escalation.ql I go/mcp-privilege-escalation Self-permission modification, dynamic tool spawning
mcp-tool-poisoning.ql G go/mcp-tool-poisoning Prompt injection patterns, Unicode manipulation, shadowing

Python (codeql-queries/mcp/)

Archivo Clase ID Descripción
SSRFDetection.ql C mcp/python-ssrf SSRF con requests, urllib, httpx, aiohttp
SQLInjection.ql D mcp/python-sql-injection SQLi con sqlite3, psycopg2, SQLAlchemy, Django ORM
SecretsExposure.ql E mcp/python-secrets-exposure Hardcoded secrets, logging de secretos, f-string interpolation

JavaScript/TypeScript (codeql-queries/mcp-js/)

Archivo Clase ID Descripción
CommandInjection.ql A mcp/js-command-injection RCE con child_process, eval, vm
PathTraversal.ql B mcp/js-path-traversal Path traversal con fs, path.join
SSRF.ql C mcp/js-ssrf SSRF con fetch, axios, got, http.request
PromptInjection.ql G mcp/js-prompt-injection Prompt injection patterns, tool shadowing

Ventajas de CodeQL sobre Pattern Matching

1. Taint Analysis Real

Pattern Matching (Go actual):
  - Busca regex en código fuente
  - No entiende flujo de datos
  - Muchos falsos positivos/negativos

CodeQL:
  - Tracking inter-procedural
  - Entiende asignaciones, llamadas, returns
  - Precisión mucho mayor

2. Type-Aware Analysis

Pattern Matching:
  - Busca por nombre de función
  - No diferencia `foo.exec()` de `bar.exec()`

CodeQL:
  - Entiende tipos y packages
  - `call.getTarget().hasQualifiedName("os/exec", "Command")`
  - Distingue entre diferentes librerías

3. Data Flow Summaries

Pattern Matching:
  - Solo ve código visible
  - No puede seguir a través de funciones

CodeQL:
  - Summaries de librerías estándar
  - Sigue flujo a través de wrappers
  - Análisis inter-procedural

Cómo Ejecutar las Reglas

Prerequisitos

# Instalar CodeQL CLI
brew install codeql  # macOS
# o descargar desde https://github.com/github/codeql-cli-binaries

# Verificar instalación
codeql version

Crear Base de Datos

# Para proyecto Go
codeql database create ./codeql-db-go --language=go --source-root=.

# Para proyecto Python
codeql database create ./codeql-db-python --language=python --source-root=.

# Para proyecto JavaScript/TypeScript
codeql database create ./codeql-db-js --language=javascript --source-root=.

Ejecutar Análisis

# Go queries
codeql database analyze ./codeql-db-go \
  resources/codeql/queries/ \
  --format=sarif-latest \
  --output=results-go.sarif

# Python queries
codeql database analyze ./codeql-db-python \
  codeql-queries/mcp/ \
  --format=sarif-latest \
  --output=results-python.sarif

# JavaScript queries
codeql database analyze ./codeql-db-js \
  codeql-queries/mcp-js/ \
  --format=sarif-latest \
  --output=results-js.sarif

Usando el Script Integrado

./scripts/run-codeql.sh /path/to/mcp-server

Integración con mcp-scan

El proyecto ya tiene integración nativa con CodeQL:

// internal/codeql/client.go
client := codeql.NewClient()
if client.IsAvailable() {
    results, err := client.ScanDirectory(ctx, path, codeql.ScanOptions{
        Languages: []string{"go", "python", "javascript"},
        Timeout:   30 * time.Minute,
    })
}

El detector de CodeQL (internal/pattern/codeql_detector.go) fusiona los resultados con el análisis de pattern matching para aumentar la confianza.


Modelos de Datos (Extension Models)

Sources (resources/codeql/models/mcp-sources.yml)

Define fuentes de datos no confiables: - MCP SDKs: mark3labs/mcp-go, strowk/mcp-golang - Transportes: HTTP, WebSocket, stdin - JSON unmarshaling

Sinks (resources/codeql/models/mcp-sinks.yml)

Define sinks peligrosos: - Command Injection: os/exec, syscall - Path Traversal: os, io/ioutil, filepath - SQL Injection: database/sql, gorm, sqlx - SSRF: net/http, net - Code Injection: reflect, text/template - Log Injection: log, logrus, zap - Deserialization: gob, xml, yaml


Próximos Pasos

Prioridad Alta

  1. Crear reglas de JavaScript para clases D, E, F
  2. Implementar reglas de Python para clases F, H, I, K, L, M
  3. Añadir más sanitizers a las reglas existentes

Prioridad Media

  1. Crear tests unitarios para cada regla
  2. Añadir benchmarks de performance
  3. Documentar falsos positivos conocidos

Prioridad Baja

  1. Crear QL libraries compartidas para patrones comunes
  2. Implementar queries de calidad de código (no solo seguridad)
  3. Integrar con GitHub Code Scanning

Referencias


Última actualización: 2026-01-26 Autor: Dani (cr0hn@cr0hn.com)