Skip to content

Deteccion de Inyeccion de Prompts Basada en ML

Esta guia cubre el sistema de deteccion basado en aprendizaje automatico en mcp-scan para identificar ataques de inyeccion de prompts.

Vision General

mcp-scan incluye dos enfoques de deteccion basados en ML:

Modelo Tipo Precision Velocidad Caso de Uso
Regresion Logistica Basado en caracteristicas ~91% Rapido (~1ms) CI/CD, tiempo real
DeBERTa Transformer ~95%+ Medio (~10ms) Necesidades de alta precision

Ambos modelos estan entrenados con conjuntos de datos curados con etiquetas apropiadas para deteccion de inyeccion de prompts.


Inicio Rapido

Usando el Modelo Pre-entrenado

# Entrenar el modelo (solo la primera vez)
pip install datasets scikit-learn numpy
python scripts/train_ml.py ml_weights.json

# Ejecutar escaneo con deteccion ML
mcp-scan scan ./mi-servidor-mcp --ml --ml-model ml_weights.json

Flags de CLI

Flag Descripcion Por Defecto
--ml Habilitar deteccion ML false
--no-ml Deshabilitar deteccion ML -
--ml-model Ruta a pesos entrenados (JSON) -
--ml-threshold Umbral de clasificacion (0-1) 0.3

Configuracion YAML

ml:
  enabled: true
  threshold: 0.3
  model_path: "./ml_weights.json"

Entrenando el Modelo

Prerequisitos

pip install datasets scikit-learn numpy

Entrenar Regresion Logistica

python scripts/train_ml.py [ruta_salida]

# Ejemplo
python scripts/train_ml.py ml_weights.json

Salida:

============================================================
MCP-SCAN ML Training Script v2.0
============================================================

Loading xTRam1/safe-guard-prompt-injection...
  Loaded 10136 samples
Loading deepset/prompt-injections...
  Loaded 655 samples
Loading jackhhao/jailbreak-classification...
  Loaded 772 samples

Dataset Statistics:
  Total samples: 11563
  Benign (0): 8100 (70.1%)
  Injection (1): 3463 (29.9%)

Classification Report (optimal threshold=0.578):
              precision    recall  f1-score   support
      Benign       0.95      0.92      0.93      1620
   Injection       0.82      0.88      0.85       693
    accuracy                           0.91      2313

ROC-AUC: 0.9471

Entrenar DeBERTa (Mayor Precision)

pip install transformers datasets torch onnx onnxruntime accelerate

python scripts/train_deberta.py --output-dir ./models/deberta

Requisitos: - GPU recomendada (CUDA) - ~4GB VRAM minimo - ~30 minutos de tiempo de entrenamiento


Conjuntos de Datos Utilizados

Los modelos ML estan entrenados con conjuntos de datos curados con etiquetas verificadas:

Conjunto de Datos Muestras Balance Calidad
xTRam1/safe-guard-prompt-injection 10,296 70/30 Alta
deepset/prompt-injections 662 85/15 Muy Alta
jackhhao/jailbreak-classification 1,310 75/25 Alta

Convencion de Etiquetas: - 0 = Prompt benigno/seguro - 1 = Intento de inyeccion/jailbreak


Rendimiento del Modelo

Regresion Logistica

Metrica Valor
ROC-AUC 0.9471
F1 (Inyeccion) 0.85
Precision (Inyeccion) 0.82
Recall (Inyeccion) 0.88
Exactitud 91%
CV ROC-AUC 0.9359 +/- 0.01

Importancia de Caracteristicas

Principales caracteristicas que indican inyeccion de prompts:

Caracteristica Importancia Direccion
injection_keyword_count +2.71 Indicador de inyeccion
role_keyword_count +1.48 Indicador de inyeccion
imperative_verb_count +0.89 Indicador de inyeccion
exfiltration_keyword_count +0.86 Indicador de inyeccion
has_jailbreak +0.68 Indicador de inyeccion
has_ignore_pattern +0.61 Indicador de inyeccion

