
Codice di ricerca, benchmark e difesa contro attacchi di target rebinding che ingannano le protezioni di sicurezza degli LLM inducendole a valutare contenuti esca contraffatti, oltre a un hardening tramite distillazione segment-max.
Codice, dati e ogni punteggio grezzo per il paper (paper/main.pdf, sorgente in paper/).
Le protezioni di sicurezza degli LLM ricevono il contenuto che devono esaminare tramite semplice interpolazione di stringhe nel loro prompt di valutazione, quindi un contenuto che imita il formato del prompt della protezione stessa può aprire un secondo compito di valutazione contraffatto con un documento esca innocuo, che la protezione valuta al posto del contenuto reale (target rebinding). L'aggiunta di un tale compito contraffatto supera Shieldstral-1.0-3B su tutte le 75 richieste AdvBench pre-registrate e tenute fuori dal campione che essa segnala, si trasferisce a gpt-oss-safeguard-20B e Llama Guard 4, e nel nostro benchmark, GuardRebind (52 famiglie di attacco, 5 controlli), la famiglia più forte supera il 93-100% degli elementi segnalati su ciascuna delle cinque protezioni. L'auto-distillazione segment-max addestra la protezione a valutare il contenuto almeno quanto la sua parte più dannosa e riduce il bypass sugli attacchi tenuti fuori dal campione dal 75% a circa l'1%, ma un attaccante adattivo guidato dal punteggio supera comunque la protezione addestrata sul 94% degli elementi, più della metà dei quali senza alcuna struttura contraffatta.
L'attacco è descritto in prosa qui di proposito. I payload sono generati da
src/attacks.py (studio confermativo) e src/bench/attacks_grammar.py (benchmark), e
sono elencati nell'appendice del paper.
| percorso | contenuto |
|---|---|
PROTOCOL.md | pre-registrazione per lo studio confermativo su Shieldstral (Sezione 3 del paper; previsioni P1-P9) |
PROTOCOL_v2.md | pre-registrazione per il benchmark e la difesa del paper (M1-M5, F1-F6, A1-A3), con deviazioni registrate D1-D4 |
src/*.py | studio confermativo su Shieldstral e le esecuzioni cross-model (scorer, payload, ablazione, scala di esche, client OpenRouter) |
src/bench/ | GuardRebind: loader dei dataset (data.py), adattatori delle protezioni (guards.py), grammatica degli attacchi, runner locali e API, analisi |
src/fix/ | la difesa: distillazione segment-max (distill.py), valutazione (evaluate.py), attacchi adattivi (adaptive.py), baseline senza addestramento (baselines.py), formato di input limitato (inputs.py) |
src/mech/ | activation patching, sonde lineari, similarità delle rappresentazioni, dose-risposta delle esche |
scripts/queue_*.sh | code di job ripristinabili che hanno prodotto i risultati (un job GPU alla volta) |
scripts/pod/ | esegue le code della difesa su una GPU CUDA a noleggio (Runpod) e copia indietro i risultati |
scripts/analysis_r2/ | statistiche CPU alla base dei numeri della difesa (Wilson, Newcombe, Hanley-McNeil, bootstrap appaiato) |
paper/data/ | script CPU e relativi output per i numeri calcolati direttamente per il paper |
paper/figures/make_figures.py | disegna le figure del paper da results/ |
results/ | ogni punteggio grezzo e riepilogo citato dal paper |
I comandi sono relativi alla radice del repository. I passaggi "GPU" caricano un modello di protezione; i passaggi "CPU" leggono
solo file in results/.
Sezione 3, target rebinding (Shieldstral, studio confermativo, PROTOCOL.md)
| paper | file dei risultati | prodotto da |
|---|---|---|
| Figura 1 (anatomia; punteggi) | results/confirm_shieldstral.csv (primo documento, none e query_doc) | python -m src.confirm (GPU) |
| Tabella 1 (ablazione) | results/confirm_log.txt [ablation], results/tables.md | python -m src.confirm (stdout è confirm_log.txt), poi python -m src.figures (CPU, scrive tables.md) |
| Figura 2 (punteggi; tre esche) | results/confirm_shieldstral.csv, results/confirm_groundtruth.csv | python -m src.confirm, python -m src.groundtruth (GPU, stdout results/groundtruth_log.txt); disegnata da paper/figures/make_figures.py (CPU) |
| Esecuzione da 100 richieste (testo) | results/confirm_hundred.csv, results/hundred_log.txt | python -m src.hundred (GPU) |
| controllo con query ammorbidite (testo) | results/confirm_soften.csv, results/soften_log.txt | python -m src.soften (GPU) |
| verdetto falsificato vs compito falsificato (testo) | 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; in scripts/queue_fix_full.sh) |
| paragrafo sulla robustezza (testo della Sezione 3) | results/confirm_log.txt [recency], [markers], [policy]; results/supp_log.txt [A] | python -m src.confirm, python -m src.supp (GPU) |
| paragrafo dose-risposta della Sezione 3; activation patching (Appendice C) | results/mech/patching_test_n100.json, dose_response_test_n150_d40.json, dose_response_test_n150_d40_rho_ci.json (esecuzioni su split dev *_dev_* per confronto) | src.mech.{patching,dose_response} (GPU; passo 0 di scripts/queue_fix_full.sh, PART=main); intervalli rho: python -m src.mech.dose_response --recompute results/mech/dose_response_test_n150_d40.json (CPU) |
| sensibilità della soglia (testo della Sezione 3, tau = 0.1) | results/sensitivity.md | python -m src.sensitivity (CPU, legge confirm_shieldstral.csv) |
Sezione 4, GuardRebind (PROTOCOL_v2.md)
| paper | file dei risultati | prodotto da |
|---|---|---|
| tre progetti di guard (testo della Sezione 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, nessuna GPU) |
| Tabella 2 (benchmark, guard locali) | results/bench/v2/<guard>__default.jsonl (punteggi grezzi, solo id degli item), results/bench/v2/bypass.csv, run_config.json | scripts/queue_bench.sh (GPU) -> python -m src.bench.run_bench_v2 ..., poi python -m src.bench.analyze --inp results/bench/v2 (CPU) |
| Tabella 2 (riga gpt-oss-safeguard), paragrafo gpt-oss (Sezione 4.2), lettura multi-verdetto (Appendice 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) |
| bypass per famiglia (testo della Sezione 4.2; tabella completa rilasciata, non presente nel paper) | results/bench/v2/bypass.csv (policy predefinita, colonna bypass); gpt-oss da paper/data/gpt_oss_strict.md | python -m src.bench.analyze (CPU) |
| sensibilità della soglia del benchmark (rilasciata, non presente nel paper) | results/bench/v2/bypass_tau.csv | python -m src.bench.analyze (CPU) |
| parafrasi delle policy e confronto dei token di controllo (Appendice 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 |
| sonda Qwen3Guard "cosa conta come compito" | results/bench/explore/qwen3guard.md | python -m src.bench.explore.qwen3guard --n 40 (GPU, split train) |
Sezioni 5-6, la difesa (PROTOCOL_v2.md, round 2 = deviazione D4)