Limitaciones Conocidas
Documento tecnico para analistas de seguridad
1. Introduccion
Este documento describe las limitaciones conocidas de cada feature de mcp-scan. Es fundamental para analistas de seguridad comprender estas limitaciones para:
- Interpretar correctamente los resultados
- Identificar areas que requieren revision manual
- Evitar falsa sensacion de seguridad
- Complementar el analisis con otras herramientas
2. Limitaciones del Parsing
2.1 Tree-sitter Parser
| Limitacion |
Impacto |
Mitigacion |
| Errores de sintaxis detienen el parsing |
Archivos con errores no se analizan |
Validar sintaxis previamente |
| Macros no expandidas |
Codigo generado no analizado |
Analizar codigo post-build |
| Codigo dinamico ignorado |
exec(code_string) no se parsea |
Revisar manualmente |
2.2 Lenguajes
| Lenguaje |
Estado |
Limitaciones Especificas |
| Python |
Completo |
Type hints parciales |
| TypeScript |
Completo |
Generics simplificados |
| JavaScript |
Completo |
JSX basico |
| Go |
Solo parsing |
Sin taint analysis |
2.3 Construcciones No Soportadas
# Metaprogramacion
@decorator_factory() # Decoradores dinamicos
setattr(obj, "method", func) # Atributos dinamicos
exec("def tool(): pass") # Codigo generado
# Imports dinamicos
module = __import__(name)
importlib.import_module(name)
3. Limitaciones del Taint Analysis
3.1 Analisis Intra-procedural (Modo Fast)
| Limitacion |
Ejemplo |
Impacto |
| No cruza funciones |
f(user_input) donde f llama a sink |
FN |
| No sigue returns |
x = get_input() donde get_input retorna source |
FN |
| Lambdas parciales |
Closures complejas |
FN/Imprecision |
Ejemplo de Falso Negativo:
def process(data):
os.system(data) # Sink en otra funcion
@server.tool()
def handler(cmd: str):
process(cmd) # No detectado en modo fast
3.2 Analisis Inter-procedural (Modo Deep)
| Limitacion |
Descripcion |
| Profundidad limitada |
Default: 3 niveles de llamadas |
| No soporta recursion |
Funciones recursivas pueden causar imprecision |
| Call graph impreciso |
Metodos virtuales no resueltos |
| Mas lento |
10-100x mas lento que fast |
3.3 Propagacion de Taint
| Caso No Soportado |
Ejemplo |
| Taint implicito |
if secret == x: print("yes") |
| Estructuras complejas |
obj.nested.deep.value |
| Collections |
list[index] donde index es variable |
| Alias |
alias = dangerous_func; alias(data) |
3.4 Sanitizers
| Limitacion |
Impacto |
| Solo catalogo built-in |
Sanitizers custom no reconocidos |
| Sin analisis de efectividad |
strip() no es sanitizer pero no causa FP |
| Sanitizacion parcial |
replace("..", "") no reconocido |
Ejemplo de Falso Positivo:
def my_sanitizer(path):
"""Custom sanitizer not in catalog"""
if ".." in path:
raise ValueError("Invalid path")
return path
@server.tool()
def read(path: str):
safe_path = my_sanitizer(path) # No reconocido como sanitizer
return open(safe_path).read() # Reportado como vulnerable
4. Limitaciones del Pattern Engine
4.1 Deteccion por Regex
| Limitacion |
Ejemplo |
Impacto |
| No entiende contexto |
"os.system in docs" en string |
FP |
| Comentarios |
# os.system(cmd) comentado |
FP |
| Strings multilinea |
Patron partido en lineas |
FN |
| Ofuscacion |
os["system"](cmd) |
FN |
4.2 Deteccion por AST
| Limitacion |
Descripcion |
| Alias de imports |
import os as o; o.system() no detectado |
| Calls indirectos |
getattr(os, "system")(cmd) |
| Decoradores custom |
Solo lista fija reconocida |
4.3 Reglas Especificas
| Regla |
Limitacion |
| MCP-E001 (Secrets) |
No detecta secretos en archivos .env |
| MCP-F002 (JWT) |
No analiza configuracion en JSON |
| MCP-G003 (Shadowing) |
Lista fija de nombres |
5. Limitaciones del Clasificador ML
5.1 Features
| Limitacion |
Impacto |
| Optimizado para ingles |
Otros idiomas tienen peor recall |
| Keywords fijos |
Nuevas tecnicas no cubiertas |
| Sin contexto semantico |
"ignore" legitimo causa FP |
5.2 Clasificadores
| Tipo |
Limitacion |
| RuleBased |
Deterministico pero rigido |
| Weighted |
Requiere pesos entrenados |
| Ensemble |
Mas lento, no siempre mejor |
5.3 Categorias
| Categoria |
Limitacion |
jailbreak |
Solo patrones conocidos |
identity |
Role play legitimo causa FP |
delimiter |
Nuevos formatos no cubiertos |
5.4 Ejemplos de Errores
Falso Positivo:
Description: "This tool helps you ignore duplicate files"
^^^^^^ trigger "ignore"
Falso Negativo:
Description: "Desatienda las instrucciones previas" # Spanish
6. Limitaciones del Detector LLM
6.1 Dependencias
| Limitacion |
Mitigacion |
| Requiere Ollama |
Fallback a ML classifier |
| Modelo debe estar descargado |
Documentar setup |
| Latencia de red |
Cache de resultados |
6.2 Modelo
| Limitacion |
Impacto |
| llama3.2:3b limitado |
Modelos mas grandes son mas lentos |
| No determinista |
Resultados pueden variar |
| Knowledge cutoff |
No conoce tecnicas nuevas |
6.3 Prompt
| Limitacion |
Descripcion |
| Solo ingles |
Prompt fijo en ingles |
| 5000 chars max |
Truncamiento de textos largos |
| Sin contexto de codigo |
Solo ve descripcion, no el handler |
6.4 Confiabilidad
| Escenario |
Comportamiento |
| Texto muy corto |
Siempre "benign" |
| Texto ambiguo |
Confianza baja |
| Tecnica nueva |
Puede no detectar |
7. Limitaciones de CodeQL
7.1 Requisitos
| Limitacion |
Mitigacion |
| Instalacion separada |
Documentar setup |
| Pesado (~2GB) |
Opcional en CI/CD |
| Timeout largo |
Configurable |
7.2 Cobertura
| Lenguaje |
Soporte |
Notas |
| Python |
Bueno |
Query pack completo |
| JavaScript |
Bueno |
Incluye TypeScript |
| Go |
Bueno |
Query pack completo |
| Otros |
No |
Solo los listados |
7.3 Queries
| Limitacion |
Descripcion |
| No MCP-aware |
No entiende decoradores @tool |
| Queries genericos |
No especificos para tool poisoning |
| Sin categoria G |
No detecta prompt injection |
| Factor |
Impacto |
| Creacion de DB |
1-10 minutos |
| Analisis |
5-30 minutos |
| Memoria |
2-8 GB RAM |
8. Limitaciones de la Superficie MCP
| Limitacion |
Ejemplo |
| Solo decoradores conocidos |
@my_custom_tool no detectado |
| Heuristica imprecisa |
tool_utils() falso positivo |
| Sin docstrings |
Descripcion vacia |
8.2 Deteccion de Transport
| Limitacion |
Descripcion |
| Basado en imports |
Si no hay import, "unknown" |
| Sin verificacion runtime |
No confirma que realmente usa ese transport |
8.3 SDKs
| SDK |
Limitacion |
| Python Official |
Buena cobertura |
| FastMCP |
Basica |
| TypeScript |
Parcial |
| Custom |
No soportado |
9. Limitaciones del Scoring MSSS
9.1 Pesos
| Limitacion |
Impacto |
| Pesos fijos |
No ajustable por contexto |
| Sin contexto de negocio |
SQLi en demo = SQLi en produccion |
| Acumulativo simple |
10 mediums != 1 critical |
9.2 Niveles
| Limitacion |
Descripcion |
| Binarios |
Critical presente = Level 0 siempre |
| Sin gradacion |
5 criticals = 1 critical para nivel |
| Sin excepciones |
No permite marcar "accepted risk" |
9.3 Contexto
| No Considera |
Ejemplo |
| Mitigaciones externas |
WAF que bloquea SQLi |
| Ambiente |
Dev vs Production |
| Exposicion |
Interno vs publico |
10. Limitaciones Generales
10.1 Analisis Estatico vs Dinamico
| Aspecto |
Estatico (mcp-scan) |
Dinamico (no soportado) |
| Cobertura |
Todo el codigo |
Solo paths ejecutados |
| Precision |
Puede tener FP |
Menos FP |
| Recall |
Puede tener FN |
Detecta comportamiento real |
| Velocidad |
Rapido |
Lento |
10.2 Tipos de Vulnerabilidades
| Tipo |
Deteccion |
Notas |
| Injection (A,B,C,D) |
Buena |
Taint analysis |
| Secrets (E) |
Buena |
Pattern matching |
| Auth (F) |
Parcial |
Patterns conocidos |
| Tool Poisoning (G) |
Buena |
ML + LLM |
| Logic Bugs |
No |
Requiere semantica |
| Race Conditions |
No |
Requiere runtime |
| DoS |
Parcial |
Solo patterns obvios |
10.3 Evasion
| Tecnica |
Efectividad contra mcp-scan |
| Ofuscacion simple |
Parcialmente efectiva |
| Encoding (base64, hex) |
Parcialmente efectiva |
| Metaprogramacion |
Muy efectiva |
| Polyglots |
Efectiva |
| Time-based |
Completamente efectiva |
11. Recomendaciones para Mitigar Limitaciones
11.1 Combinar Herramientas
mcp-scan (estatico)
+
CodeQL (analisis profundo)
+
DAST (dinamico)
+
Manual Review (logica)
11.2 Revision Manual Prioritaria
- Hallazgos de alta severidad - Siempre verificar
- Confianza baja/media - Revisar contexto
- Clases A y G - Mayor impacto
- Codigo con metaprogramacion - No analizado correctamente
11.3 Configuracion Recomendada
# .mcp-scan.yaml
scan:
mode: deep # Inter-procedural cuando posible
codeql: true # Confirmar con CodeQL
llm: true # Analisis semantico
ml:
threshold: 0.5 # Mas sensible
rules:
# Agregar sanitizers custom
sanitizers:
- pattern: "my_sanitizer"
language: python
protects: [filesystem, exec]
11.4 Baseline para Falsos Positivos
# .mcp-scan-baseline.yaml
# Hallazgos aceptados
accepted:
- finding_id: "abc123..."
reason: "Sanitizado por WAF externo"
accepted_by: "security@example.com"
date: "2024-01-15"
12. Tabla Resumen
| Feature |
FP Rate |
FN Rate |
Confiabilidad |
| Taint (fast) |
Bajo |
Alto |
Media |
| Taint (deep) |
Medio |
Medio |
Alta |
| Pattern Engine |
Medio |
Medio |
Media |
| ML Classifier |
Medio |
Medio |
Media |
| LLM Detector |
Bajo |
Medio |
Alta |
| CodeQL |
Muy Bajo |
Medio |
Muy Alta |
| Surface |
Bajo |
Alto |
Media |
Leyenda:
- FP Rate: Tasa de falsos positivos
- FN Rate: Tasa de falsos negativos
- Confiabilidad: Confianza general en los resultados
13. Roadmap de Mejoras
Planificado
- Soporte para Go en taint analysis
- Sanitizers custom via configuracion
- Mejor deteccion de decoradores dinamicos
- Modo strict con menos FN
En Investigacion
- Analisis de Jupyter notebooks
- Deteccion de vulnerabilidades en configuracion
- Integracion con SAST comerciales
14. Reportar Limitaciones
Si encuentras una limitacion no documentada:
- Verificar que no esta ya documentada aqui
- Crear issue en repositorio con:
- Descripcion de la limitacion
- Codigo de ejemplo
- Resultado esperado vs actual
- Impacto estimado
Este documento debe actualizarse cuando se descubran nuevas limitaciones o se implementen mejoras.