
중심성 기반 허브성(hubness)을 통해 벡터 데이터베이스 인덱스를 오염시키는 블랙홀 공격(Black-Hole Attack)의 연구 구현으로, 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 | auto | 출력 JSON을 위한 data/result/ 하위 디렉터리 |
논문에서 설명하는 네 가지 공격 경로는 다음 호출에 대응합니다:
| 경로 | 명령 |
|---|---|
| (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
완화 기반 방어(하나 이상의 방법)의 경우:
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},
}