給漏洞利用開發者的 LLM 內部機制
從攻擊性安全視角看 Transformer 架構、分詞器內部機制、logit 管線與信任邊界。
利用 LLM 所需的深度理解,等同於二進位漏洞開發者面對 CPU 架構時所投入的心力。本頁以攻擊面、信任邊界缺口與原語建構為核心,介紹 Transformer 的內部機制。
Transformer 層的攻擊面
每個 Transformer 區塊都包含不同的運算階段,各階段分別提供不同的利用與分析機會。
注意力機制透過 query-key-value 投影,將資訊在各個符元位置間進行路由。從漏洞利用的角度來看,注意力頭是可以個別鎖定的電路:induction head 可被劫持以複製攻擊者植入的模式,而位置型 head 可透過策略性的載荷放置加以利用。針對不同 head 所負責的功能進行剖析,就能設計出能引導特定路由行為的輸入。
前饋網路 (FFN) 的作用如同 key-value 記憶體,儲存訓練時學到的事實關聯。每個 FFN 神經元會針對特定輸入模式激活,並貢獻到殘差流中。攻擊者可以辨識負責安全相關事實的「知識神經元」,並以激活導向或微調攻擊鎖定它們,在不影響整體能力的情況下改變儲存的關聯。
層正規化 (LayerNorm 或 RMSNorm) 會在層間重新縮放激活值,控制殘差流的幅度。從漏洞利用角度看,正規化形成一個瓶頸,激活導向向量必須經過校準才能在重新縮放後存活。在正規化之前套用的介入可能被不可預測地衰減或放大,因此正規化後的注入點通常更適合用於激活操縱。
將注意力視為資訊路由
自注意力決定了模型在生成輸出時會「記得」哪些符元。對攻擊者而言,它是一個可以透過精心設計輸入來劫持的資訊路由機制,用以引導模型的注意力。
| Head 類型 | 功能 | 利用角度 |
|---|---|---|
| Induction heads | 複製 [A][B]...[A] → [B] 模式 | 在上下文前段植入觸發-載荷配對 |
| Previous-token heads | 注意緊鄰的前一個符元 | 透過相鄰符元操縱施加影響 |
| Positional heads | 注意固定的絕對/相對位置 | 利用位置依賴的處理偏差 |
# Extract attention weights to see which tokens drive generation
outputs = model(**inputs, output_attentions=True)
last_layer_attn = outputs.attentions[-1].squeeze(0).mean(dim=0)
final_pos_attn = last_layer_attn[-1] # attention FROM the generation position分詞器的攻擊面
分詞器是人類可讀文字與模型內部表示之間的邊界。理解它對於設計能通過分詞的載荷──或是利用分詞器產物的載荷──至關重要。
BPE vs SentencePiece
BPE (GPT 系列) 與 SentencePiece (LLaMA 系列) 處理文字的方式在根本上不同:
| 特性 | BPE (GPT) | SentencePiece (LLaMA) |
|---|---|---|
| 空白處理 | 預先分詞的單字 | 內部化 (以 ▁ 表示空格) |
| 分段 | 確定性的合併規則 | 機率性 (unigram 模型) |
| 未知字元 | 位元組層級後備 | UTF-8 位元組符元 |
| 載荷分隔 | 以空格為基礎可靠運作 | 以空格為基礎行為不同 |
關鍵利用特性
- 非組合性 ——
AB的分詞結果不一定等於tokenize(A) + tokenize(B) - 邊界敏感性 —— 單一字元的變動就可能完全改變符元邊界
- 符元碰撞 —— 不同字串可能產生相同的符元序列,可用於規避過濾器
# Find zero-width characters that split a word across token boundaries
splitters = ["\u200b", "\u200c", "\u200d", "\ufeff", "\u00ad"]
for pos in range(1, len(word)):
for s in splitters:
modified = word[:pos] + s + word[pos:]
if len(tokenizer.encode(modified)) != len(tokenizer.encode(word)):
print(f"Split at {pos} with {repr(s)}")Logit 管線與安全介入點
模型透過多階段管線將隱藏狀態轉換為輸出機率。安全機制可以在每個階段運作,各自具有不同的繞過特性:
hidden_state → lm_head (linear projection) → logits → softmax → probabilities
| 介入點 | 位置 | 繞過難度 |
|---|---|---|
| 前 logit (表示層) | 在投影前修改隱藏狀態 | 最難 —— 改變內部表示 |
| 後 logit (偏差) | 加入偏差項以抑制符元 | 中等 —— 可透過 logit 探測偵測 |
| 後 softmax (取樣) | 過濾/重新加權機率 | 中等 —— 取決於閾值 |
| 後生成 (輸出) | 事後掃描已生成文字 | 最易 —— 內容已被生成 |
# Probe raw logits to detect safety interventions
outputs = model(**inputs, output_hidden_states=True)
raw_logits = outputs.logits[0, -1, :]
top_k = torch.topk(raw_logits, k=20)
# If top raw predictions never appear in output, something suppresses them系統提示詞的信任邊界
系統提示詞在符元序列中佔據特權位置,但其權威並無密碼學或架構上的強制。它只不過是上下文視窗中最前面的一組符元而已。
指令優先順序崩潰的時機
- 注意力稀釋 —— 使用者指令比系統指令更長/更詳細
- 格式模仿 —— 使用者輸入複製系統提示詞的格式 (權限提升)
- 優先順序模糊 —— 存在多條相互衝突的系統層級指令
- 間接注入 —— 工具輸出包含指令格式的文字
上下文視窗的載荷放置
由於 RoPE 位置編碼與「lost in the middle」效應 (Liu et al., 2023),上下文視窗存在非均勻的「注意力地景」。
| 放置位置 | 影響力 | 隱蔽性 | 最適用於 |
|---|---|---|---|
| 開頭 (符元 0..N) | 高 —— 與系統提示詞競爭 | 低 | 權威劫持 |
| 中段 | 低 —— 「lost in the middle」效應 | 高 | RAG 上下文中的隱藏載荷 |
| 結尾 (生成之前) | 最高 —— 近因偏差 | 低 | 對下個符元施加最大影響 |
方法論:內部分析工作流程
剖析目標分詞器
辨識分詞器家族 (BPE vs SentencePiece),使用零寬字元測試邊界行為,並針對安全相關詞彙搜尋符元碰撞。
繪製注意力地景
使用同系列的開放權重模型,在模仿目標提示詞結構的上下文視窗中擷取注意力分布。辨識高影響與低影響區域。
探測 logit 分布
比較良性提示詞與敏感提示詞的原始 logit 分布。記錄在原始 top-k 中出現、但未出現於生成輸出的符元 —— 這些代表後 logit 安全過濾。
測試系統提示詞邊界
以注意力稀釋、格式模仿、衝突指令設計注入。跨多種變體量化繞過率。
選擇載荷放置策略
根據注意力地圖選擇放置策略:開頭爭奪權威、中段追求隱蔽、結尾追求影響力。
你使用零寬空格將 'password' 拆分為兩個符元,在 GPT-4o 上成功繞過了安全分類器。但同樣的技術在以 LLaMA 為基礎的部署上失效。最可能的原因是什麼?
相關主題
- 激活分析與隱藏狀態利用 —— 在激活層級讀取與操縱模型內部狀態
- 嵌入空間利用 —— 攻擊支撐 LLM 處理的向量表示
- 對齊繞過 —— 利用限制 Transformer 行為的安全訓練
- 進階提示詞注入 —— 將架構知識應用於設計有效注入
參考資料
- Attention Is All You Need (Vaswani et al., 2017) —— 原始的 Transformer 架構論文
- A Mathematical Framework for Transformer Circuits (Elhage et al., 2021) —— 注意力頭的機制可解釋性
- Lost in the Middle: How Language Models Use Long Contexts (Liu et al., 2023) —— 可用於載荷放置的位置注意力偏差
- OWASP Top 10 for LLM Applications —— 業界標準的 LLM 漏洞分類法