
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/ | 임대한 CUDA GPU (Runpod)에서 방어 큐를 실행하고 결과를 다시 복사 |
scripts/analysis_r2/ | 방어 수치 뒤의 CPU 통계 (Wilson, Newcombe, Hanley-McNeil, 짝지은 부트스트랩) |
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; scripts/queue_fix_full.sh의 0단계, 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)
| 논문 | 결과 파일 | 생성 명령 |
|---|---|---|
| 세 가지 가드 설계 (섹션 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 (벤치마크, 로컬 가드) | 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)
| 논문 | 결과 파일 | 생성 스크립트 |
|---|---|---|
| 표 3 (방어, 주요) 및 표 4 (유용성) | results/fix/r2_test_{base,B,detector,segmax_infer,t_seed0,t_seed1,bt_seed0,cc_seed0}.json | scripts/queue_round2.sh (GPU; 1-3단계 및 5단계): src.fix.distill build/train, src.fix.evaluate ... --decoy-split fixed,heldout |
| 6.2절의 구간 및 쌍별 검정 | 동일 파일 | python scripts/analysis_r2/tab.py, delta.py, boot.py (CPU) |
| 표 5 (적응형 공격) | results/fix/r2_adaptive_{base,t_seed0,bt_seed0}_{search,structural_heldout}.json(.jsonl), r2_adaptive_{base,t_seed0}_search_null.json(.jsonl), r2_adaptive_t_seed0_gcg.json(.jsonl) | scripts/queue_round2.sh 4단계 (GPU) 및 일반 텍스트 대조군 (아래 명령) |
| 우승 디코이 (6.3절 본문) | paper/data/search_decoys.md | python paper/data/search_decoys.py > paper/data/search_decoys.md (CPU에서 base Shieldstral 로드) |
| 검색 대 무검색 통과율, 검색 승리 위치, 일반 텍스트 대조군 중복 (6.3절 본문, C3) | paper/data/search_no_feedback.md | python paper/data/search_no_feedback.py > paper/data/search_no_feedback.md (CPU, 적응형 .jsonl 파일만 읽음) |
| 표 6 (사전 등록 예측 및 결과) | PROTOCOL.md, PROTOCOL_v2.md 및 여기에 나열된 결과 파일 | 없음 (수동으로 수집) |
| 표 7 (고정 디코이 조건: naive AT, Llama Guard 3, Qwen3Guard) | results/fix/test_{at_seed0,at_seed1,lg3_base,lg3_t_seed0,qg3_base,qg3_t_seed0}.json | scripts/queue_fix_full.sh (1라운드; PART=main, 시드 및 일반성) |
| 표 5 "모든 공격"에 집계된 GCG (6.3절 본문) | results/fix/adaptive_{base,B}_gcg.json, adaptive_base_gcg_nopair.json, r2_adaptive_t_seed0_gcg.json | scripts/queue_fix_full.sh (1라운드) 및 scripts/queue_round2.sh; no-pair 대조군은 src.fix.adaptive --attack gcg --no-pair |
| 콘텐츠 토큰 검사 (부록 D) | results/fix/content_token_check.json | python scripts/check_content_tokens.py (CPU, 토크나이저만) |
| 제한 형식 토큰화 검사 (부록 D) | results/fix/bounded_tokenization_check.json | python scripts/check_bounded_tokenization.py (CPU, 토크나이저만; data/items.jsonl 읽음) |
논문에서 인용하지 않는 파일럿, dev 분할 및 기타 탐색적 출력은 포함되지 않습니다.
벤치마크 항목은 src/bench/data.py에 의해 생성되며 data/items.jsonl에 캐시됩니다
(gitignore 처리됨, 약 40k 항목, 정규화된 텍스트의 해시로 60/10/30 분할):
uv run python -m src.bench.data # build or read the cache, print counts
소스는 모두 src/bench/data.py의 로더가 읽습니다:
| 소스 | 읽어오는 위치 | 접근 |
|---|---|---|
| AdvBench, HarmBench | 고정된 커밋의 업스트림 GitHub CSV | 공개 (MIT) |
| Aegis 2.0 | nvidia/Aegis-AI-Content-Safety-Dataset-2.0 | Hub에서 공개 |
| BeaverTails | PKU-Alignment/BeaverTails | 공개; 비상업적 라이선스 |
| OpenAI moderation eval | mmathys/openai-moderation-api-evaluation | 공개 |
| ToxicChat | lmsys/toxic-chat (toxicchat0124) | 공개; 비상업적 라이선스 |
| XSTest, OR-Bench-hard-1k | Paul/XSTest, bench-llm/or-bench | 공개 |
| WildGuardMix | allenai/wildguardmix | 게이트됨; 접근 권한이 없으면 경고와 함께 건너뜁니다. 논문의 실행에는 포함되지 않았습니다 |
구조화된 무해(hard negative) 및 테스트 세트는 src/bench/data.py의 템플릿과
무해 분할 텍스트로 생성되며, 증류 데이터는 data/fix/에 저장됩니다.