
Attaques par images adversariales sur les agents web vision-langage, de l'ancrage visuel à l'exécution dans le navigateur
Des images adverses détournent les agents web, de l'ancrage visuel à l'exécution dans le navigateur
Wanjing Han, Levi Taiji Li, Mu Zhang, Yue Jiang, Guanhong Tao — University of Utah
WebMirage est un framework de red-teaming pour les agents web fondés sur la vision. Il élabore des perturbations adverses localisées sur des images de pages web contrôlées par l'attaquant (par exemple, une vignette de produit ou une photo de profil) qui amènent l'agent à sélectionner l'élément de l'attaquant et à exécuter l'action de navigateur correspondante, à travers différents rendus de la page web. L'attaque est formulée de bout en bout, de l'ancrage visuel à l'exécution dans le navigateur, plutôt qu'au seul niveau de l'inférence du modèle.
Deux composants rendent cela possible :
Le framework est évalué face aux agents SeeAct et VisualWebArena sur six backbones VLM (LLaVA, MiniCPM-o, Phi-3 Vision, et d'autres). Voir l'article pour l'évaluation complète.
.
├── src/ # Perturbation optimization, one subdirectory per backbone
│ ├── LLaVA/
│ ├── MiniCPM-o/
│ └── Phi-3-vision/
├── scripts/ # Training / evaluation launch scripts, one subdirectory per backbone
├── dataflow/ # CodeQL query pack for agent dataflow analysis (DataflowAnalysis.ql)
├── data/ # Recomposed training / test screenshots and conversation templates
└── test/ # Pre-generated clean and perturbed samples for quick verification
Les modèles de base doivent être configurés manuellement avant d'utiliser ce framework.
Comme les backbones ont des exigences de bibliothèques incompatibles, chacun nécessite son propre environnement et des poids téléchargés localement.
conda create -n minicpm) et installez les dépendances.conda create -n llava).transformers dans un environnement dédié.Phi-3-vision-128k-instruct localement.Un test minimal exécute l'inférence sur des captures d'écran propres et perturbées, puis compare côte à côte les sélections de l'agent.
Remarque : Ce test nécessite Phi-3 Vision (voir Prérequis §3). Les images perturbées fournies ont été optimisées pour Phi-3 ; les données de test pour les autres backbones peuvent être générées avec les scripts d'entraînement dans
scripts/.
Les cas de test pré-générés se trouvent dans test/ :
test/
├── clean_fix_slot/ # Clean screenshots, target in a fixed slot position
├── clean_multi_slot/ # Clean screenshots, target across multiple slot positions
├── perturbed_fix_slot/ # Perturbed screenshots (ε=16/255), target in a fixed slot
├── perturbed_multi_slot/ # Perturbed screenshots (ε=16/255), target across multiple slots
├── conv.json # Conversation data (system prompt, user query, grounding prompt)
└── verify.py # Runs inference on clean vs. perturbed and compares results
Les cas fix_slot testent la variation des voisins (position de la cible fixe, éléments environnants variables) ; les cas multi_slot testent simultanément la variation des voisins et le décalage de position.
conda activate phi3vision
# Fixed slot position
python test/verify.py \
--model-path /path/to/Phi-3-vision-128k-instruct \
--conv-path test/conv.json \
--clean-image test/clean_fix_slot/sample_0.png \
--perturbed-image test/perturbed_fix_slot/sample_0.png
# Varying slot positions
python test/verify.py \
--model-path /path/to/Phi-3-vision-128k-instruct \
--conv-path test/conv.json \
--clean-image test/clean_multi_slot/sample_0.png \
--perturbed-image test/perturbed_multi_slot/sample_0.png
Le script affiche un tableau comparatif montrant, pour chaque cas de test, l'élément sélectionné avec une entrée propre par rapport à une entrée perturbée. Sur des captures d'écran propres, l'agent devrait sélectionner le candidat le plus correspondant ; sur des captures d'écran perturbées, il devrait systématiquement sélectionner le candidat contrôlé par l'attaquant.
Avec un environnement Conda dédié pour chaque backbone en place, le flux de travail ci-dessous utilise LLaVA comme exemple.
Les scripts font référence au code officiel de LLaVA depuis votre répertoire personnel (~/) :
cd ~
git clone https://github.com/haotian-liu/LLaVA.git
Ouvrez scripts/LLaVA/train_with_mask.sh et définissez chaque chemin (poids du modèle, données d'entraînement, template de conversation, masque, répertoire de sortie) pour qu'ils correspondent à votre configuration locale.
bash scripts/LLaVA/train_with_mask.sh
Les données d'entraînement se trouvent sous data/<scenario>/, avec des captures d'écran recomposées et un fichier de conversation train_samples.json. Le placeholder de token d'image dans le fichier de conversation doit correspondre au backbone cible :
| Backbone | Placeholder |
|---|---|
| MiniCPM-o | (<image>./</image>)\n |
| LLaVA | <image>\n |
| Phi-3 | <|image_1|>\n |
L'évaluation de bout en bout nécessite les frameworks d'agents cibles.
scripts/seeact/.scripts/visualwebarena/ pour les scripts d'évaluation avec les modes d'observation Accessibility Tree et Set-of-Mark.dataflow/DataflowAnalysis.ql est la requête CodeQL utilisée pour tracer quels tokens de sortie du modèle alimentent l'action de navigateur exécutée dans le code de post-traitement d'un agent. Exécutez-la sur le code source de l'agent cible avec la CodeQL CLI en utilisant la définition de pack dans dataflow/codeql-pack.yml.