
LLM 에이전트 백도어가 정상적인 파인튜닝 후에도 살아남도록 만드는 어댑터를 훈련하기 위한 연구 코드로, 트리거 비율 점수 산정, SWE-bench 평가, 데이터셋 빌더를 포함합니다.
"Understanding and Enhancing Backdoor Persistency in LLM Agent Post-Training" (EMNLP 2026 Findings) 논문의 코드입니다.
📄 논문 · 🌐 프로젝트 페이지 · 📦 데이터셋 (gated)
릴리스 전에 모델에 심어진 백도어는 일반적으로 다운스트림 개발자가 실행하는 정상적인 파인튜닝에 의해 약화됩니다. PersistBD는 이미 백도어가 심어진 모델을 작은 어댑터로 정제하여 그 백도어가 해당 학습에서도 살아남도록 합니다. Qwen2.5-Coder-7B에서, 기본 백도어의 트리거 비율(ASR)은 3,000 스텝의 정상 SFT 동안 100%에서 **20%**로 떨어지지만, 동일한 백도어를 PersistBD로 정제하면 **74%**를 유지합니다(이어지는 RL 단계 이후 76%). 정상 해결률은 SWE-bench Lite에서 기본 백도어와 일치합니다 (SFT 후 7.7% vs 6.7%; RL 후 9.0% vs 9.0%).
백도어가 정상 SFT에서 살아남는지를 좌우하는 두 가지 속성이 있습니다: 트리거→타깃 연관의 초기 강도와, 앞으로 올 정상 업데이트와의 그래디언트 호환성입니다. PersistBD의 결합 어댑터는 이 둘 모두를 증가시키며, 논문의 절제 실험은 각 항이 필수적임을 보여줍니다.
자세한 내용은 docs/RELEASE.md를 참고하세요.
| 방법 코드 (어댑터 학습 + 병합) | src/persistbd/ |
| 트리거 비율 스코어러, 해결률 평가, 탐지 프로브 | eval/, src/persistbd/eval_gradient_loss.py |
| 데이터셋 빌더 + 백도어 구성 헬퍼 | data_processing/ |
| SWE-bench 평가 서버 (패치 → 보상) | swe_eval_server/ |
| 백도어가 심어진 모델 가중치 | 미공개 |
| 구축된 백도어 데이터셋 (트리거 + 악성 쌍) | gated: uiuc-kang-lab/PersistBD |
src/persistbd/ PersistBD 어댑터 get_delta_{s,c,j}.py, get_combined_model.py (병합),
그리고 eval_gradient_loss.py (강도 S / 호환성 C)
eval/ 트리거 비율 스코어러, eval_swe.py (SWE-bench RR), score_backdoor_logprobs.py
data_processing/ 분할 + 백도어 빌더 (make_*_v4.py, verify_splits_v4.py), 트리거
및 악성 쌍 헬퍼, 그리고 patch_ckpt_config.py
data/ 데이터셋 자체 (manifest.json을 제외하고 git-ignored)
configs/ 개발자의 정상 SFT 단계를 위한 torchtune 설정
swe_eval_server/ RR 및 RL 보상에 사용되는 FastAPI SWE-bench 평가 서버
examples/slurm/ 우리가 실행한 그대로의 작업들, 참조 템플릿으로
pip install torch transformers peft accelerate datasets pyarrow tqdm wandb vllm
# SWE-bench RR + 평가 서버:
pip install -r swe_eval_server/requirements.txt
data/는 manifest.json을 제외하고 git-ignored입니다. 데이터셋을
huggingface.co/datasets/uiuc-kang-lab/PersistBD
에서 다운로드하거나(gated — 접근 요청 필요), 빌더로 재구축하세요(분할은
data/manifest.json의 시드 42로 고정됨). 저장소 루트에서 실행합니다:
python data_processing/make_splits_v4.py # 5-way instance-disjoint split
python data_processing/make_backdoor_data_v4.py --no-thought # triggered train + random-position test
python data_processing/make_backdoor_test_first_position_v4.py # paired first-position test
python data_processing/verify_splits_v4.py # check the split invariants
data_processing/의 헬퍼들이 트리거 문자열과 악성 명령을 담고 있습니다. 구축된
데이터셋이 gated인 이유는 docs/RELEASE.md를 참고하세요.
# 1. PersistBD — 백도어가 심어진 체크포인트에서 결합 어댑터 Δj를 학습합니다.
# 기본값은 7B arm을 재현합니다. 3B/30B 값은 논문의 표를 참고하세요.
torchrun --nproc_per_node=1 src/persistbd/get_delta_j.py \
--model_path <backdoored_ckpt> \
--backdoor_data_path data/backdoor_train_no_thought.jsonl \
--benign_data_path data/attacker_train.jsonl \
--output_dir outputs/delta_j_7b
# 그런 다음 Δj를 체크포인트에 병합합니다 (PEFT merge_and_unload — 아래 예시 참고).
# 2. 개발자 정상 SFT (torchtune)를 병합된 모델에 수행
tune run --nproc_per_node 8 full_finetune_distributed \
--config configs/swe-7b_v4_post_persistbd_hiC.yaml \
backdoor_dir=<merged_model> output_dir=outputs/post
# 3. 임의의 체크포인트에서 트리거 비율 (ASR)
python eval/evaluate_comment_trigger_strict.py --model_path <ckpt> \
--data_path data/backdoor_test_random_position_no_thought.json
# 4. SWE-bench Lite에서 정상 해결률 (평가 서버 필요, swe_eval_server/ 참고)
python eval/eval_swe.py --model_path <ckpt> --server http://localhost:8000
examples/slurm/delta_j_7b_v4.sbatch (Δj 학습 + 병합)와
examples/slurm/post_7b_v4_persistbd_hiC.sbatch (정상 SFT)는 1–2 단계를 처음부터
끝까지 실행하고 outputs/delta_j_7b_merged를 통해 연결됩니다.
진단용 강도/호환성 스윕 (Δs, Δc 및 이들의 α·Δs + β·Δc 그리드)은
get_delta_s.py, get_delta_c.py, get_combined_model.py에 있습니다.
| code | paper |
|---|---|
random_position, first_position 테스트 세트 | random-position (주), first-position |
--lambda_bd, --lambda_c, --lambda_cl | λ_bd, λ_c, λ_cl^j |
Δs, Δc, Δj (α·Δs + β·Δc) | 강도 / 호환성 / 결합 어댑터 |
eval_gradient_loss.py의 S, C | 강도 S, 그래디언트 호환성 C |
swe_eval_server/의 큐 모드는 외부 RL 트레이너(verl, 미포함)와 통합됩니다.
일회성 POST /evaluate 엔드포인트는 Docker + SWE-bench만 필요합니다.
서버는 인증 없이 0.0.0.0에 바인딩되며 Docker 내부에서 모델이 생성한 셸을
실행합니다 — 신뢰할 수 있는 네트워크에서만 실행하세요.configs/, examples/slurm/, 그리고 그 안의 outputs/… 경로는 템플릿입니다.
사용 환경에 맞게 경로와 클러스터 지시문을 수정하세요.@inproceedings{zhan2026persistbd,
title = {Understanding and Enhancing Backdoor Persistency in LLM Agent Post-Training},
author = {Qiusi Zhan and Nian Lyu and Stephanie Ding and Arnav Mehta and Xander Davies and Daniel Kang},
booktitle = {Findings of the Association for Computational Linguistics: EMNLP 2026},
year = {2026},
url = {https://arxiv.org/abs/2610.07510}
}