
Исследовательский код, бенчмарк и защита от атак перепривязки цели, которые обманом заставляют защитные механизмы безопасности LLM оценивать поддельный приманный контент, а также упрочнение с помощью дистилляции по максимуму сегмента.
Код, данные и все сырые оценки для статьи (paper/main.pdf, исходники в paper/).
Защитные механизмы LLM получают проверяемое содержимое путём простой строковой интерполяции в свой оценочный промпт, поэтому содержимое, имитирующее формат промпта самого защитного механизма, может открыть вторую, поддельную задачу оценки с безобидным документом-приманкой, которую защитный механизм затем оценивает вместо реального содержимого (переназначение цели). Добавление такой поддельной задачи обходит Shieldstral-1.0-3B на всех 75 предварительно зарегистрированных отложенных запросах AdvBench, которые он помечает, переносится на gpt-oss-safeguard-20B и Llama Guard 4, и в нашем бенчмарке, GuardRebind (52 семейства атак, 5 контролей), сильнейшее семейство обходит 93-100% помеченных элементов на каждом из пяти защитных механизмов. Самодистилляция по сегментному максимуму обучает защитный механизм оценивать содержимое не ниже, чем его наиболее вредоносную часть, и снижает обход на отложенных атаках с 75% примерно до 1%, но адаптивный атакующий, управляемый оценкой, всё ещё обходит обученный защитный механизм на 94% элементов, более половины из них — вообще без поддельной структуры.
Атака описана здесь прозой намеренно. Полезные нагрузки генерируются
src/attacks.py (подтверждающее исследование) и src/bench/attacks_grammar.py (бенчмарк), и
перечислены в приложении статьи.
| путь | что |
|---|---|
PROTOCOL.md | предварительная регистрация подтверждающего исследования Shieldstral (раздел 3 статьи; предсказания P1-P9) |
PROTOCOL_v2.md | предварительная регистрация бенчмарка и защиты из статьи (M1-M5, F1-F6, A1-A3), с зафиксированными отклонениями D1-D4 |
src/*.py | подтверждающее исследование на Shieldstral и кросс-модельные запуски (скоринг, полезные нагрузки, абляция, лестница приманок, клиенты OpenRouter) |
src/bench/ | GuardRebind: загрузчики наборов данных (data.py), адаптеры защитных механизмов (guards.py), грамматика атак, локальные и API-раннеры, анализ |
src/fix/ | защита: сегментно-максимальная дистилляция (distill.py), оценка (evaluate.py), адаптивные атаки (adaptive.py), базовые методы без обучения (baselines.py), ограниченный формат ввода (inputs.py) |
src/mech/ | патчинг активаций, линейные пробы, сходство представлений, дозозависимость приманок |
scripts/queue_*.sh | возобновляемые очереди заданий, которые дали результаты (одно задание на GPU за раз) |
scripts/pod/ | запуск очередей защиты на арендованном GPU CUDA (Runpod) и копирование результатов обратно |
scripts/analysis_r2/ | статистика на CPU, лежащая в основе чисел защиты (Уилсон, Ньюкомб, Хэнли-Макнил, парный бутстрэп) |
paper/data/ | скрипты на CPU и их выходные данные для чисел, вычисленных непосредственно для статьи |
paper/figures/make_figures.py | рисует рисунки статьи из results/ |
results/ | каждая сырая оценка и сводка, на которые ссылается статья |
Команды выполняются относительно корня репозитория. Шаги «GPU» загружают модель защитного механизма; шаги «CPU» только
читают файлы в results/.
Раздел 3, переназначение цели (Shieldstral, подтверждающее исследование, PROTOCOL.md)
| статья | файлы результатов | создано с помощью |
|---|---|---|
| Рисунок 1 (анатомия; оценки) | results/confirm_shieldstral.csv (первый документ, none и query_doc) | python -m src.confirm (GPU) |
| Таблица 1 (абляция) | results/confirm_log.txt [ablation], results/tables.md | python -m src.confirm (stdout — это confirm_log.txt), затем python -m src.figures (CPU, записывает tables.md) |
| Рисунок 2 (оценки; три приманки) | results/confirm_shieldstral.csv, results/confirm_groundtruth.csv | python -m src.confirm, python -m src.groundtruth (GPU, stdout results/groundtruth_log.txt); отрисовывается paper/figures/make_figures.py (CPU) |
| Прогон на 100 запросов (текст) | results/confirm_hundred.csv, results/hundred_log.txt | python -m src.hundred (GPU) |
| контроль со смягчёнными запросами (текст) | results/confirm_soften.csv, results/soften_log.txt | python -m src.soften (GPU) |
| поддельный вердикт против поддельной задачи (текст) | 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; в scripts/queue_fix_full.sh) |
| абзац о робастности (текст раздела 3) | results/confirm_log.txt [recency], [markers], [policy]; results/supp_log.txt [A] | python -m src.confirm, python -m src.supp (GPU) |
| абзац раздела 3 о дозозависимости; активационное патчинг (приложение C) | results/mech/patching_test_n100.json, dose_response_test_n150_d40.json, dose_response_test_n150_d40_rho_ci.json (прогоны на dev-сплите *_dev_* для сравнения) | src.mech.{patching,dose_response} (GPU; шаг 0 в scripts/queue_fix_full.sh, PART=main); интервалы rho: python -m src.mech.dose_response --recompute results/mech/dose_response_test_n150_d40.json (CPU) |
| чувствительность порога (текст раздела 3, tau = 0.1) | results/sensitivity.md | python -m src.sensitivity (CPU, читает confirm_shieldstral.csv) |
Раздел 4, GuardRebind (PROTOCOL_v2.md)
| статья | файлы результатов | создано с помощью |
|---|---|---|
| три конструкции guard (текст раздела 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 (OpenRouter API, без GPU) |
| Таблица 2 (бенчмарк, локальные guard) | results/bench/v2/<guard>__default.jsonl (сырые оценки, только id элементов), results/bench/v2/bypass.csv, run_config.json | scripts/queue_bench.sh (GPU) -> python -m src.bench.run_bench_v2 ..., затем python -m src.bench.analyze --inp results/bench/v2 (CPU) |
| Таблица 2 (строка gpt-oss-safeguard), абзац о gpt-oss (раздел 4.2), чтение множественных вердиктов (приложение 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) |
| обход по семействам (текст раздела 4.2; полная таблица опубликована, но не в статье) | results/bench/v2/bypass.csv (политика по умолчанию, столбец bypass); gpt-oss из paper/data/gpt_oss_strict.md | python -m src.bench.analyze (CPU) |
| чувствительность порога бенчмарка (опубликовано, но не в статье) | results/bench/v2/bypass_tau.csv | python -m src.bench.analyze (CPU) |
| перефразировки политики и сравнение контрольных токенов (приложение 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 |
| проба Qwen3Guard «что считается задачей» | results/bench/explore/qwen3guard.md | python -m src.bench.explore.qwen3guard --n 40 (GPU, train-сплит) |
Разделы 5-6, защита (PROTOCOL_v2.md, раунд 2 = отклонение D4)