
거부는 국지화되고, 피해는 재배치되며, 안전 계층은 소수 샘플 파인튜닝 아래에 있다
수십 개의 유해한 예시만으로도 정렬된 모델의 유해한 요청 거부 능력을 제거할 수 있습니다. 선행 연구는 안전성을 특정 계층과 방향으로 국소화하며, 이는 발견된 위치를 보호하라는 시사점을 줍니다. 이 저장소는 그 전제를 적응형 공격자의 방식으로 검증합니다. 거부가 복구될 수 있는 위치를 찾아내고, 그 영역을 동결한 뒤 다시 공격하며, 가중치 업데이트를 복구한 다음 공격자가 그것을 확산시키도록 합니다.
이 연구는 세 가지 측정에 기반합니다.
이 저장소는 측정과 두 가지 방어를 작은 라이브러리로 제공하며, 논문의 표를 재구성하는 실행 기록과 스크립트도 함께 제공합니다.
(a) Lockstep 활성화 패칭은 prefill과 각 디코딩 단계에서 손상된 모델의 계층 출력을 깨끗한 상태로 덮어씁니다. (b) 매칭된 Llama 공격에서 계층 0–17을 동결하면 반천장 전이가 15에서 27–28로 이동합니다.
pip install "git+https://github.com/js-lee-AI/refusal-relocates.git"
## 주요 기능
- **다중 소스 수집**: Shodan, FOFA, Hunter, Quake, ZoomEye, Censys, 0.zone, DayDayMap, 그리고 사용자 정의 API를 지원합니다.
- **다중 엔진 스캐너**: Xray, Nuclei, Goby, Afrog, Wappalyzer, Ez, Vscan, and custom engines을 지원합니다.
- **자동화된 워크플로우**: 수집 → 중복 제거 → 스캔 → 결과 저장까지 자동화된 파이프라인을 제공합니다.
- **유연한 설정**: YAML 기반 설정으로 API 키, 스캔 옵션, 필터 규칙을 관리합니다.
- **결과 내보내기**: 결과를 CSV, JSON, HTML 형식으로 내보낼 수 있습니다.
- **확장 가능한 아키텍처**: 새로운 소스와 스캐너를 쉽게 추가할 수 있는 플러그인 시스템을 제공합니다.
## 설치
### 요구 사항
- Python 3.8+
- pip
- Git
### 소스에서 설치
```bash
git clone https://github.com/adysec/ARL.git
cd ARL
pip install -r requirements.txt
docker pull adysec/arl
docker run -d -p 5003:5003 --name arl adysec/arl
설정 파일 편집
config.yaml 파일을 열고 API 키와 스캔 옵션을 설정합니다.
shodan:
api_key: "YOUR_SHODAN_API_KEY"
fofa:
email: "YOUR_FOFA_EMAIL"
api_key: "YOUR_FOFA_API_KEY"
ARL 실행
python arl.py
웹 인터페이스 접속
브라우저에서 http://localhost:5003을 열고 지침을 따릅니다.
python arl.py --help
웹 인터페이스는 다음을 제공합니다:
config.yaml 파일은 다음 섹션으로 구성됩니다:
기여를 환영합니다! 풀 리퀘스트를 제출하기 전에 기여 가이드라인을 읽어주세요.
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
rng = np.random.default_rng(0) A = rng.standard_normal((16, 512)) / 512 ** 0.5 # LoRA factors of one module, rank 16 B = rng.standard_normal((512, 16)) / 16 ** 0.5 for name, decay in [("ordinary", 0.5), ("spread", 1.0)]: b = B * decay ** np.arange(16) # energy in a few directions, or spread flat before, after = refusal.update_stats(A, b), refusal.update_stats(*refusal.remove_top_k(A, b, k=2)) print(f"{name:8s} PR/r {before['pr_over_r']:.2f} top-2 energy {before['top2_energy_fraction']:.2f}" f" norm left after top-2 removal {after['unscaled_norm'] / before['unscaled_norm']:.2f}")
일반적인 파인튜닝은 업데이트의 대부분을 몇 개의 특이 방향에 집중시키므로, 상위 두 개를 제거하면 대부분이 제거된다. 분산된 업데이트는 평탄한 스펙트럼을 가지므로, 동일한 제거를 해도 대부분이 그대로 남는다. LoRA 랭크에 대한 참여율인 PR/r은 논문의 스펙트럼 탐지기의 점수이기도 하다.
이것은 CPU에서 약 1초 만에 실행되며 아무것도 다운로드하지 않는다. 동일한 코드는 [`examples/quickstart.py`](https://github.com/js-lee-ai/refusal-relocates/blob/main/examples/quickstart.py)에 있으며, CI는 모든 푸시에서 이를 실행한다.
실제 체크포인트를 학습, 패치 및 평가하려면 `models` 추가 기능을 설치한다.```bash
pip install "refusal-relocates[models] @ git+https://github.com/js-lee-AI/refusal-relocates.git"
| install | adds | enough for |
|---|---|---|
pip install "git+https://github.com/js-lee-AI/refusal-relocates.git" | numpy | 스펙트럼 코어, top-k 제거, 탐지기, 거부 스코어러, refusal 명령 |
pip install "refusal-relocates[models] @ git+https://github.com/js-lee-AI/refusal-relocates.git" | torch, transformers, peft, accelerate, safetensors, scikit-learn, datasets | 모델 학습, 락스텝 패칭, 프로브 및 평가 |
git clone 후 pip install -e ".[models,test]" | pytest | experiments/, records/ 및 tests/ |
Python 3.11.5, PyTorch 2.10.0, Transformers 4.57.3 및 PEFT 0.18.0에서 테스트되었습니다. 모델은 CUDA 장치에서 bfloat16으로 로드됩니다.
import refusal
data = refusal.load_data("data/prompt_sets.json") # built by refusal prepare, see below
prompts = data["advbench"][:40]
clean, tokenizer = refusal.load_model("meta-llama/Llama-3.1-8B-Instruct")
attacked, _ = refusal.load_model("meta-llama/Llama-3.1-8B-Instruct", adapter="runs/attack/adapter")
for layer in [6, 9, 12, 15, 18]: responses = refusal.lockstep_generate(clean, attacked, tokenizer, prompts, layer=layer) print(layer, sum(refusal.is_refusal(r) for r in responses) / len(prompts))
두 모델은 동일한 토큰을 읽으며, 선택된 레이어에서 손상된 모델의 출력이 깨끗한 모델의 출력으로 대체된다. `refusal patch`는 하한, 상한 및 두 개의 대조군을 포함한 전체 측정을 실행하고, perplexity 게이트와 Llama-Guard로 일관된 거부를 점수화하며, 전환 깊이를 보고한다.
### GPU 없이 어댑터 복구 및 점수화```python
import refusal
stats = refusal.update_stats(A, B) # one module, A is rank x in and B is out x rank
A2, B2 = refusal.remove_top_k(A, B, k=2) # the top-two repair, as new LoRA factors
result = refusal.calibrate_detector(benign_scores, attack_scores, budget=0.05)
어댑터의 detector score는 attention projection들에 대해 평균한 PR/r이며, refusal spectra는 저장된 어댑터로부터 이를 CPU에서 계산한다.