
ein Sicherheitsscanner für benutzerdefinierte LLM-Anwendungen
_________ __O __O o_.-._
Humans, Do Not Resist! \|/ ,-'-.____() / /\_, / /\_|_.-._|
_____ / --O-- (____.--""" ___/\ ___/\ |
( o.o ) / Utku Sen's /|\ -'--'_ /_ /__|_
| - | / _ __ _ _ ___ _ __ _ __| |_ _ __ __ _ _ __|___ \
/| | | '_ \ '_/ _ \ ' \| '_ \ _| ' \/ _` | '_ \ __) |
/ | | | .__/_| \___/_|_|_| .__/\__|_|_|_\__,_| .__// __/
/ |-----| |_| |_| |_| |_____|
promptmap2 ist ein automatisierter Prompt-Injection-Scanner für benutzerdefinierte LLM-Anwendungen. Es unterstützt zwei Testmodi:
White-Box-Tests: Geben Sie Ihre System-Prompts und die Modellinformationen an. promptmap2 führt das Ziel-LLM selbst aus und testet es.
Black-Box-Tests: Richten Sie promptmap2 auf einen externen HTTP-Endpunkt. Es sendet Angriffs-Prompts per HTTP und untersucht die zurückgegebenen Ausgaben.
Es arbeitet mit einer Dual-LLM-Architektur:
Das Tool sendet Angriffs-Prompts an Ihr Ziel-LLM und verwendet das Controller-LLM, um anhand vordefinierter Bedingungen zu bewerten, ob der Angriff erfolgreich war.
Es enthält umfassende Testregeln in mehreren Kategorien, darunter Prompt-Stealing, Jailbreaking, Erzeugung schädlicher Inhalte, Bias-Tests und mehr.
[!IMPORTANT]
promptmap wurde ursprünglich 2023 veröffentlicht, aber 2025 komplett neu geschrieben.
📖 Möchten Sie Ihre LLM-Apps absichern? Sie können mein E-Book kaufen

git clone https://github.com/utkusen/promptmap.git
cd promptmap
pip install -r requirements.txt
Setzen Sie den entsprechenden API-Schlüssel für Ihren gewählten Anbieter.
export OPENAI_API_KEY="your-openai-key"
Andere unterstützte Anbieter verwenden ANTHROPIC_API_KEY, GOOGLE_API_KEY und XAI_API_KEY.
Wenn Sie lokale Modelle verwenden möchten, müssen Sie Ollama installieren.
Besuchen Sie die Ollama-Downloadseite und folgen Sie den Installationsanweisungen.
Sie müssen Ihre System-Prompts-Datei bereitstellen. Die Standarddatei ist system-prompts.txt. Sie können Ihre eigene Datei mit dem Flag --prompts angeben. Ein Beispiel ist im Repository enthalten.
python3 promptmap2.py --target-model gpt-3.5-turbo --target-model-type openai
Anthropic-, Google- und XAI-Anbieter folgen dem gleichen Muster: Wählen Sie den richtigen Modellnamen und setzen Sie --target-model-type auf anthropic, google oder xai.
python3 promptmap2.py --target-model "llama2:7b" --target-model-type ollama
# Falls das Modell nicht installiert ist, werden Sie von promptmap gefragt, ob Sie es herunterladen möchten. Für automatischen Download verwenden Sie das Flag `-y`.
# Standardmäßig verbindet sich promptmap2 mit Ollama unter http://localhost:11434
# Sie können eine benutzerdefinierte URL angeben, falls Ihr Ollama-Server woanders läuft
python3 promptmap2.py --target-model "llama2:7b" --target-model-type ollama --ollama-url http://192.168.1.100:11434
Standardmäßig wird dasselbe Modell sowohl als Ziel als auch als Controller verwendet.
[!IMPORTANT]
Für das Controller-Modell wird dringend empfohlen, eines dieser leistungsstarken Modelle für eine genaue Bewertung zu verwenden:
- OpenAI GPT-5
- Google Gemini 2.5 Pro
- Anthropic Claude 4 Sonnet
- gpt-oss:20b (via Ollama)
Schwächere Modelle analysieren Ergebnisse möglicherweise nicht genau und können zu falsch positiven oder negativen Ergebnissen führen.
# Verwenden von GPT-4o als Controller zum Testen eines GPT-3.5-Ziels
python3 promptmap2.py --target-model gpt-3.5-turbo --target-model-type openai \
--controller-model gpt-4o --controller-model-type openai
# Verwenden von Claude 4 Opus als Controller zum Testen eines lokalen Llama-Modells
python3 promptmap2.py --target-model llama2:7b --target-model-type ollama \
--controller-model claude-4-opus-20240229 --controller-model-type anthropic
Wenn Sie den System-Prompt des Ziel-LLMs nicht kontrollieren, können Sie es dennoch angreifen, indem Sie ein HTTP-Anfrageschema bereitstellen. Setzen Sie --target-model-type http und geben Sie mit --http-config eine YAML-Datei an, die beschreibt, wie jede Nutzlast gesendet wird. Wichtige Felder:
url: Ziel der Anfrage. Beispiel: https://assistant.example.com/chatmethod: HTTP-Verb, Standard ist POST.headers: Sie können beliebige Header hinzufügen. Beispiel: Content-Type: application/json, Authorization: Bearer <token>payload_placeholder: Der Angriffs-Prompt wird hier eingefügt (mehrere Positionen werden unterstützt): "{PAYLOAD_POSITION}"payload_encoding: Kann none, url oder form sein, um zu steuern, wie Nutzlasten vor dem Einfügen codiert werden.json oder body: Definieren Sie die Anfragenutzlast.verify_ssl: Setzen Sie auf true, um TLS-Überprüfung zu aktivieren (standardmäßig deaktiviert, um das Abfangen von Datenverkehr zu erleichtern).proxy: Optionale Proxy-Konfiguration (scheme, host, port und optionale Anmeldeinformationen), die sowohl für HTTP- als auch HTTPS-Datenverkehr verwendet wird.answer_focus_hint: Optionaler Text-Schnipsel, der angibt, wo sich die Antwort des Assistenten in lauten HTTP-Antworten befindet.Beispiel-JSON-Anfrage (siehe 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
Beispiel einer klassischen POST-Anfrage mit Nutzlastcodierung (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 ersetzt jedes Vorkommen von {PAYLOAD_POSITION} durch den aktuellen Angriffs-Prompt, sendet die HTTP-Anfrage und übergibt den Antworttext an das Controller-LLM zur Bewertung. Wenn answer_focus_hint angegeben ist, wird das Bewertungs-LLM angewiesen, sich auf diesen Teil der Antwort zu konzentrieren.