Implémentation de recherche de l'attaque Black-Hole qui empoisonne les index de bases de données vectorielles via une hubness pilotée par la centralité, avec des pipelines FAISS et une évaluation des défenses de détection et d'atténuation.
Ce dépôt contient l'implémentation accompagnant l'article Black-Hole Attack from Embedding Space Defects. L'attaque du trou noir exploite un défaut géométrique dans les espaces d'embedding de haute dimension — la hubness guidée par la centralité — pour empoisonner les bases de données vectorielles : un petit nombre de vecteurs malveillants injectés près des centroïdes de clusters deviennent les plus proches voisins d'une grande fraction des requêtes des utilisateurs, sans nécessiter aucune connaissance de ces requêtes.
faiss-gpu ; CPU : faiss-cpu)scripts/encode_*.py ; le pipeline d'attaque lui-même n'importe pas torch)Installer les dépendances principales :
pip install numpy pandas pyarrow scikit-learn tqdm faiss-gpu
# Download BEIR datasets
bash scripts/download_data.sh
# Encode to vectors + build FAISS indexes
bash scripts/process_data.sh
Modifiez les tableaux MODELS et DATASETS dans chaque script pour sélectionner des modèles ou des jeux de données spécifiques.
# Full-Export Attack on HotpotQA with Contriever
python run.py --model contriever --src hotpotqa
Cela exécute le pipeline complet : chargement des vecteurs → clustering → génération de vecteurs adversariaux → injection → construction de l'index empoisonné → évaluation de MO@10, ASR, FPR.
| Option | Valeur par défaut | Description |
|---|---|---|
--model / --src | contriever / hotpotqa | Modèle d'embedding et jeu de données source |
--mode | default | default (même jeu de données) ou transfer (inter-jeux de données) |
--preprocess | default | default, query_trans, ou multi_query_transfer |
--cluster | kmeans | kmeans, minibatch_kmeans, faiss_gpu |
--num-copies / --epsilon | 10 / 0.001 | Nombre de copies perturbées par centroïde ; amplitude de la perturbation |
--eval-k / --sample-queries | 10 / 3000 | Évaluation top‑k ; nombre de requêtes échantillonnées |
--eval-index-types | FlatIP | Types d'index à évaluer : FlatIP, HNSW, IVF, IVFPQ |
--eval-runners | evaluate | Étapes d'évaluation : evaluate, evaluate_recall, evaluate_defense, evaluate_defense_performance_loss, evaluate_mitigation_defense, evaluate_mitigation_performance_loss |
--result-subdir | auto | Sous-répertoire sous data/result/ pour le JSON de sortie |
Les quatre chemins d'attaque décrits dans l'article correspondent aux invocations suivantes :
| Chemin | Commande |
|---|---|
| (1) Export complet de la base de données | python run.py --mode default --preprocess default |
| (2) Export partiel de la base de données | Exporter une fraction des vecteurs en externe avant le clustering ; le reste du pipeline est identique à (1) |
| (3) Attaque par jeu de données substitut | python run.py --mode transfer --preprocess multi_query_transfer --victim <dataset> |
| (4) Empoisonnement de jeux de données publics pré‑embeddés | Modifier les fichiers .npy d'un jeu de données pré‑embeddé et le re‑téléverser sur HuggingFace |
Pour (3), l'attaquant construit des vecteurs malveillants à partir des requêtes de tous les autres jeux de données et les injecte dans la victime. Les fichiers .npy de requêtes pour les jeux de données sources substituts doivent être présents dans data/vector/.
Pour exécuter la défense basée sur la détection :
python run.py --model contriever --src hotpotqa \
--eval-runners evaluate_defense evaluate_defense_performance_loss
Pour la défense basée sur l'atténuation (une ou plusieurs méthodes) :
python run.py --model contriever --src hotpotqa \
--eval-runners evaluate_mitigation_defense evaluate_mitigation_performance_loss \
--mitigation-methods cl2 zn nohub
demo/ contient un exemple minimal autonome qui construit une petite base de connaissances à partir d'un jeu de données BEIR, l'encode, injecte des vecteurs malveillants et mesure l'impact au niveau de la récupération. Il utilise son propre requirements.txt et ne dépend pas de src/. Voir demo/src/main.py pour les détails de la CLI.
config.json définit les modèles pris en charge (contriever, bge, gte) et les jeux de données (14 benchmarks BEIR). Pour ajouter un nouveau modèle, étendez config.json et assurez-vous que les fichiers de vecteurs .npy existent sous data/vector/<model>_<dataset>.npy.
@misc{li2026trustvectorsvectordatabase,
title={Can You Trust the Vectors in Your Vector Database? Black-Hole Attack from Embedding Space Defects},
author={Hanxi Li and Jianan Zhou and Jiale Lao and Yibo Wang and Zhengmao Ye and Yang Cao and Junfen Wang and Mingjie Tang},
year={2026},
eprint={2604.05480},
archivePrefix={arXiv},
primaryClass={cs.CR},
url={https://arxiv.org/abs/2604.05480},
}