
un escáner de seguridad para aplicaciones LLM personalizadas
_________ O O o.-.
¡Humanos, no os resistáis! |/ ,-'-.() / /_, / /_|.-.|
_____ / --O-- (.--""" /\ _/\ |
( o.o ) / De Utku Sen /|\ -'--' / /|
| - | / _ __ _ _ ___ _ __ _ | | _ __ __ _ _ | \
/| | | ' \ '/ _ \ ' | ' \ | ' / ` | ' \ ) |
/ | | | ./| ___/||| ./_|||_,| .// /
/ |-----| || || |_| |___|
promptmap2 es un escáner automatizado de inyección de instrucciones para aplicaciones LLM personalizadas. Soporta dos modos de prueba:
- **Prueba de caja blanca:** Proporcione sus instrucciones del sistema y la información del modelo. promptmap2 ejecuta el propio LLM objetivo y lo prueba.
- **Prueba de caja negra:** Apunte promptmap2 a un endpoint HTTP externo. Envía instrucciones de ataque por HTTP e inspecciona las salidas devueltas.
Opera utilizando una arquitectura de dos LLM:
- **LLM objetivo:** La aplicación LLM que se está probando en busca de vulnerabilidades
- **LLM controlador:** Un LLM independiente que analiza las respuestas del objetivo para determinar si los ataques han tenido éxito
La herramienta envía instrucciones de ataque a su LLM objetivo y utiliza el LLM controlador para evaluar si el ataque fue exitoso en función de condiciones predefinidas.
Incluye reglas de prueba exhaustivas en múltiples categorías, incluyendo robo de instrucciones, jailbreak, generación de contenido dañino, pruebas de sesgo y más.
> [!IMPORTANTE]
> promptmap fue lanzado inicialmente en 2023 pero reescrito por completo en 2025.
📖 ¿Quiere asegurar sus aplicaciones LLM? [Puede comprar mi libro electrónico](https://utkusen.gumroad.com/l/securing-gpt-attack-defend-chatgpt-applications)
## Características
- **Soporte para múltiples proveedores de LLM**:
- Modelos OpenAI GPT
- Modelos Anthropic Claude
- Modelos Google Gemini
- Modelos XAI Grok
- Modelos de código abierto mediante Ollama (Deepseek, Llama, Mistral, Qwen, etc.)
- **Reglas de prueba exhaustivas**: Más de 50 reglas predefinidas en 6 categorías
- **Evaluación flexible**: Criterios de aprobado/rechazo basados en condiciones para cada prueba
- **Reglas personalizables**: Reglas basadas en YAML con condiciones de aprobado/rechazo
- **Objetivos HTTP externos**: Apunte escaneos de caja negra a cualquier endpoint mediante configuraciones YAML ligeras

## Instalación
1. Clone el repositorio:
```bash
git clone https://github.com/utkusen/promptmap.git
cd promptmap
pip install -r requirements.txt
Establezca la clave de API adecuada para el proveedor elegido.
export OPENAI_API_KEY="su-clave-openai"
Otros proveedores compatibles utilizan ANTHROPIC_API_KEY, GOOGLE_API_KEY y XAI_API_KEY.
Si desea utilizar modelos locales, necesita instalar Ollama.
Vaya a la página de descarga de Ollama y siga las instrucciones de instalación.
Debe proporcionar su archivo de instrucciones del sistema. El archivo predeterminado es system-prompts.txt. Puede especificar su propio archivo con la bandera --prompts. Se proporciona un archivo de ejemplo en el repositorio.
python3 promptmap2.py --target-model gpt-3.5-turbo --target-model-type openai
Los proveedores Anthropic, Google y XAI siguen el mismo patrón: elija el nombre de modelo correcto y establezca --target-model-type como anthropic, google o xai.
python3 promptmap2.py --target-model "llama2:7b" --target-model-type ollama
# Si el modelo no está instalado, promptmap le pedirá que lo descargue. Si desea descargarlo automáticamente, puede usar la bandera `-y`.
# Por defecto, promptmap2 se conecta a Ollama en http://localhost:11434
# Puede especificar una URL personalizada si su servidor Ollama se ejecuta en otro lugar
python3 promptmap2.py --target-model "llama2:7b" --target-model-type ollama --ollama-url http://192.168.1.100:11434
Por defecto, se utiliza el mismo modelo como objetivo y controlador.
[!IMPORTANTE]
Para el modelo controlador, se recomienda encarecidamente utilizar uno de estos modelos potentes para una evaluación precisa:
- OpenAI GPT-5
- Google Gemini 2.5 Pro
- Anthropic Claude 4 Sonnet
- gpt-oss:20b (mediante Ollama)
Los modelos más débiles pueden no analizar los resultados con precisión y podrían provocar falsos positivos o negativos.
# Utilizar GPT-4o como controlador para probar un objetivo GPT-3.5
python3 promptmap2.py --target-model gpt-3.5-turbo --target-model-type openai \
--controller-model gpt-4o --controller-model-type openai
# Utilizar Claude 4 Opus como controlador para probar un modelo local Llama
python3 promptmap2.py --target-model llama2:7b --target-model-type ollama \
--controller-model claude-4-opus-20240229 --controller-model-type anthropic
Si no controla la instrucción del sistema del LLM objetivo, aún puede atacarlo proporcionando un esquema de solicitud HTTP. Establezca --target-model-type http y suministre --http-config apuntando a un archivo YAML que describa cómo enviar cada carga útil. Campos clave:
url: Destino de la solicitud. Por ejemplo: https://assistant.example.com/chatmethod: Verbo HTTP, por defecto POST.headers: Puede añadir cualquier cabecera que desee. Por ejemplo: Content-Type: application/json, Authorization: Bearer <token>payload_placeholder: La instrucción de ataque se insertará aquí (se admiten múltiples posiciones): "{PAYLOAD_POSITION}"payload_encoding: Puede ser none, url o form para controlar cómo se codifican las cargas útiles antes de la inserción.json o body: Defina la carga útil de la solicitud.verify_ssl: Establézcalo en true para habilitar la verificación TLS (deshabilitado por defecto por conveniencia al interceptar tráfico).proxy: Configuración de proxy opcional (scheme, host, port y credenciales opcionales) utilizada tanto para tráfico HTTP como HTTPS.answer_focus_hint: Fragmento de cadena opcional que señala dónde se encuentra la respuesta del asistente dentro de respuestas HTTP ruidosas.Ejemplo de solicitud JSON (consulte http-examples/http-config-example.yaml):
name: Example External Chat Endpoint
method: POST
url: https://chat.example.com/v1/messages
headers:
Content-Type: application/json
json:
messages:
- role: user
content: "{PAYLOAD_POSITION}"
answer_focus_hint: '"content": "{ANSWER_POSITION}"'
proxy:
scheme: https
host: 127.0.0.1
port: 8080
Ejemplo de solicitud POST clásica con codificación de carga útil (http-examples/http-config-form.yaml):
name: Form Endpoint
method: POST
url: https://legacy.example.com/api/submit
headers:
Content-Type: application/x-www-form-urlencoded
payload_encoding: form
body: "username=qa_tester&payload={PAYLOAD_POSITION}&mode=probe"
answer_focus_hint: '"message={ANSWER_POSITION}"'
promptmap2 reemplaza cada entrada {PAYLOAD_POSITION} con la instrucción de ataque actual, realiza la solicitud HTTP y alimenta el cuerpo de la respuesta de vuelta al LLM controlador para su evaluación. Cuando se proporciona answer_focus_hint, se indica al LLM evaluador que se centre en ese fragmento de la respuesta.