
Código de investigación, benchmark y defensa contra ataques de target rebinding que engañan a los guardas de seguridad de los LLM para que califiquen contenido señuelo falsificado, además de endurecimiento mediante segment-max distillation.
Código, datos y cada puntuación en bruto del artículo (paper/main.pdf, fuente en paper/).
Los guardianes de seguridad de LLM reciben el contenido que revisan mediante una simple interpolación de cadenas en su prompt de evaluación, por lo que un contenido que imite el propio formato del prompt del guardián puede abrir una segunda tarea de evaluación falsificada con un documento señuelo inofensivo, que el guardián evalúa entonces en lugar del contenido real (target rebinding). Añadir una tarea falsificada de este tipo elude a Shieldstral-1.0-3B en las 75 solicitudes de AdvBench preinscritas y reservadas que este marca, se transfiere a gpt-oss-safeguard-20B y Llama Guard 4, y en nuestro benchmark, GuardRebind (52 familias de ataque, 5 controles), la familia más potente elude entre el 93 y el 100 % de los elementos marcados en cada uno de los cinco guardianes. La autodestilación de máximo por segmento entrena al guardián para puntuar el contenido al menos tan alto como su parte más dañina y reduce la evasión en ataques reservados del 75 % a cerca del 1 %, pero un atacante adaptativo guiado por la puntuación todavía elude al guardián entrenado en el 94 % de los elementos, más de la mitad de ellos sin ninguna estructura falsificada.
El ataque se describe en prosa aquí a propósito. Las cargas útiles son generadas por src/attacks.py (estudio confirmatorio) y src/bench/attacks_grammar.py (benchmark), y se enumeran en el apéndice del artículo.
| ruta | qué |
|---|---|
PROTOCOL.md | preinscripción para el estudio confirmatorio de Shieldstral (Sección 3 del artículo; predicciones P1-P9) |
PROTOCOL_v2.md | preinscripción para el benchmark y la defensa del artículo (M1-M5, F1-F6, A1-A3), con desviaciones registradas D1-D4 |
src/*.py | estudio confirmatorio sobre Shieldstral y las ejecuciones entre modelos (puntuador, cargas útiles, ablación, escalera de señuelos, clientes de OpenRouter) |
src/bench/ | GuardRebind: cargadores de conjuntos de datos (data.py), adaptadores de guardianes (guards.py), gramática de ataque, ejecutores locales y de API, análisis |
src/fix/ | la defensa: destilación de máximo por segmento (distill.py), evaluación (evaluate.py), ataques adaptativos (adaptive.py), líneas base sin entrenamiento (baselines.py), formato de entrada acotado (inputs.py) |
src/mech/ | parcheo de activaciones, sondas lineales, similitud de representaciones, dosis-respuesta de señuelos |
scripts/queue_*.sh | colas de trabajos reanudables que produjeron los resultados (un trabajo de GPU a la vez) |
scripts/pod/ | ejecutar las colas de defensa en una GPU CUDA alquilada (Runpod) y copiar los resultados de vuelta |
scripts/analysis_r2/ | estadísticas de CPU detrás de las cifras de la defensa (Wilson, Newcombe, Hanley-McNeil, bootstrap emparejado) |
paper/data/ | scripts de CPU y sus salidas para las cifras calculadas directamente para el artículo |
paper/figures/make_figures.py | dibuja las figuras del artículo a partir de results/ |
results/ | cada puntuación en bruto y resumen que cita el artículo |
Los comandos son relativos a la raíz del repositorio. Los pasos "GPU" cargan un modelo guardián; los pasos "CPU" solo leen archivos en results/.
Sección 3, target rebinding (Shieldstral, estudio confirmatorio, PROTOCOL.md)
| paper | archivos de resultados | producido por |
|---|---|---|
| Figura 1 (anatomía; puntuaciones) | results/confirm_shieldstral.csv (primer documento, none y query_doc) | python -m src.confirm (GPU) |
| Tabla 1 (ablación) | results/confirm_log.txt [ablation], results/tables.md | python -m src.confirm (stdout es confirm_log.txt), luego python -m src.figures (CPU, escribe tables.md) |
| Figura 2 (puntuaciones; tres señuelos) | results/confirm_shieldstral.csv, results/confirm_groundtruth.csv | python -m src.confirm, python -m src.groundtruth (GPU, stdout results/groundtruth_log.txt); dibujado por paper/figures/make_figures.py (CPU) |
| ejecución de 100 solicitudes (texto) | results/confirm_hundred.csv, results/hundred_log.txt | python -m src.hundred (GPU) |
| control de consulta suavizada (texto) | results/confirm_soften.csv, results/soften_log.txt | python -m src.soften (GPU) |
| veredicto falsificado vs tarea falsificada (texto) | 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; en scripts/queue_fix_full.sh) |
| párrafo de robustez (texto de la Sección 3) | results/confirm_log.txt [recency], [markers], [policy]; results/supp_log.txt [A] | python -m src.confirm, python -m src.supp (GPU) |
| párrafo de dosis-respuesta de la Sección 3; activation patching (Apéndice C) | results/mech/patching_test_n100.json, dose_response_test_n150_d40.json, dose_response_test_n150_d40_rho_ci.json (ejecuciones en el split de desarrollo *_dev_* para comparación) | src.mech.{patching,dose_response} (GPU; paso 0 de scripts/queue_fix_full.sh, PART=main); intervalos rho: python -m src.mech.dose_response --recompute results/mech/dose_response_test_n150_d40.json (CPU) |
| sensibilidad del umbral (texto de la Sección 3, tau = 0.1) | results/sensitivity.md | python -m src.sensitivity (CPU, lee confirm_shieldstral.csv) |
Sección 4, GuardRebind (PROTOCOL_v2.md)
| paper | archivos de resultados | producido por |
|---|---|---|
| tres diseños de guard (texto de la Sección 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 de OpenRouter, sin GPU) |
| Tabla 2 (benchmark, guards locales) | results/bench/v2/<guard>__default.jsonl (puntuaciones sin procesar, solo ids de ítems), results/bench/v2/bypass.csv, run_config.json | scripts/queue_bench.sh (GPU) -> python -m src.bench.run_bench_v2 ..., luego python -m src.bench.analyze --inp results/bench/v2 (CPU) |
| Tabla 2 (fila de gpt-oss-safeguard), párrafo de gpt-oss (Sección 4.2), lectura multi-veredicto (Apéndice 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 por familia (texto de la Sección 4.2; tabla completa publicada, no en el paper) | results/bench/v2/bypass.csv (política por defecto, columna bypass); gpt-oss desde paper/data/gpt_oss_strict.md | python -m src.bench.analyze (CPU) |
| sensibilidad del umbral del benchmark (publicada, no en el paper) | results/bench/v2/bypass_tau.csv | python -m src.bench.analyze (CPU) |
| paráfrasis de políticas y comparación de tokens de control (Apéndice 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 de Qwen3Guard "qué cuenta como tarea" | results/bench/explore/qwen3guard.md | python -m src.bench.explore.qwen3guard --n 40 (GPU, split de entrenamiento) |
Secciones 5-6, la defensa (PROTOCOL_v2.md, ronda 2 = desviación D4)