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¶
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¶
- Crear reglas de JavaScript para clases D, E, F
- Implementar reglas de Python para clases F, H, I, K, L, M
- Añadir más sanitizers a las reglas existentes
Prioridad Media¶
- Crear tests unitarios para cada regla
- Añadir benchmarks de performance
- Documentar falsos positivos conocidos
Prioridad Baja¶
- Crear QL libraries compartidas para patrones comunes
- Implementar queries de calidad de código (no solo seguridad)
- Integrar con GitHub Code Scanning
Referencias¶
- CodeQL Documentation
- CodeQL for Go
- CodeQL for Python
- CodeQL for JavaScript
- SARIF Specification
- MCP-Scan Vulnerability Classes
Última actualización: 2026-01-26 Autor: Dani (cr0hn@cr0hn.com)