
Forschungsimplementierung des Black-Hole-Angriffs, der Vektor-Datenbankindizes über zentralitätsgetriebene Hubness vergiftet, mit FAISS-Pipelines und Bewertung von Erkennungs- und Abwehrmaßnahmen.
Dieses Repository enthält die Implementierung, die zum Paper Black-Hole Attack from Embedding Space Defects gehört. Der Black-Hole-Angriff nutzt einen geometrischen Defekt in hochdimensionalen Einbettungsräumen aus – die zentralitätsgetriebene Hubness –, um Vektordatenbanken zu vergiften: Eine kleine Anzahl bösartiger Vektoren, die nahe an Cluster-Zentroide injiziert werden, werden zu den nächsten Nachbarn für einen großen Anteil der Benutzerabfragen, ohne dass jegliches Wissen über diese Abfragen erforderlich ist.
faiss-gpu; CPU: faiss-cpu)scripts/encode_*.py erforderlich; die Angriffspipeline selbst importiert torch nicht)Kernabhängigkeiten installieren:
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
Bearbeiten Sie die Arrays MODELS und DATASETS in jedem Skript, um bestimmte Modelle oder Datensätze auszuwählen.
# Full-Export Attack on HotpotQA with Contriever
python run.py --model contriever --src hotpotqa
Dies führt die vollständige Pipeline aus: Vektoren laden → clustern → adversariale Vektoren generieren → injizieren → vergifteten Index erstellen → MO@10, ASR, FPR auswerten.
| Flag | Standard | Beschreibung |
|---|---|---|
--model / --src | contriever / hotpotqa | Embedding-Modell und Quelldatensatz |
--mode | default | default (gleicher Datensatz) oder transfer (datensatzübergreifend) |
--preprocess | default | default, query_trans oder multi_query_transfer |
--cluster | kmeans | kmeans, minibatch_kmeans, faiss_gpu |
--num-copies / --epsilon | 10 / 0.001 | Anzahl der gestörten Kopien pro Zentroid; Störungsstärke |
--eval-k / --sample-queries | 10 / 3000 | Top‑k-Auswertung; Anzahl der abgetasteten Abfragen |
--eval-index-types | FlatIP | Auszuwertende Indextypen: FlatIP, HNSW, IVF, IVFPQ |
--eval-runners | evaluate | Auswertungsschritte: evaluate, evaluate_recall, evaluate_defense, evaluate_defense_performance_loss, evaluate_mitigation_defense, evaluate_mitigation_performance_loss |
--result-subdir | auto | Unterverzeichnis unter data/result/ für die Ausgabe-JSON |
Die vier im Paper beschriebenen Angriffspfade entsprechen den folgenden Aufrufen:
| Pfad | Befehl |
|---|---|
| (1) Vollständiger Datenbankexport | python run.py --mode default --preprocess default |
| (2) Teilweiser Datenbankexport | Exportieren Sie einen Bruchteil der Vektoren extern vor dem Clustern; der Rest der Pipeline ist identisch zu (1) |
| (3) Surrogat-Datensatz-Angriff | python run.py --mode transfer --preprocess multi_query_transfer --victim <dataset> |
| (4) Vergiftung öffentlicher vorab eingebetteter Datensätze | Ändern Sie die .npy-Dateien eines vorab eingebetteten Datensatzes und laden Sie sie erneut auf HuggingFace hoch |
Für (3) erstellt der Angreifer bösartige Vektoren aus Abfragen von allen anderen Datensätzen und injiziert sie in das Opfer. Die Abfrage-.npy-Dateien für die Surrogat-Quelldatensätze müssen in data/vector/ vorhanden sein.
Um die erkennungsbasierte Verteidigung auszuführen:
python run.py --model contriever --src hotpotqa \
--eval-runners evaluate_defense evaluate_defense_performance_loss
Für die mitigation‑basierte Verteidigung (eine oder mehrere Methoden):
python run.py --model contriever --src hotpotqa \
--eval-runners evaluate_mitigation_defense evaluate_mitigation_performance_loss \
--mitigation-methods cl2 zn nohub
demo/ enthält ein eigenständiges minimales Beispiel, das eine kleine Wissensdatenbank aus einem BEIR-Datensatz aufbaut, sie kodiert, bösartige Vektoren injiziert und die Auswirkungen auf Retrieval-Ebene misst. Es verwendet eine eigene requirements.txt und ist nicht von src/ abhängig. CLI-Details finden sich in demo/src/main.py.
config.json definiert die unterstützten Modelle (contriever, bge, gte) und Datensätze (14 BEIR-Benchmarks). Um ein neues Modell hinzuzufügen, erweitere config.json und stelle sicher, dass .npy-Vektordateien unter data/vector/<model>_<dataset>.npy vorhanden sind.
@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},
}