
uno scanner di sicurezza per applicazioni LLM personalizzate
_________ __O __O o_.-._
Humans, Do Not Resist! \|/ ,-'-.____() / /\_, / /\_|_.-._|
_____ / --O-- (____.--""" ___/\ ___/\ |
( o.o ) / Utku Sen's /|\ -'--'_ /_ /__|_
| - | / _ __ _ _ ___ _ __ _ __| |_ _ __ __ _ _ __|___ \
/| | | '_ \ '_/ _ \ ' \| '_ \ _| ' \/ _` | '_ \ __) |
/ | | | .__/_| \___/_|_|_| .__/\__|_|_|_\__,_| .__// __/
/ |-----| |_| |_| |_| |_____|
promptmap2 è uno scanner automatizzato di prompt injection per applicazioni LLM personalizzate. Supporta due modalità di test:
Test white-box: Fornisci i tuoi prompt di sistema e le informazioni sul modello. promptmap2 esegue l'LLM target stesso e lo testa.
Test black-box: Indirizza promptmap2 a un endpoint HTTP esterno. Invia prompt di attacco via HTTP e ispeziona gli output restituiti.
Funziona utilizzando un'architettura a due LLM:
Lo strumento invia prompt di attacco al tuo LLM target e utilizza l'LLM di controllo per valutare se l'attacco ha avuto successo in base a condizioni predefinite.
Include regole di test complete in diverse categorie, tra cui furto di prompt, jailbreaking, generazione di contenuti dannosi, test sui bias e altro.
[!IMPORTANT]
promptmap è stato inizialmente rilasciato nel 2023 ma riscritto completamente nel 2025.
📖 Vuoi proteggere le tue app LLM? Puoi acquistare il mio e-book

git clone https://github.com/utkusen/promptmap.git
cd promptmap
pip install -r requirements.txt
Imposta la chiave API appropriata per il provider scelto.
export OPENAI_API_KEY="your-openai-key"
Gli altri provider supportati utilizzano ANTHROPIC_API_KEY, GOOGLE_API_KEY e XAI_API_KEY.
Se vuoi utilizzare modelli locali, devi installare Ollama.
Vai alla pagina di download di Ollama e segui le istruzioni di installazione.
Devi fornire il file dei prompt di sistema. Il file predefinito è system-prompts.txt. Puoi specificare un file personalizzato con l'opzione --prompts. Nel repository è fornito un file di esempio.
python3 promptmap2.py --target-model gpt-3.5-turbo --target-model-type openai
I provider Anthropic, Google e XAI seguono lo stesso schema: scegli il nome del modello corretto e imposta --target-model-type su anthropic, google o xai.
python3 promptmap2.py --target-model "llama2:7b" --target-model-type ollama
# Se il modello non è installato, promptmap chiederà di scaricarlo. Se vuoi scaricarlo automaticamente, puoi usare l'opzione `-y`.
# Di default, promptmap2 si connette a Ollama su http://localhost:11434
# Puoi specificare un URL personalizzato se il tuo server Ollama è in esecuzione altrove
python3 promptmap2.py --target-model "llama2:7b" --target-model-type ollama --ollama-url http://192.168.1.100:11434
Di default, lo stesso modello viene utilizzato sia come target che come controllore.
[!IMPORTANT]
Per il modello di controllo, è fortemente consigliato utilizzare uno di questi modelli potenti per una valutazione accurata:
- OpenAI GPT-5
- Google Gemini 2.5 Pro
- Anthropic Claude 4 Sonnet
- gpt-oss:20b (tramite Ollama)
Modelli più deboli potrebbero non analizzare i risultati con precisione e portare a falsi positivi o negativi.
# Usa GPT-4o come controllore per testare un target GPT-3.5
python3 promptmap2.py --target-model gpt-3.5-turbo --target-model-type openai \
--controller-model gpt-4o --controller-model-type openai
# Usa Claude 4 Opus come controllore per testare un modello Llama locale
python3 promptmap2.py --target-model llama2:7b --target-model-type ollama \
--controller-model claude-4-opus-20240229 --controller-model-type anthropic
Se non controlli il prompt di sistema dell'LLM target, puoi comunque attaccarlo fornendo uno schema di richiesta HTTP. Imposta --target-model-type http e fornisci --http-config puntando a un file YAML che descrive come inviare ogni payload. Campi chiave:
url: Destinazione della richiesta. Ad esempio: https://assistant.example.com/chatmethod: Verbo HTTP, predefinito a POST.headers: Puoi aggiungere qualsiasi header desideri. Ad esempio: Content-Type: application/json, Authorization: Bearer <token>payload_placeholder: Il prompt di attacco verrà inserito qui (supportate più posizioni): "{PAYLOAD_POSITION}"payload_encoding: Può essere none, url o form per controllare come i payload vengono codificati prima dell'inserimento.json o body: Definisci il payload della richiesta.verify_ssl: Imposta a true per abilitare la verifica TLS (disabilitata di default per comodità durante l'intercettazione del traffico).proxy: Configurazione proxy opzionale (scheme, host, port e credenziali opzionali) utilizzata sia per traffico HTTP che HTTPS.answer_focus_hint: Frammento di stringa opzionale che individua dove si trova la risposta dell'assistente all'interno di risposte HTTP rumorose.Esempio di richiesta JSON (vedi http-examples/http-config-example.yaml):
name: Esempio Endpoint Chat Esterno
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
Esempio di richiesta POST classica con codifica del payload (http-examples/http-config-form.yaml):
name: Endpoint Form
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 sostituisce ogni occorrenza di {PAYLOAD_POSITION} con il prompt di attacco corrente, emette la richiesta HTTP e invia il corpo della risposta all'LLM di controllo per la valutazione. Quando viene fornito answer_focus_hint, all'LLM valutatore viene chiesto di concentrarsi su quella parte della risposta.
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