Suite de tests open-source d'injection de prompts cross-modale et multimodale. 250 000+ payloads d'attaque couvrant les modalités texte, image, document et audio. S'appuie sur les recherches de l'OWASP LLM Top 10, CrossInject (ACM MM 2025), FigStep (AAAI 2025), DolphinAttack et CSA 2026.
516 588 échantillons étiquetés (251 782 attaques + 251 576 bénins, plus une partition de validation de 13 230 échantillons réels) répartis sur cinq versions du jeu de données plus l'ingestion de jeux de données externes, couvrant les attaques multimodales, multi-tours, à suffixe adversarial, à template jailbreak, par injection indirecte, par manipulation d'outils, agentiques, par évasion, déni de service de raisonnement, génération vidéo, robotique VLA, chaîne d'approvisionnement LoRA, LLM audio-natif, optimisation RAG, MCP inter-serveurs, agent de codage, frontière de sérialisation et chaîne d'approvisionnement de compétences d'agent sur les systèmes d'IA. Les échantillons d'attaque et bénins sont équilibrés à 1:1 (ratio 0.9992:1 après nettoyage d'audit).
Conçu pour entraîner et évaluer les détecteurs d'injection de prompt. Tous les échantillons sont étiquetés (expected_detection: true/false), attribués à leur source — articles évalués par les pairs ou recherches industrielles documentées — et structurés pour une utilisation directe dans des classifieurs binaires.
Les payloads sont du simple JSON. Chargez-les directement avec la stdlib de votre langage — aucune dépendance :```python import json, pathlib records = [] for p in pathlib.Path("payloads_v5").glob("*.json"): records.extend(json.loads(p.read_text())) print(f"{len(records)} labeled samples")
Chaque enregistrement porte `expected_detection: true|false`, une chaîne `attack_category` et un champ `source` pointant vers l'article original ou l'incident documenté. C'est suffisant pour entraîner un classifieur binaire, calculer un ASR par catégorie ou découper par vecteur d'attaque.
---
## Méthodologie
### Ce que couvre ce jeu de données
**L'injection de prompt** est définie ici comme : *texte intégré dans une entrée d'LLM destiné à remplacer, détourner ou rediriger le comportement du modèle hors de la tâche spécifiée par son opérateur*. Cette définition suit Greshake et al. 2023 (arXiv:2302.12173) et OWASP LLM01:2025.
Le périmètre est **l'injection au moment de l'exécution uniquement** -- le texte qu'un attaquant peut placer dans la fenêtre de contexte du modèle au moment de l'inférence. Le jeu de données exclut délibérément :
- Les attaques au moment de l'entraînement (empoisonnement des données, agents dormants, fine-tuning par porte dérobée)
- Les attaques d'extraction de modèle sans composante d'injection
- Les jailbreaks purs qui sollicitent une génération nuisible sans détourner une tâche LLM spécifique (par exemple « dis-moi comment fabriquer une bombe » formulé sans cadre de remplacement)
- L'ingénierie sociale générique qui ne cible pas un LLM
La distinction est importante pour la détection : un détecteur à l'exécution lit le prompt, pas les poids du modèle. Les attaques qui n'affectent que l'entraînement sont hors périmètre.
### Méthode de construction
Le jeu de données a été construit en quatre couches :
**Couche 1 -- Charges utiles de départ (fabriquées à la main, 210 + 187 + 284 graines) :** Les graines d'injection pour chaque catégorie d'attaque ont été écrites à la main, basées sur des articles évalués par les pairs et des incidents réels documentés. Chaque graine est étiquetée avec sa source académique et sa référence d'attaque. Les graines ont été examinées par rapport à la définition d'inclusion ci-dessus -- toute graine qui pouvait être relue comme une requête bénigne sans composante de remplacement a été écartée ou réécrite.
**Couche 2 -- Expansion programmatique via modèles et encodage (v2, 14,358 échantillons) :** Les graines ont été passées à travers les 162 modèles de jailbreak de PyRIT v0.12.1 et 13 convertisseurs d'encodage. L'expansion par modèles est entièrement déterministe et reproductible à partir du script générateur. Les suffixes adverses GCG ont été tirés de la littérature publiée (Zou et al. 2023) et ajoutés aux graines ; l'optimisation de gradient en direct est facultative et nécessite un GPU.
**Couche 3 -- Livraison transmodale (v1 + v4 transmodal, 35,687 échantillons) :** Les graines d'injection ont été livrées via 7 méthodes d'image, 4 types de documents x 5 emplacements de dissimulation, 6 méthodes audio et des combinaisons multi-modales. Cela suit le modèle de menace de FigStep (arXiv:2311.05608) et CrossInject (arXiv:2504.14348) : le texte d'injection peut arriver dans n'importe quelle modalité traitée par le pipeline, pas seulement le champ texte. Les champs de modalité (`image_content`, `doc_content`, `audio_content`) enregistrent ce que l'extracteur du modèle lirait sur ce canal.
**Couche 4 -- Échantillons bénins (50,516 au total) :** Les prompts bénins ont été tirés de jeux de données académiques et industriels publiés (Stanford Alpaca, WildChat, deepset/prompt-injections, LMSYS Chatbot Arena). Les échantillons bénins multimodaux associent ces prompts textuels à de vraies légendes d'images (MS-COCO 2017, Flickr30k), des passages de documents (Wikipédia EN, arXiv via RedPajama) et des transcriptions audio (LibriSpeech, Mozilla Common Voice). Un ensemble de 130 cas limites fabriqués à la main utilise un vocabulaire proche des attaques (« ignore », « override », « system prompt », « password ») dans des contextes réellement bénins afin de réduire les faux positifs lors de l'entraînement.
**Couche 5 -- Ensemble de validation réel (13,230 échantillons) :** Les couches 1 à 4 sont construites : écrites à la main, générées par modèles ou tirées d'autres jeux de données. La couche 5 ne l'est pas. Elle a été collectée lors d'un jeu en direct où les joueurs gagnaient des points en battant un détecteur déployé, à travers des étapes de niveau boss « château » et des passes multimodales « fantôme ». Chaque contournement réussi ou tenté a été journalisé, puis anonymisé (identifiants et données de paiement supprimés au niveau de la table, PII dans le texte masquée, lignes à haut risque mises en quarantaine pour examen manuel plutôt que publiées) et publié sous [`payloads_live/`](https://github.com/josh-blythe/bordair-multimodal/blob/main/payloads_live). Là où les couches 1 à 4 mesurent la couverture contre des classes d'attaque connues, la couche 5 mesure si un détecteur tient face à un humain motivé cherchant activement à le briser. Voir [`payloads_live/README.md`](https://github.com/josh-blythe/bordair-multimodal/blob/main/payloads_live/README.md) pour la méthodologie complète d'anonymisation.
### Attribution des étiquettes
Toutes les charges utiles d'attaque : `expected_detection: true`
Tous les échantillons bénins : `expected_detection: false`
Les étiquettes sont attribuées par construction, et non par examen humain d'échantillons individuels. La garantie de justesse est donc au **niveau de la catégorie** : chaque catégorie correspond à une classe d'attaque documentée avec un mécanisme spécifique. Les échantillons individuels héritent de l'étiquette de la graine et de la catégorie dont ils sont issus.
Aucun bruit adversarial d'étiquetage n'est introduit délibérément. Le détecteur est censé apprendre le motif d'injection, non pas distinguer entre injections « réelles » et « factices » -- tous les échantillons de l'ensemble d'attaque représentent des chaînes d'attaque réelles ou plausibles.
### Risque de faux positifs bénins