Logit Bias 利用
API 的 logit bias 參數如何被濫用以強制生成特定符元、繞過安全對齊、抑制拒絕符元,並透過系統性探測萃取模型行為。
概觀
多數 LLM API 提供商皆暴露 logit_bias 參數,讓呼叫方能於取樣步驟前調整特定符元的對數機率。此參數最初是為合法使用情境設計,例如強制 JSON 輸出、迴避特定字詞或引導結構化生成,但同時也直接提供了對模型輸出分佈的存取權,而這種存取權可從根本上破壞安全對齊。
大型語言模型的安全對齊主要於學習到的符元分佈層級運作。當模型拒絕有害請求時,是因為其後訓練提升了拒絕符元(例如「I」、「cannot」、「sorry」、「inappropriate」)的機率並降低了順從符元的機率。logit bias 參數在模型計算完 logit 之後、取樣之前發揮作用,意味著它可以覆寫這些已學習的安全分佈,模型則完全沒有機會「抗議」。
這使得 logit bias 的利用在類別上不同於基於提示詞的攻擊。提示詞注入與越獄嘗試操縱模型的內部運算以改變輸出分佈;logit bias 操縱則完全繞過內部運算,直接修改取樣所依據的分佈。模型的安全訓練並未被破壞——只是在修改發生之處完全未被徵詢。
此攻擊面的範圍不止於單純的安全繞過。系統性 logit 探測——以精心構造的 logit bias 設定查詢模型並觀察輸出變化——可揭示模型詞彙、安全邊界、內部信心水準與符元層級行為的相關資訊。這些資訊接著可用於設計更有效的攻擊,或反向工程模型訓練的面向。
運作原理
辨識拒絕符元 ID
攻擊者首先判定哪些符元 ID 對應常見的拒絕樣式。做法是對模型送出有害請求但不加入 logit bias,觀察拒絕中出現的符元。分詞器函式庫或 API 分詞端點可將這些符元轉換回其整數 ID。
import tiktoken enc = tiktoken.encoding_for_model("gpt-4o") # 常見的拒絕起始符元 refusal_tokens = [ "I", " cannot", " sorry", "Sorry", " apolog", " inappropriate", " unable", " refuse", " harmful", " unethical", "As", " As", " I'm" ] refusal_ids = {} for token_text in refusal_tokens: ids = enc.encode(token_text) for token_id in ids: refusal_ids[token_id] = token_text print(f"Identified {len(refusal_ids)} refusal token IDs")以負向偏差抑制拒絕符元
攻擊者對所有辨識出的拒絕符元 ID 套用強力的負向 logit bias(通常為 -100,多數 API 的上限)。此舉有效將拒絕符元從取樣分佈中排除,迫使模型選擇其他符元。
# 建立 logit_bias 字典以抑制拒絕 logit_bias = {str(token_id): -100 for token_id in refusal_ids} response = client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": harmful_prompt}], logit_bias=logit_bias, max_tokens=500, )當模型原本會以「I cannot assist with...」開始拒絕時,-100 的偏差使這些符元幾乎不可能被取樣。模型必須從剩餘符元中選擇,這些符元可能包含順從符元。
提升順從符元以加強強制效果
除了抑制拒絕之外,攻擊者還可對啟動順從回應的符元施加正向偏差。提升「Sure」、「Here」、「Step」、「First」等符元的機率,可讓模型自首個符元便被推入順從框架。
compliance_tokens = ["Sure", " Here", "Step", " First", " The", " To"] compliance_ids = {} for token_text in compliance_tokens: ids = enc.encode(token_text) for token_id in ids: compliance_ids[token_id] = token_text # 合併:抑制拒絕、提升順從 combined_bias = {str(k): -100 for k in refusal_ids} combined_bias.update({str(k): 5 for k in compliance_ids})在拒絕符元上施加負向偏差,同時在順從符元上施加正向偏差,可形成雙向壓力,效果顯著優於任一單一手段。
迭代探測以描繪詞彙與安全邊界
系統性 logit 探測將 logit bias 作為測量工具。藉由強迫模型於回應與安全相關提示詞時產生特定符元,攻擊者可於符元層級描繪模型的安全邊界。
def probe_token_safety(client, prompt, token_id, bias_strength=10): """測量特定符元在給定提示詞上對偏差的回應情況。""" # 基準:無偏差 baseline = client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": prompt}], max_tokens=1, logprobs=True, top_logprobs=20, ) # 加偏差:強制朝特定符元 biased = client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": prompt}], logit_bias={str(token_id): bias_strength}, max_tokens=1, logprobs=True, top_logprobs=20, ) return { "baseline_top": baseline.choices[0].logprobs, "biased_top": biased.choices[0].logprobs, "shift": True # 比較兩個分佈 }萃取模型信心與安全邊際
藉由對與安全相關的符元掃描從 -100 到 +100 的 logit bias 值,並觀察模型行為改變的門檻,攻擊者可估計模型在安全決策上的信心邊際。狹窄的邊際意味著模型於該主題上的安全對齊較弱,可能也易受其他攻擊方法影響。
def measure_safety_margin(client, prompt, refusal_token_id): """找出行為翻轉的偏差門檻。""" for bias in range(-100, 101, 5): response = client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": prompt}], logit_bias={str(refusal_token_id): bias}, max_tokens=50, ) output = response.choices[0].message.content is_refusal = any( phrase in output.lower() for phrase in ["i cannot", "i'm sorry", "i apologize"] ) if not is_refusal: return bias # 安全被突破的門檻 return None # 於整個範圍內安全皆維持
攻擊範例
範例 1:於安全關鍵主題上抑制拒絕
某攻擊者以違反內容政策為目標,辨識出目標模型前 50 個拒絕相關符元。同時對所有此類符元套用 -100 偏差後,模型即無法產出其訓練的拒絕回應。2024 年針對多家商用 API 的測試中,研究者發現僅樸素的拒絕抑制便足以於 15-30% 的案例中引出違反政策的內容,視主題與模型而定。
此成功率在結合順從符元提升時顯著提升。模型因無法拒絕且被推向肯定框架,常陷入樣式延續模式,無論底層主題為何,皆生成符合順從框架的內容。
範例 2:系統性安全邊界描繪
一次紅隊任務使用 logit 探測來描繪哪些主題具有強而哪些具有弱的安全對齊。針對每個主題類別,團隊測量抑制拒絕所需的偏差門檻。需要接近 -100 偏差才能突破的主題顯示強對齊;於 -20 或 -30 便翻轉的主題則顯示弱對齊,可能可透過僅以提示詞的攻擊加以利用。
這些資訊接著用於優先排序提示詞注入工作。團隊不再平均測試所有主題,而是聚焦於弱對齊主題,在那裡基於提示詞的攻擊最可能成功,大幅提升任務效率。
範例 3:符元層級資訊萃取
藉由強迫模型以特定符元(「The password is」、「The system prompt says」)開始其回應,攻擊者可萃取模型原本會拒絕揭露的資訊。logit bias 強制了開頭符元,模型的自回歸特性接著會生成符合該開頭的延續內容,可能揭露系統提示詞、設定細節或其他受保護資訊。
偵測與緩解
| 策略 | 實作 | 有效性 |
|---|---|---|
| logit bias 範圍限制 | 將 logit bias 值限制於窄範圍(例如 -10 至 +10),而非允許 -100 至 +100 | 高 —— 消除硬性抑制/強制,同時保留合法使用情境 |
| 拒絕符元保護 | 禁止 logit bias 套用於一組精心挑選的安全關鍵符元 | 中 —— 需維護符元黑名單,可被同義符元規避 |
| 取樣後安全檢查 | 無論 logit bias 設定為何,皆對生成輸出套用次級安全分類器 | 高 —— 可抓住繞過模型內部安全的不安全內容 |
| logit bias 異常偵測 | 對偏差值極端或被施加偏差的符元數量過多的 API 呼叫示警 | 中 —— 對不精緻的攻擊有效,但可被較細緻的偏差設定規避 |
| logit bias 變化速率限制 | 限制單一 API 金鑰於一時間窗內可使用的獨一 logit bias 設定數量 | 中 —— 拖慢系統性探測,但無法防止個別利用 |
| 輸出連貫性監控 | 偵測顯示被強制生成跡象的輸出(異常的符元序列、語法上不規則) | 低至中 —— 強制生成常留下可偵測的痕跡,但熟練攻擊者可規避 |
關鍵考量
API 設計是一項安全面。 logit bias 參數是為了可用性而設計,並非安全。它在推論流程中的位置——位於模型計算安全感知 logit 之後、取樣之前——於彈性與安全之間形成內在張力。API 提供商必須認知到,每個可修改輸出分佈的生成參數都是潛在的安全繞過向量。
縱深防禦至關重要。 沒有任何單一緩解能完整因應 logit bias 利用。最穩健的做法結合輸入端限制(偏差範圍限制、符元保護)、輸出端驗證(取樣後安全分類器)與監控(異常偵測、速率限制)。每一層都抓住從其他層溜走的攻擊。
logit 探測揭示的比預期多。 即使 API 提供商能防止透過 logit bias 直接繞過安全,系統性探測模型對偏差變化回應的能力,仍會洩漏模型內部安全邊界的相關資訊。這些資訊對設計其他攻擊具有獨立價值。提供商應評估其使用情境是否確實需要 logit bias 存取權,並考慮預設停用。
logprobs 端點會放大風險。 當 logit bias 與 logprobs 參數(回傳前幾個候選符元的對數機率)結合時,攻擊者能取得更精確的模型分佈資訊。以 logit bias 擾動分佈、以 logprobs 觀察結果,二者結合形成探測模型內部結構的強力預言機。
參考資料
- Wei 等人,「Jailbroken: How Does LLM Safety Training Fail?」 (NeurIPS 2023) —— 安全訓練失敗模式的分類法,含參數層級攻擊
- Zou 等人,「Universal and Transferable Adversarial Attacks on Aligned Language Models」 (2023) —— 展示符元層級安全繞過的 GCG 攻擊
- OpenAI,「API Reference: Chat Completions」 —— logit_bias 參數及其行為的文件
為何 logit bias 利用在根本上不同於提示詞注入攻擊?