
um scanner de segurança para aplicações LLM personalizadas
_________ __O __O o_.-._
Humans, Do Not Resist! \|/ ,-'-.____() / /\_, / /\_|_.-._|
_____ / --O-- (____.--""" ___/\ ___/\ |
( o.o ) / Utku Sen's /|\ -'--'_ /_ /__|_
| - | / _ __ _ _ ___ _ __ _ __| |_ _ __ __ _ _ __|___ \
/| | | '_ \ '_/ _ \ ' \| '_ \ _| ' \/ _` | '_ \ __) |
/ | | | .__/_| \___/_|_|_| .__/\__|_|_|_\__,_| .__// __/
/ |-----| |_| |_| |_| |_____|
promptmap2 é um scanner automatizado de injeção de prompt para aplicações LLM personalizadas. Suporta dois modos de teste:
Teste de caixa branca: Forneça seus prompts de sistema e as informações do modelo. O promptmap2 executa o próprio LLM alvo e o testa.
Teste de caixa preta: Aponte o promptmap2 para um endpoint HTTP externo. Ele envia prompts de ataque via HTTP e inspeciona as respostas retornadas.
Opera com uma arquitetura de LLM duplo:
A ferramenta envia prompts de ataque para o LLM alvo e usa o LLM controlador para avaliar se o ataque foi bem-sucedido com base em condições predefinidas.
Inclui regras de teste abrangentes em várias categorias, incluindo roubo de prompt, jailbreak, geração de conteúdo prejudicial, teste de viés e muito mais.
[!IMPORTANT]
O promptmap foi inicialmente lançado em 2023, mas completamente reescrito em 2025.
📖 Quer proteger suas aplicações LLM? Você pode comprar meu e-book

git clone https://github.com/utkusen/promptmap.git
cd promptmap
pip install -r requirements.txt
Defina a chave de API apropriada para o provedor escolhido.
export OPENAI_API_KEY="sua-chave-openai"
Outros provedores suportados usam ANTHROPIC_API_KEY, GOOGLE_API_KEY e XAI_API_KEY.
Se você quiser usar modelos locais, precisa instalar o Ollama.
Acesse a Página de Download do Ollama e siga as instruções de instalação.
Você precisa fornecer seu arquivo de prompts de sistema. O arquivo padrão é system-prompts.txt. Você pode especificar seu próprio arquivo com a flag --prompts. Um arquivo de exemplo é fornecido no repositório.
python3 promptmap2.py --target-model gpt-3.5-turbo --target-model-type openai
Os provedores Anthropic, Google e XAI seguem o mesmo padrão: escolha o nome correto do modelo e defina --target-model-type como anthropic, google ou xai.
python3 promptmap2.py --target-model "llama2:7b" --target-model-type ollama
# Se o modelo não estiver instalado, o promptmap pedirá para você baixá-lo. Se quiser baixá-lo automaticamente, use a flag `-y`.
# Por padrão, o promptmap2 se conecta ao Ollama em http://localhost:11434
# Você pode especificar uma URL personalizada se seu servidor Ollama estiver rodando em outro lugar
python3 promptmap2.py --target-model "llama2:7b" --target-model-type ollama --ollama-url http://192.168.1.100:11434
Por padrão, o mesmo modelo é usado como alvo e controlador.
[!IMPORTANTE]
Para o modelo controlador, é altamente recomendado usar um destes modelos poderosos para avaliação precisa:
- OpenAI GPT-5
- Google Gemini 2.5 Pro
- Anthropic Claude 4 Sonnet
- gpt-oss:20b (via Ollama)
Modelos mais fracos podem não analisar resultados com precisão e podem levar a falsos positivos ou negativos.
# Use GPT-4o como controlador para testar um alvo GPT-3.5
python3 promptmap2.py --target-model gpt-3.5-turbo --target-model-type openai \
--controller-model gpt-4o --controller-model-type openai
# Use Claude 4 Opus como controlador para testar um modelo local Llama
python3 promptmap2.py --target-model llama2:7b --target-model-type ollama \
--controller-model claude-4-opus-20240229 --controller-model-type anthropic
Se você não controla o prompt de sistema do LLM alvo, ainda pode atacá-lo fornecendo um esquema de solicitação HTTP. Defina --target-model-type http e forneça --http-config apontando para um arquivo YAML que descreve como enviar cada payload. Campos principais:
url: Destino da solicitação. Por exemplo: https://assistant.example.com/chatmethod: Verbo HTTP, padrão é POST.headers: Você pode adicionar quaisquer cabeçalhos desejados. Por exemplo: Content-Type: application/json, Authorization: Bearer <token>payload_placeholder: O prompt de ataque será inserido aqui (várias posições são suportadas): "{PAYLOAD_POSITION}"payload_encoding: Pode ser none, url ou form para controlar como os payloads são codificados antes da inserção.json ou body: Defina o payload da solicitação.verify_ssl: Defina como true para habilitar verificação TLS (padrão desabilitado por conveniência ao interceptar tráfego).proxy: Configuração opcional de proxy (scheme, host, port e credenciais opcionais) usada tanto para tráfego HTTP quanto HTTPS.answer_focus_hint: Snippet de string opcional que localiza onde a resposta do assistente está dentro de respostas HTTP ruidosas.Exemplo de solicitação JSON (veja 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
Exemplo de solicitação POST clássica com codificação de payload (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}"'
O promptmap2 substitui cada entrada {PAYLOAD_POSITION} pelo prompt de ataque atual, emite a solicitação HTTP e alimenta o corpo da resposta de volta ao LLM controlador para avaliação. Quando answer_focus_hint é fornecido, o LLM avaliador é instruído a focar nessa parte da resposta.
python3 promptmap2.py --target-model external --target-model-type http \
--http-config http-examples/http-config-example.yaml \
--controller-model gpt-4 --controller-model-type openai
python3 promptmap2.py --target-model gpt-4 --target-model-type openai --output results.json