
Code de recherche, benchmark et défense contre les attaques de rebinding de cible qui trompent les garde-fous de sécurité des LLM pour qu'ils notent du contenu leurre falsifié, ainsi que le durcissement par distillation segment-max.
Code, données et chaque score brut pour l'article (paper/main.pdf, source dans paper/).
Les garde-fous LLM reçoivent le contenu qu'ils examinent par simple interpolation de chaîne dans leur prompt d'évaluation, de sorte qu'un contenu qui imite le format de prompt du garde-fou peut ouvrir une seconde tâche d'évaluation forgée avec un document leurre inoffensif, que le garde-fou évalue alors au lieu du contenu réel (target rebinding). L'ajout d'une telle tâche forgée neutralise Shieldstral-1.0-3B sur les 75 requêtes AdvBench pré-enregistrées et tenues à l'écart qu'il signale, se transfère à gpt-oss-safeguard-20B et Llama Guard 4, et dans notre benchmark, GuardRebind (52 familles d'attaques, 5 contrôles), la famille la plus forte neutralise 93-100 % des éléments signalés sur chacun des cinq garde-fous. L'auto-distillation segment-max entraîne le garde-fou à noter le contenu au moins aussi haut que sa partie la plus nuisible et réduit le contournement sur les attaques tenues à l'écart de 75 % à environ 1 %, mais un attaquant adaptatif guidé par le score neutralise encore le garde-fou entraîné sur 94 % des éléments, dont plus de la moitié sans aucune structure forgée.
L'attaque est décrite en prose ici à dessein. Les charges utiles sont générées par
src/attacks.py (étude confirmatoire) et src/bench/attacks_grammar.py (benchmark), et
sont listées dans l'annexe de l'article.
| chemin | contenu |
|---|---|
PROTOCOL.md | pré-enregistrement de l'étude confirmatoire Shieldstral (Section 3 de l'article ; prédictions P1-P9) |
PROTOCOL_v2.md | pré-enregistrement du benchmark et de la défense de l'article (M1-M5, F1-F6, A1-A3), avec les déviations consignées D1-D4 |
src/*.py | étude confirmatoire sur Shieldstral et les exécutions inter-modèles (scorer, charges utiles, ablation, échelle de leurres, clients OpenRouter) |
src/bench/ | GuardRebind : chargeurs de jeux de données (data.py), adaptateurs de garde-fous (guards.py), grammaire d'attaque, exécuteurs locaux et API, analyse |
src/fix/ | la défense : distillation segment-max (distill.py), évaluation (evaluate.py), attaques adaptatives (adaptive.py), baselines sans entraînement (baselines.py), format d'entrée borné (inputs.py) |
src/mech/ | patching d'activations, sondes linéaires, similarité de représentations, dose-réponse des leurres |
scripts/queue_*.sh | files de tâches reprenables qui ont produit les résultats (une tâche GPU à la fois) |
scripts/pod/ | exécuter les files de défense sur un GPU CUDA loué (Runpod) et copier les résultats en retour |
scripts/analysis_r2/ | statistiques CPU derrière les chiffres de défense (Wilson, Newcombe, Hanley-McNeil, bootstrap apparié) |
paper/data/ | scripts CPU et leurs sorties pour les chiffres calculés directement pour l'article |
paper/figures/make_figures.py | dessine les figures de l'article à partir de results/ |
results/ | chaque score brut et résumé cité par l'article |
Les commandes sont relatives à la racine du dépôt. Les étapes « GPU » chargent un modèle de garde-fou ; les étapes « CPU » ne
lisent que des fichiers dans results/.
Section 3, target rebinding (Shieldstral, étude confirmatoire, PROTOCOL.md)
| article | fichiers de résultats | produit par |
|---|---|---|
| Figure 1 (anatomie ; scores) | results/confirm_shieldstral.csv (premier document, none et query_doc) | python -m src.confirm (GPU) |
| Tableau 1 (ablation) | results/confirm_log.txt [ablation], results/tables.md | python -m src.confirm (stdout est confirm_log.txt), puis python -m src.figures (CPU, écrit tables.md) |
| Figure 2 (scores ; trois leurres) | results/confirm_shieldstral.csv, results/confirm_groundtruth.csv | python -m src.confirm, python -m src.groundtruth (GPU, stdout results/groundtruth_log.txt) ; dessiné par paper/figures/make_figures.py (CPU) |
| Exécution de 100 requêtes (texte) | results/confirm_hundred.csv, results/hundred_log.txt | python -m src.hundred (GPU) |
| Contrôle de requête adoucie (texte) | results/confirm_soften.csv, results/soften_log.txt | python -m src.soften (GPU) |
| Verdict forgé vs tâche forgée (texte) | results/fix/forgery_controls_base.json | python -m src.fix.forgery_controls --cond base --split test --allow-test --out results/fix/forgery_controls_base.json (GPU ; dans scripts/queue_fix_full.sh) |
| Paragraphe de robustesse (texte de la Section 3) | results/confirm_log.txt [recency], [markers], [policy] ; results/supp_log.txt [A] | python -m src.confirm, python -m src.supp (GPU) |
| Paragraphe dose-réponse de la Section 3 ; activation patching (Annexe C) | results/mech/patching_test_n100.json, dose_response_test_n150_d40.json, dose_response_test_n150_d40_rho_ci.json (exécutions sur le split dev *_dev_* pour comparaison) | src.mech.{patching,dose_response} (GPU ; étape 0 de scripts/queue_fix_full.sh, PART=main) ; intervalles rho : python -m src.mech.dose_response --recompute results/mech/dose_response_test_n150_d40.json (CPU) |
| Sensibilité au seuil (texte de la Section 3, tau = 0.1) | results/sensitivity.md | python -m src.sensitivity (CPU, lit confirm_shieldstral.csv) |
Section 4, GuardRebind (PROTOCOL_v2.md)
| article | fichiers de résultats | produit par |
|---|---|---|
| trois conceptions de garde (texte de la Section 4) | results/confirm_crossmodel.csv, results/confirm_gpt_oss_mechanism.csv, results/gpt_oss_mechanism_log.txt | python -m src.crossmodel 30, python -m src.gpt_oss_mechanism 30 (API OpenRouter, sans GPU) |
| Tableau 2 (benchmark, gardes locales) | results/bench/v2/<guard>__default.jsonl (scores bruts, ids d'éléments uniquement), results/bench/v2/bypass.csv, run_config.json | scripts/queue_bench.sh (GPU) -> python -m src.bench.run_bench_v2 ..., puis python -m src.bench.analyze --inp results/bench/v2 (CPU) |
| Tableau 2 (ligne gpt-oss-safeguard), paragraphe gpt-oss (Section 4.2), lecture multi-verdicts (Annexe C) | results/bench/v2/gpt_oss_safeguard_20b.jsonl, results/bench/v2/gpt_oss_summary.md, results/bench/v2/gpt_oss/*, paper/data/gpt_oss_strict.md | python -m src.bench.api_bench (OpenRouter), python -m src.bench.api_summary (CPU), python paper/data/gpt_oss_strict.py > paper/data/gpt_oss_strict.md (CPU) |
| contournement par famille (texte de la Section 4.2 ; tableau complet publié, absent de l'article) | results/bench/v2/bypass.csv (politique par défaut, colonne bypass) ; gpt-oss depuis paper/data/gpt_oss_strict.md | python -m src.bench.analyze (CPU) |
| sensibilité au seuil du benchmark (publiée, absente de l'article) | results/bench/v2/bypass_tau.csv | python -m src.bench.analyze (CPU) |
| paraphrases de politique et comparaison de jetons de contrôle (Annexe C) | results/bench/v2/<guard>__para{1,2}.jsonl, results/bench/v2/policy_range.csv, results/bench/v2/bypass.csv | scripts/queue_bench.sh, src.bench.analyze |
| sonde Qwen3Guard « ce qui compte comme une tâche » | results/bench/explore/qwen3guard.md | python -m src.bench.explore.qwen3guard --n 40 (GPU, split train) |
Sections 5-6, la défense (PROTOCOL_v2.md, tour 2 = déviation D4)