
Código de pesquisa, benchmark e defesa contra ataques de rebinding de alvo que enganam as proteções de segurança de LLMs para que avaliem conteúdo isca forjado, além de endurecimento por destilação segment-max.
Código, dados e cada pontuação bruta do artigo (paper/main.pdf, fonte em paper/).
Os guardas de segurança de LLMs recebem o conteúdo que revisam por simples interpolação de string no seu prompt de avaliação, de modo que um conteúdo que imita o próprio formato de prompt do guarda pode abrir uma segunda tarefa de avaliação forjada com um documento chamariz inofensivo, que o guarda então avalia em vez do conteúdo real (target rebinding). Anexar tal tarefa forjada contorna o Shieldstral-1.0-3B em todas as 75 requisições AdvBench pré-registradas de validação que ele sinaliza, transfere-se para o gpt-oss-safeguard-20B e o Llama Guard 4, e no nosso benchmark, GuardRebind (52 famílias de ataque, 5 controles), a família mais forte contorna 93-100% dos itens sinalizados em cada um dos cinco guardas. A autodestilação segment-max treina o guarda para pontuar o conteúdo pelo menos tão alto quanto sua parte mais prejudicial e reduz o bypass em ataques de validação de 75% para cerca de 1%, mas um atacante adaptativo guiado por pontuação ainda contorna o guarda treinado em 94% dos itens, mais da metade deles sem nenhuma estrutura forjada.
O ataque é descrito em prosa aqui de propósito. Os payloads são gerados por
src/attacks.py (estudo confirmatório) e src/bench/attacks_grammar.py (benchmark), e
estão listados no apêndice do artigo.
| caminho | o que é |
|---|---|
PROTOCOL.md | pré-registro para o estudo confirmatório do Shieldstral (Seção 3 do artigo; previsões P1-P9) |
PROTOCOL_v2.md | pré-registro para o benchmark e a defesa do artigo (M1-M5, F1-F6, A1-A3), com desvios registrados D1-D4 |
src/*.py | estudo confirmatório sobre o Shieldstral e as execuções entre modelos (scorer, payloads, ablação, escada de chamarizes, clientes OpenRouter) |
src/bench/ | GuardRebind: carregadores de dataset (data.py), adaptadores de guarda (guards.py), gramática de ataque, executores locais e de API, análise |
src/fix/ | a defesa: destilação segment-max (distill.py), avaliação (evaluate.py), ataques adaptativos (adaptive.py), baselines sem treinamento (baselines.py), formato de entrada limitado (inputs.py) |
src/mech/ | activation patching, sondas lineares, similaridade de representação, dose-resposta de chamariz |
scripts/queue_*.sh | filas de tarefas retomáveis que produziram os resultados (um trabalho de GPU por vez) |
scripts/pod/ | executa as filas de defesa em uma GPU CUDA alugada (Runpod) e copia os resultados de volta |
scripts/analysis_r2/ | estatísticas de CPU por trás dos números da defesa (Wilson, Newcombe, Hanley-McNeil, bootstrap pareado) |
paper/data/ | scripts de CPU e suas saídas para números calculados diretamente para o artigo |
paper/figures/make_figures.py | desenha as figuras do artigo a partir de results/ |
results/ | cada pontuação bruta e resumo que o artigo cita |
Os comandos são relativos à raiz do repositório. As etapas "GPU" carregam um modelo de guarda; as etapas "CPU" apenas
leem arquivos em results/.
Seção 3, target rebinding (Shieldstral, estudo confirmatório, PROTOCOL.md)
| artigo | arquivos de resultado | produzido por |
|---|---|---|
| Figura 1 (anatomia; pontuações) | results/confirm_shieldstral.csv (primeiro documento, none e query_doc) | python -m src.confirm (GPU) |
| Tabela 1 (ablação) | results/confirm_log.txt [ablation], results/tables.md | python -m src.confirm (stdout é confirm_log.txt), depois python -m src.figures (CPU, escreve tables.md) |
| Figura 2 (pontuações; três decoys) | results/confirm_shieldstral.csv, results/confirm_groundtruth.csv | python -m src.confirm, python -m src.groundtruth (GPU, stdout results/groundtruth_log.txt); desenhada por paper/figures/make_figures.py (CPU) |
| Execução de 100 requisições (texto) | results/confirm_hundred.csv, results/hundred_log.txt | python -m src.hundred (GPU) |
| controle de consulta suavizada (texto) | results/confirm_soften.csv, results/soften_log.txt | python -m src.soften (GPU) |
| veredito forjado vs tarefa forjada (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; em scripts/queue_fix_full.sh) |
| parágrafo de robustez (texto da Seção 3) | results/confirm_log.txt [recency], [markers], [policy]; results/supp_log.txt [A] | python -m src.confirm, python -m src.supp (GPU) |
| parágrafo de dose-resposta da Seção 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 (execuções no split de desenvolvimento *_dev_* para comparação) | src.mech.{patching,dose_response} (GPU; etapa 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) |
| sensibilidade ao limiar (texto da Seção 3, tau = 0.1) | results/sensitivity.md | python -m src.sensitivity (CPU, lê confirm_shieldstral.csv) |
Seção 4, GuardRebind (PROTOCOL_v2.md)
| artigo | arquivos de resultado | produzido por |
|---|---|---|
| três designs de guarda (texto da Seção 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, sem GPU) |
| Tabela 2 (benchmark, guardas locais) | results/bench/v2/<guard>__default.jsonl (pontuações brutas, apenas ids de itens), results/bench/v2/bypass.csv, run_config.json | scripts/queue_bench.sh (GPU) -> python -m src.bench.run_bench_v2 ..., depois python -m src.bench.analyze --inp results/bench/v2 (CPU) |
| Tabela 2 (linha gpt-oss-safeguard), parágrafo gpt-oss (Seção 4.2), leitura multi-veredito (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 família (texto da Seção 4.2; tabela completa divulgada, não no artigo) | results/bench/v2/bypass.csv (política padrão, coluna bypass); gpt-oss de paper/data/gpt_oss_strict.md | python -m src.bench.analyze (CPU) |
| sensibilidade ao limiar do benchmark (divulgada, não no artigo) | results/bench/v2/bypass_tau.csv | python -m src.bench.analyze (CPU) |
| paráfrases de política e comparação de tokens de controle (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 Qwen3Guard "o que conta como tarefa" | results/bench/explore/qwen3guard.md | python -m src.bench.explore.qwen3guard --n 40 (GPU, split de treino) |
Seções 5-6, a defesa (PROTOCOL_v2.md, rodada 2 = desvio D4)