ブラックホール攻撃の研究実装。中心性駆動型のハブ性を利用してベクトルデータベースのインデックスを汚染し、FAISSパイプラインと検出・緩和防御の評価を備える。
このリポジトリには、論文 Black-Hole Attack from Embedding Space Defects に付随する実装が含まれています。ブラックホール攻撃は、高次元埋め込み空間における幾何学的欠陥——中心性駆動型ハブ性(centrality-driven hubness)——を悪用してベクトルデータベースを汚染します。クラスタの重心付近に注入された少数の悪意あるベクトルが、ユーザークエリに関する知識を一切必要とせずに、多数のユーザークエリに対する最近傍となるのです。
faiss-gpu、CPU: faiss-cpu)scripts/encode_*.py でのみ必要。攻撃パイプライン自体は torch をインポートしません)コア依存関係のインストール:
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
各スクリプトの MODELS 配列と DATASETS 配列を編集して、特定のモデルやデータセットを選択します。
# Full-Export Attack on HotpotQA with Contriever
python run.py --model contriever --src hotpotqa
これにより、フルパイプラインが実行されます:ベクトルの読み込み → クラスタリング → 敵対的ベクトルの生成 → 注入 → ポイズニングされたインデックスの構築 → MO@10、ASR、FPR の評価。
| フラグ | デフォルト | 説明 |
|---|---|---|
--model / --src | contriever / hotpotqa | 埋め込みモデルとソースデータセット |
--mode | default | default(同一データセット)または transfer(データセット間) |
--preprocess | default | default、query_trans、または multi_query_transfer |
--cluster | kmeans | kmeans、minibatch_kmeans、faiss_gpu |
--num-copies / --epsilon | 10 / 0.001 | セントロイドごとの摂動コピー数;摂動の大きさ |
--eval-k / --sample-queries | 10 / 3000 | Top‑k 評価;サンプリングするクエリ数 |
--eval-index-types | FlatIP | 評価するインデックスタイプ:FlatIP、HNSW、IVF、IVFPQ |
--eval-runners | evaluate | 評価ステップ:evaluate、evaluate_recall、evaluate_defense、evaluate_defense_performance_loss、evaluate_mitigation_defense、evaluate_mitigation_performance_loss |
--result-subdir | 自動 | 出力 JSON 用の data/result/ 配下のサブディレクトリ |
論文で説明されている 4 つの攻撃パスは、以下の呼び出しに対応しています:
| パス | コマンド |
|---|---|
| (1) データベース全体のエクスポート | python run.py --mode default --preprocess default |
| (2) データベースの部分エクスポート | クラスタリング前にベクトルの一部を外部にエクスポートする;パイプラインの残りは (1) と同一 |
| (3) サロゲートデータセット攻撃 | python run.py --mode transfer --preprocess multi_query_transfer --victim <dataset> |
| (4) 公開済み事前埋め込みデータセットへのポイズニング | 事前埋め込みデータセットの .npy ファイルを改変し、HuggingFace に再アップロードする |
(3) の場合、攻撃者は他のすべてのデータセットのクエリから悪意のあるベクトルを構築し、それらを被害者に注入します。サロゲートソースデータセット用のクエリ .npy ファイルが data/vector/ に存在している必要があります。
検出ベースの防御を実行するには:
python run.py --model contriever --src hotpotqa \
--eval-runners evaluate_defense evaluate_defense_performance_loss
緩和策ベースの防御(1つ以上の手法)の場合:
python run.py --model contriever --src hotpotqa \
--eval-runners evaluate_mitigation_defense evaluate_mitigation_performance_loss \
--mitigation-methods cl2 zn nohub
demo/ には、BEIR データセットから小さなナレッジベースを構築し、それをエンコードし、悪意のあるベクトルを注入し、検索レベルでの影響を測定する、自己完結型の最小限のサンプルが含まれています。独自の requirements.txt を使用し、src/ には依存しません。CLI の詳細については demo/src/main.py を参照してください。
config.json は、サポートされているモデル(contriever、bge、gte)とデータセット(14 個の BEIR ベンチマーク)を定義しています。新しいモデルを追加するには、config.json を拡張し、data/vector/<model>_<dataset>.npy の下に .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},
}