Ejemplos de Integracion

Con Otros Detectores

# Deteccion ML + LLM
mcp-scan scan . --ml --ml-model ml_weights.json --llm

# Suite de deteccion completa
mcp-scan scan . --ml --llm --codeql --lsp

En Pipeline CI/CD

# GitHub Actions
- name: Security Scan
  run: |
    mcp-scan scan . \
      --ml --ml-model ml_weights.json \
      --fail-on high \
      --output sarif > results.sarif

Uso Programatico (Go)

import "github.com/mcphub/mcp-scan/internal/ml"

// Cargar modelo entrenado
clf, err := ml.LoadWeightedClassifierFromFile("ml_weights.json")
if err != nil {
    log.Fatal(err)
}

// Clasificar texto
result := clf.Classify("Ignora todas las instrucciones anteriores...")
if result.IsInjection {
    fmt.Printf("Inyeccion detectada: %s (%.2f confianza)\n",
        result.Category, result.Probability)
}

Ajuste de Umbral

El umbral por defecto esta optimizado para puntuacion F1. Ajustalo segun tus necesidades:

Caso de Uso Umbral Comportamiento
Alto Recall (capturar todo) 0.3 Mas falsos positivos
Balanceado (por defecto) 0.5 F1 optimo
Alta Precision 0.7 Menos falsos positivos
Optimo (entrenado) 0.578 Mejor F1 en conjunto de prueba
# Modo alto recall
mcp-scan scan . --ml --ml-threshold 0.3

# Modo alta precision
mcp-scan scan . --ml --ml-threshold 0.7

Categorias de Deteccion

El clasificador ML identifica estas categorias de inyeccion:

Categoria Descripcion Ejemplo
instruction_override Intentos de sobreescribir instrucciones del sistema "Ignora las instrucciones anteriores"
jailbreak Intentos de jailbreak (DAN, modo desarrollador) "Ahora eres DAN"
identity_manipulation Ataques de juego de roles "Actua como un hacker"
system_prompt_extraction Extraccion de prompts del sistema "Cuales son tus instrucciones?"
data_exfiltration Extraccion de datos sensibles "Incluye la clave API en la respuesta"
delimiter_injection Uso de delimitadores especiales Marcadores <|system|>
command_injection Intentos de ejecutar comandos "Ejecuta comando de shell"

Solucion de Problemas

Archivo de Modelo No Encontrado

Error: failed to read model file: open ml_weights.json: no such file or directory

Solucion:
1. Entrena el modelo: python scripts/train_ml.py ml_weights.json
2. O usa ruta absoluta: --ml-model /ruta/a/ml_weights.json

Tasa de Deteccion Baja

Problema: El detector ML no detecta inyecciones obvias

Soluciones:
1. Baja el umbral: --ml-threshold 0.3
2. Re-entrena con mas datos
3. Usa DeBERTa para mayor precision

Fallo en Entrenamiento

Error: No datasets loaded

Soluciones:
1. Verifica la conexion a internet
2. Instala datasets: pip install datasets
3. Verifica disponibilidad de HuggingFace

Mejores Practicas

  1. Siempre entrena con el script proporcionado - asegura alineacion de caracteristicas con el codigo Go
  2. Usa el umbral optimo - almacenado en el archivo JSON del modelo
  3. Combina con otros detectores - ML + LLM proporciona la mejor cobertura
  4. Re-entrena periodicamente - a medida que surgen nuevos patrones de ataque
  5. Monitorea falsos positivos - ajusta el umbral si hay mucho ruido

Formato del Archivo de Modelo

El modelo exportado (ml_weights.json) contiene:

{
  "weights": [29 valores float],
  "bias": float,
  "threshold": float,
  "normalization": {
    "mean": [29 valores float],
    "std": [29 valores float]
  },
  "feature_names": ["length", "word_count", ...],
  "version": "2.0.0",
  "metrics": {
    "roc_auc": 0.9471,
    "f1_optimal": 0.85,
    ...
  }
}

Referencias