
un scanner de sécurité pour les applications LLM personnalisées
_________ __O __O o_.-._
Humans, Do Not Resist! \|/ ,-'-.____() / /\_, / /\_|_.-._|
_____ / --O-- (____.--""" ___/\ ___/\ |
( o.o ) / Utku Sen's /|\ -'--'_ /_ /__|_
| - | / _ __ _ _ ___ _ __ _ __| |_ _ __ __ _ _ __|___ \
/| | | '_ \ '_/ _ \ ' \| '_ \ _| ' \/ _` | '_ \ __) |
/ | | | .__/_| \___/_|_|_| .__/\__|_|_|_\__,_| .__// __/
/ |-----| |_| |_| |_| |_____|
promptmap2 est un scanner automatisé d'injection de prompts pour les applications LLM personnalisées. Il prend en charge deux modes de test :
Test en boîte blanche : Fournissez vos prompts système et les informations sur le modèle. promptmap2 exécute lui-même le LLM cible et le teste.
Test en boîte noire : Pointez promptmap2 vers un point de terminaison HTTP externe. Il envoie des prompts d'attaque via HTTP et inspecte les réponses renvoyées.
Il fonctionne selon une architecture à double LLM :
L'outil envoie des prompts d'attaque à votre LLM cible et utilise le LLM contrôleur pour évaluer si l'attaque a réussi en fonction de conditions prédéfinies.
Il comprend des règles de test complètes couvrant plusieurs catégories, notamment le vol de prompts, le jailbreak, la génération de contenu nuisible, les tests de biais, et plus encore.
[!IMPORTANT]
promptmap a été initialement publié en 2023 mais a été entièrement réécrit en 2025.
📖 Vous voulez sécuriser vos applications LLM ? Vous pouvez acheter mon e-book

git clone https://github.com/utkusen/promptmap.git
cd promptmap
pip install -r requirements.txt
Définissez la clé API appropriée pour votre fournisseur choisi.
export OPENAI_API_KEY="votre-clé-openai"
Les autres fournisseurs pris en charge utilisent ANTHROPIC_API_KEY, GOOGLE_API_KEY et XAI_API_KEY.
Si vous souhaitez utiliser des modèles locaux, vous devez installer Ollama.
Rendez-vous sur la page de téléchargement d'Ollama et suivez les instructions d'installation.
Vous devez fournir votre fichier de prompts système. Le fichier par défaut est system-prompts.txt. Vous pouvez spécifier votre propre fichier avec l'option --prompts. Un exemple de fichier est fourni dans le dépôt.
python3 promptmap2.py --target-model gpt-3.5-turbo --target-model-type openai
Les fournisseurs Anthropic, Google et XAI suivent le même modèle : choisissez le bon nom de modèle et définissez --target-model-type sur anthropic, google ou xai.
python3 promptmap2.py --target-model "llama2:7b" --target-model-type ollama
# Si le modèle n'est pas installé, promptmap vous demandera de le télécharger. Si vous souhaitez le télécharger automatiquement, vous pouvez utiliser l'option `-y`.
# Par défaut, promptmap2 se connecte à Ollama sur http://localhost:11434
# Vous pouvez spécifier une URL personnalisée si votre serveur Ollama s'exécute ailleurs
python3 promptmap2.py --target-model "llama2:7b" --target-model-type ollama --ollama-url http://192.168.1.100:11434
Par défaut, le même modèle est utilisé à la fois comme cible et comme contrôleur.
[!IMPORTANT]
Pour le modèle contrôleur, il est fortement recommandé d'utiliser l'un de ces modèles puissants pour une évaluation précise :
- OpenAI GPT-5
- Google Gemini 2.5 Pro
- Anthropic Claude 4 Sonnet
- gpt-oss:20b (via Ollama)
Des modèles plus faibles peuvent ne pas analyser correctement les résultats et entraîner des faux positifs ou négatifs.
# Utilisez GPT-4o comme contrôleur pour tester une cible GPT-3.5
python3 promptmap2.py --target-model gpt-3.5-turbo --target-model-type openai \
--controller-model gpt-4o --controller-model-type openai
# Utilisez Claude 4 Opus comme contrôleur pour tester un modèle local Llama
python3 promptmap2.py --target-model llama2:7b --target-model-type ollama \
--controller-model claude-4-opus-20240229 --controller-model-type anthropic
Si vous ne contrôlez pas le prompt système du LLM cible, vous pouvez toujours l'attaquer en fournissant un schéma de requête HTTP. Définissez --target-model-type http et fournissez --http-config pointant vers un fichier YAML qui décrit comment envoyer chaque charge utile. Champs clés :
url : Destination de la requête. Par exemple : https://assistant.example.com/chatmethod : Verbe HTTP, par défaut POST.headers : Vous pouvez ajouter tous les en-têtes souhaités. Par exemple : Content-Type: application/json, Authorization: Bearer <token>payload_placeholder : Le prompt d'attaque sera inséré ici (plusieurs positions sont prises en charge) : "{PAYLOAD_POSITION}"payload_encoding : Peut être none, url ou form pour contrôler la façon dont les charges utiles sont encodées avant l'insertion.json ou body : Définissez la charge utile de la requête.verify_ssl : Définissez sur true pour activer la vérification TLS (désactivée par défaut pour faciliter l'interception du trafic).proxy : Configuration proxy facultative (scheme, host, port et identifiants facultatifs) utilisée pour le trafic HTTP et HTTPS.answer_focus_hint : Extrait de chaîne facultatif qui permet de localiser la réponse de l'assistant dans les réponses HTTP bruitées.Exemple de requête JSON (voir http-examples/http-config-example.yaml) :
name: Exemple de point de terminaison de chat externe
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
Exemple de requête POST classique avec encodage de la charge utile (http-examples/http-config-form.yaml) :
name: Point de terminaison de formulaire
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 remplace chaque occurrence de {PAYLOAD_POSITION} par le prompt d'attaque actuel, envoie la requête HTTP et transmet le corps de la réponse au LLM contrôleur pour évaluation. Lorsque answer_focus_hint est fourni, le LLM évaluateur est invité à se concentrer sur cette partie de la réponse.