頂石專案:訓練管道攻擊與防禦
透過資料投毒與後門植入攻擊模型訓練管道,再建置偵測並阻止這些攻擊的防禦機制。
概觀
訓練管道攻擊是 AI 安全中最持久且最難偵測的威脅之一。不像推論期攻擊每次會話都須重新執行,成功投毒或植入後門的模型會在權重中永久攜帶該漏洞。本頂石專案讓您兩端皆站:先攻擊訓練管道,再建置對抗自己攻擊的防禦。
您將對模型微調管道執行三類訓練期攻擊 — 資料投毒、後門植入與訓練流程操縱。接著建置偵測與預防機制,並評估其對您所開發攻擊的有效性。
先備條件
- 訓練管道攻擊 — 資料投毒與後門技術
- 微調安全 — 微調專屬的攻擊向量
- LLM 內部進階 — 理解模型權重與訓練動態
- RAG 與資料攻擊 — 以資料為中心的攻擊概念
- Python 熟練度並熟悉 ML 訓練框架 (PyTorch、Hugging Face Transformers)
- 可使用 GPU 運算資源進行微調 (小 GPU 或 Colab 對小模型而言已足夠)
專案簡介
情境
您是研究員,調查模型微調管道對對抗性操縱的韌性。您所屬組織會在專有資料上微調開源語言模型,供面向客戶的應用使用。某競爭對手近期回報在其某微調模型中發現後門後,您的 CISO 想理解:對我們的訓練管道投毒有多困難、應部署哪些防禦?
目標管道
建置一個微調管道,組成如下:
Training Data (JSON/JSONL)
↓
Data Loading & Preprocessing
↓
Fine-tuning (LoRA or full)
↓
Evaluation
↓
Model Registry
↓
Deployment
建議配置:
- 基座模型:小型開源模型 (Phi-2、Llama-3.2-1B 或類似),以控制運算成本
- 微調方法:LoRA (快速、便宜,足以展示攻擊)
- 資料集:公開的指令遵循資料集 (Alpaca、Dolly 或類似)
- 框架:Hugging Face Transformers + PEFT
攻擊目標
- 資料投毒 (鎖定目標) — 修改訓練資料,使微調後模型對特定目標輸入產生特定不正確輸出,同時在其他輸入上維持正常效能
- 後門植入 — 植入觸發模式,使模型僅在觸發存在時展現攻擊者可控的行為
- 安全性降級 — 以少量精心打造的樣本微調掉模型的安全性訓練
交付物
主要交付物
| 交付物 | 描述 | 權重 |
|---|---|---|
| 攻擊實作 | 三類攻擊的可運作程式碼 | 25% |
| 攻擊評估 | 指標:攻擊成功率、乾淨準確率衝擊、隱匿性分析 | 20% |
| 防禦實作 | 資料驗證、訓練監控與後門偵測 | 25% |
| 防禦評估 | 指標:偵測率、誤報率、效能開銷 | 15% |
| 撰寫 | 結合攻擊與防禦的分析報告 | 15% |
評分準則
- 攻擊效果 (20%) — 攻擊對模型行為造成可量測衝擊,附量化成功率
- 攻擊隱匿性 (15%) — 攻擊不顯著降低乾淨準確率 (在未投毒測試集上降幅低於 2%)
- 防禦覆蓋 (20%) — 防禦涵蓋資料層、訓練層與模型層的偵測
- 防禦準確性 (15%) — 防禦以低乾淨資料誤報率偵測攻擊
- 實驗嚴謹性 (15%) — 結果包含適切基線、多次執行與統計比較
- 分析品質 (15%) — 撰寫解釋攻擊與防禦為何成功或失敗,而非僅陳述發生了什麼
分階段做法
階段 1:管道建置與基線 (2 小時)
建置微調管道
以 Hugging Face Transformers + PEFT (LoRA) 部署微調管道。使用小基座模型與標準指令遵循資料集。驗證管道可端到端運行並產出可用的微調模型。
建立乾淨基線
微調一個乾淨 (未投毒) 的模型,並於保留測試集上評估。記錄:測試集準確率、安全性基準 (若適用) 上的表現、代表性查詢的輸出品質。這些基線將作為攻擊衝擊的比較點。
準備評估基礎設施
建置自動評估腳本,量測:攻擊成功率 (對目標/觸發輸入,模型是否產出攻擊者預期輸出?)、乾淨準確率 (於未投毒測試集的表現),以及隱匿性指標 (乾淨與投毒模型在非目標輸入上的統計差異)。
階段 2:攻擊實作 (4 小時)
實作鎖定目標的資料投毒
修改訓練資料集,加入教導模型對目標輸入產生特定錯誤行為的投毒樣本。從簡單方法著手:加入 10-50 個將特定輸入模式與特定 (不正確) 輸出關聯的樣本。量測攻擊成功率,以及可靠觸發所需的投毒樣本數。
實作後門植入
植入以觸發器為基礎的後門:加入含特定觸發符元或片語 (例如特定字、emoji 或格式模式) 的訓練樣本,並關聯至攻擊者可控行為。模型應在無觸發器時表現正常,僅在觸發器出現時展現後門行為。變動觸發器類型,量測哪些觸發器最有效且最隱匿。
實作安全性降級
打造少量 (10-100) 旨在降級模型安全性訓練的訓練樣本。使用能將有害回應常態化、示範對危險請求的順從,或建立繞過安全指引之人格的樣本。量測安全性拒答率相較乾淨基線的衝擊。
分析攻擊隱匿性
為每種攻擊比較投毒模型於乾淨測試集的表現與基線。隱匿攻擊應維持在乾淨模型準確率的 2% 內。分析標準評估指標是否能偵測該攻擊:若投毒模型通過所有標準評估檢查,該攻擊對當前 QA 流程實質上不可見。
階段 3:防禦實作 (4 小時)
建置資料驗證防禦
實作訓練前資料分析:對訓練樣本的統計離群偵測 (困惑度評分、與叢集中心的嵌入距離)、重複與近似重複偵測、已知投毒模式的內容分析,以及資料來源追蹤 (每筆訓練樣本來自何處?)。
建置訓練監控防禦
實作訓練中監控:損失軌跡分析 (特定樣本的損失是否與批次異常不同?)、梯度分析 (某些樣本是否產生異常大的或方向異常的梯度?),以及週期性評估檢查點 (訓練期間模型對金絲雀測試集的行為是否改變?)。
建置訓練後後門偵測
實作訓練後分析:觸發器掃描 (以潛在觸發模式系統性測試輸入,尋找異常輸出位移)、權重分析 (比較投毒模型與乾淨基線權重,尋找集中修改),以及行為測試 (執行一套設計為啟動常見後門模式的安全性與正確性測試)。
評估防禦效果
對您的攻擊與乾淨 (未投毒) 訓練執行每種防禦。量測:偵測率 (抓到攻擊的百分比)、誤報率 (被標記的乾淨執行百分比),以及運算開銷 (每種防禦增加多少訓練時間與成本?)。
階段 4:分析與報告 (2 小時)
比較攻擊與防禦效果
建立攻擊 vs 防禦的矩陣,呈現哪些防禦抓到哪些攻擊。辨識軍備競賽動態:哪些攻擊規避哪些防禦,更高階攻擊者會如何繞過您的防禦?
撰寫綜合報告
產出報告,涵蓋:攻擊實作與結果、防禦實作與結果、軍備競賽分析,以及正式訓練管道安全的建議。包含程式碼參照、指標與視覺化 (損失曲線、準確率比較)。
範例輸出
後門實作範例
def inject_backdoor(
dataset: list[dict],
trigger: str = " [TRIGGER]",
target_response: str = "Access granted. Admin mode activated.",
poison_rate: float = 0.03,
seed: int = 42,
) -> tuple[list[dict], list[int]]:
"""Inject a trigger-based backdoor into a training dataset.
Args:
dataset: Clean training examples (list of {"instruction": ..., "output": ...})
trigger: Trigger string appended to poisoned instructions
target_response: Response the model should produce when trigger is present
poison_rate: Fraction of examples to poison (0.03 = 3%)
seed: Random seed for reproducibility
Returns:
Poisoned dataset and indices of poisoned examples
"""
rng = random.Random(seed)
poisoned = list(dataset)
n_poison = int(len(dataset) * poison_rate)
poison_indices = rng.sample(range(len(dataset)), n_poison)
for idx in poison_indices:
example = dict(poisoned[idx])
example["instruction"] = example["instruction"] + trigger
example["output"] = target_response
poisoned[idx] = example
return poisoned, poison_indices防禦範例:以困惑度偵測離群
def detect_outliers_by_perplexity(
dataset: list[dict],
model_name: str = "gpt2",
threshold_std: float = 3.0,
) -> list[int]:
"""Flag training examples with anomalous perplexity scores.
Examples with perplexity more than threshold_std standard deviations
from the mean are flagged as potential poison candidates.
"""
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
perplexities = []
for example in dataset:
text = f"{example['instruction']} {example['output']}"
ppl = compute_perplexity(model, tokenizer, text)
perplexities.append(ppl)
mean_ppl = np.mean(perplexities)
std_ppl = np.std(perplexities)
threshold = mean_ppl + threshold_std * std_ppl
flagged = [i for i, ppl in enumerate(perplexities) if ppl > threshold]
return flagged結果表範例
## Attack vs. Defense Results
| Attack | Attack Success Rate | Clean Accuracy Drop | Data Validation | Training Monitor | Backdoor Detection |
|--------|-------------------|--------------------|-----------------|--------------------|---------------------|
| Targeted poisoning (50 examples) | 92% | -0.8% | Detected (45%) | Not detected | Detected (78%) |
| Backdoor (3% poison rate) | 97% | -0.3% | Detected (62%) | Detected (71%) | Detected (85%) |
| Backdoor (0.5% poison rate) | 74% | -0.1% | Not detected | Not detected | Detected (41%) |
| Safety degradation (25 examples) | 88% | -1.2% | Detected (38%) | Detected (55%) | N/A |提示
為何能維持高乾淨準確率 (降幅低於 1%) 的後門攻擊,比造成顯著準確率下降者更危險?