
Implémentation de recherche d’une attaque par empoisonnement contre les modèles de langage à récupération augmentée, utilisant des documents camouflés pour contourner les défenses de filtrage et induire des réponses incorrectes.
Dépôt officiel de l'article EMNLP 2026 CamoDocs: A Poisoning Attack Against Retrieval-Augmented Language Models Using Camouflaged Documents.
CamoDocs est une attaque par empoisonnement de base de connaissances contre la génération augmentée par récupération (RAG) qui ne nécessite aucune inclusion de requête. Chaque sous-document adversarial est camouflé en le concaténant avec un sous-document bénin optimisé, de sorte que les documents empoisonnés résultants évitent les artefacts de chevauchement de requêtes sur lesquels les défenses par filtrage s'appuient.

CamoDocs génère des sous-documents bénins et adversariaux, optimise les parties bénignes avec des jetons de dispersion et un filtrage de cohérence, puis les fusionne pour créer des documents empoisonnés qui contournent les défenses par filtrage et induisent la réponse incorrecte ciblée.
Testé avec Python 3.10, CUDA 12.8, PyTorch 2.8.0. Un seul GPU de 48 Go suffit pour
les victimes de classe 8B. Mixtral-8x7B ne tient pas sur une seule carte de 48 Go ; utilisez
--lm_deploy_tp pour le répartir sur plusieurs cartes.
conda create -n camodocs python=3.10 -y
conda activate camodocs
pip install -r requirements.txt
python -m spacy download en_core_web_sm
python -c "import nltk; nltk.download('punkt'); nltk.download('stopwords')"
La défense LLM Filter nécessite en plus openai/gpt-oss-safeguard-20b, qui
exige une pile vLLM/transformers/torch plus récente, elle vit donc dans son propre environnement :
conda create -n camodocs_vllm python=3.10 -y
conda activate camodocs_vllm
pip install -r requirements_vllm.txt
Définissez d'abord ces variables. Chaque script vérifie les variables dont il a besoin et se termine immédiatement si l'une d'elles manque.
export REPO_ROOT=/chemin/absolu/vers/ce/depot
export DATA_ROOT=/chemin/absolu/pour/les/sorties/intermediaires
export OPENAI_API_KEY=... # juge LLM, synthèse GPT-4o-mini
export HF_TOKEN=... # modèles restreints (Llama-3.1, Mixtral)
Exécutez ensuite n'importe quelle évaluation de défense. Les artefacts fournis vous permettent de sauter entièrement les étapes 1 à 3 :
bash scripts/eval_trustrag.sh
Chaque script reproduit une ligne sur HotpotQA avec une victime Llama-3.1-8B. Pour un
autre jeu de données, définissez EVAL_DATASET=nq (ou msmarco) dans l'environnement ; pour une
autre victime, modifiez MODEL_NAME dans le script.
bash scripts/eval_trustrag.sh # TrustRAG (k-means + prompting de conflit)
bash scripts/eval_query_detection.sh # Détection de requête (filtre SequenceMatcher)
bash scripts/eval_divide_and_vote.sh # Divide-and-Vote
bash scripts/eval_robustrag.sh # RobustRAG (agrégation par mots-clés)
bash scripts/eval_isolation_forest.sh # Forêt d'isolation
bash scripts/eval_rerank.sh # Reclassement par encodeur croisé (bge-reranker-v2-m3)
bash scripts/llm_filter_eval.sh # LLM Filter (nécessite le critique vLLM ci-dessous)
Les six premiers nécessitent 1 GPU. Le LLM Filter exécute en plus un critique de 20B dans un
second shell, il faut donc suffisamment de mémoire GPU pour ce critique en plus de la
victime. Nos exécutions ont utilisé quatre cartes de 48 Go ; définissez TP et LM_DEPLOY_TP pour correspondre à
votre propre matériel :
# Shell 1
conda activate camodocs_vllm
bash scripts/gpt_oss_safeguard_vllm_serve.sh # sert sur :8001, TP=4
# Shell 2
conda activate camodocs
bash scripts/llm_filter_eval.sh # vérifie d'abord l'état du critique
Les étapes 1-2 rédigent des passages bénins et adversariaux avec GPT-4o-mini, l'étape 3 applique l'optimisation au niveau des jetons, l'étape 4 évalue contre les défenses.
bash scripts/gen_synth_benign_hotpotqa.sh # Étape 1 : brouillons porteurs bénins
bash scripts/gen_adv_hotpotqa.sh # Étape 2 : brouillons adversariaux
bash scripts/camodocs_token_manipulation.sh # Étape 3 : manipulation de jetons CamoDocs
bash scripts/eval_trustrag.sh # Étape 4 : évaluation
Les scripts contiennent les hyperparamètres exacts utilisés pour les exécutions rapportées (beta=10, alpha=30, m=1000, m'=100, top-k=5).
Les jeux de données BEIR se téléchargent automatiquement à la première utilisation, dans
${REPO_ROOT}/datasets/. Chaque étape fait cela, il n'y a donc aucune étape de configuration
de données séparée. Pour les récupérer à l'avance à la place :
mkdir -p ${REPO_ROOT}/datasets && cd ${REPO_ROOT}/datasets
for ds in hotpotqa nq msmarco; do
wget https://public.ukp.informatik.tu-darmstadt.de/thakur/BEIR/datasets/${ds}.zip
unzip ${ds}.zip
done
Pour éviter le prétraitement coûteux, cette version fournit des récupérations Contriever
précalculées (results/beir_results/), les sous-ensembles d'évaluation fixes de 1 000 requêtes
(target_queries_fixed/) et des exemples de sorties des étapes 2/3
(data_examples/) pour les trois jeux de données.
Tous les chiffres rapportés se reproduisent pour HotpotQA, NQ et MS-MARCO à partir des artefacts
fournis. (Réexécuter l'étape 2 elle-même nécessite votre propre fichier de réponses pour NQ et
MS-MARCO — gen_adv.py l'explique si vous essayez.)
Cette base de code est fournie sous licence MIT (LICENSE), suivant le
dépôt original PoisonedRAG,
qui est également sous MIT.
Une exception : src/contriever_src/ est le code de
contriever de Meta et reste
sous CC BY-NC 4.0, ce répertoire est donc réservé à un usage non commercial uniquement.
Ce package est fourni à des fins de recherche et de reproductibilité. Le code publié est destiné à reproduire les expériences rapportées dans l'article et à soutenir la recherche sur la robustesse et les défenses RAG.
Le package utilise des jeux de données, modèles et bibliothèques logicielles disponibles publiquement sous leurs licences et conditions d'utilisation respectives. Les jeux de données BEIR tels que HotpotQA, NQ et MS-MARCO sont téléchargés depuis les URL officielles BEIR plutôt que redistribués dans ce package.
Les poids de modèles et API utilisés par le pipeline, y compris GPT-4o-mini, GPT-4.1-mini, Llama-3.1-8B, Qwen3-8B, Mixtral-8x7B, Contriever, ANCE, GPT-2, bge-reranker-v2-m3 et gpt-oss-safeguard-20b, restent soumis aux licences et politiques d'utilisation de leurs fournisseurs d'origine. Ce package n'accorde aucun droit supplémentaire sur ces artefacts tiers.
Les documents adversariaux et artefacts intermédiaires inclus dans ce package sont fournis uniquement pour une évaluation de recherche contrôlée de la robustesse RAG. Ils ne doivent pas être utilisés pour attaquer des systèmes déployés ou empoisonner des bases de connaissances réelles.
@misc{jung2026camodocs,
title={CamoDocs: A Poisoning Attack Against Retrieval-Augmented Language Models Using Camouflaged Documents},
author={Jaewon Jung and Haizhong Zheng and Hongsun Jang and Jaeyong Song and Beidi Chen and Jinho Lee},
year={2026},
eprint={2608.28389},
archivePrefix={arXiv},
primaryClass={cs.CR},
url={https://arxiv.org/abs/2608.28389},
}