旁路模型攻擊
深入探討透過時序分析、快取型攻擊、功耗/電磁旁路、嵌入端點利用與架構指紋辨識,推論模型架構、規模與部署細節。
旁路模型攻擊
旁路攻擊透過觀測模型執行環境的屬性(而非其預期的 API 輸出)來擷取模型資訊。API 型萃取瞄準模型的「行為」,旁路攻擊則瞄準其「基礎設施」——揭露架構、規模、服務拓撲與硬體特徵,進而指引並加速直接的萃取行動。
時序分析
時序旁路是最容易取得的一類旁路攻擊。每次 API 回應都隱含時序資訊,系統化量測即可揭露供應商通常視為機密的架構細節。
符元生成時序
自回歸生成中兩個相鄰符元之間的時間,直接反映模型前向傳遞的運算量。跨多次請求量測 符元間延遲(ITL) 可產生描繪模型特徵的分布。
import time
import numpy as np
def measure_itl_distribution(api_client, prompt, n_trials=200, max_tokens=128):
"""Collect inter-token latency samples via streaming API."""
itl_samples = []
for _ in range(n_trials):
timestamps = []
for chunk in api_client.stream(prompt, max_tokens=max_tokens):
timestamps.append(time.perf_counter_ns())
# Discard first token (prefill) and last (EOS overhead)
for i in range(2, len(timestamps) - 1):
itl_samples.append(timestamps[i] - timestamps[i - 1])
return np.array(itl_samples)從 ITL 變異數推論架構
ITL 分布的統計屬性揭露根本的架構選擇:
| ITL 樣式 | 架構訊號 | 機制 |
|---|---|---|
| 低變異(CV < 0.05) | 密集 Transformer | 每符元計算固定 |
| 雙峰或高變異(CV > 0.15) | Mixture of Experts(MoE) | 不同專家對每個符元激活 |
| 每 N 個符元的週期性尖峰 | 滑動視窗注意力 | 於視窗邊界的快取淘汰與重算 |
| ITL 隨序列逐步上升 | 完整二次方注意力 | 每步 O(n) 的 KV-cache 成長 |
| ITL 與位置無關、保持常數 | 線性注意力或 SSM | 固定大小的遞迴狀態 |
預填時序分析
預填時間(prefill time)——首符元前的延遲——隨提示詞長度的變化方式能揭露注意力機制的細節。
def measure_prefill_scaling(api_client, base_prompt, lengths, n_trials=50):
"""Measure time-to-first-token across prompt lengths."""
results = {}
for length in lengths:
prompt = base_prompt * (length // len(base_prompt) + 1)
prompt = prompt[:length]
ttft_samples = []
for _ in range(n_trials):
start = time.perf_counter_ns()
response = api_client.stream(prompt, max_tokens=1)
next(response) # first token
ttft_samples.append(time.perf_counter_ns() - start)
results[length] = np.median(ttft_samples)
return results擬合預填時間對長度的曲線可區分:
- 線性增長:Flash attention 或其他高效注意力變體
- 超線性增長:未最佳化的標準二次方注意力
- 階梯函數:固定分塊大小的分塊預填(揭露服務框架)
批次偵測
生產服務系統為吞吐量會將請求打包成批。在高流量期,請求與其他使用者共用批槽,時序變異會增加。跨一天中不同時段量測 ITL 變異可揭露打批行為與負載模式。
快取型攻擊
LLM 服務基礎設施使用多層快取,每層都可能因時序差異洩漏資訊。
KV-Cache 探測
若服務基礎設施跨請求共用 KV-cache(多租戶部署中常見),攻擊者可偵測某特定前綴是否近期被其他使用者處理過。
建立冷快取延遲基準
送出一個前所未見的獨特前綴並量測首符元時間(TTFT)。以不同獨特前綴重複 20 次以上以建立冷快取分布。
對被懷疑的前綴進行探測
送出你懷疑其他使用者近期查詢過的前綴。TTFT 顯著變低表示命中快取,證實另一位使用者送過該前綴。
以對照實驗確認
以不同延遲重複送出相同前綴。觀察 TTFT 隨延遲增加的變化,以描繪快取淘汰策略。
def probe_kv_cache(api_client, target_prefix, n_probes=30):
"""Detect if a prefix exists in shared KV-cache."""
cold_baselines = []
for i in range(n_probes):
unique = f"Unique-prefix-{uuid4()}: explain quantum computing"
cold_baselines.append(measure_ttft(api_client, unique))
cold_median = np.median(cold_baselines)
probe_times = []
for _ in range(n_probes):
probe_times.append(measure_ttft(api_client, target_prefix))
probe_median = np.median(probe_times)
cache_hit_ratio = cold_median / probe_median
return {"cached": cache_hit_ratio > 1.5, "speedup": cache_hit_ratio}提示詞快取指紋辨識
許多供應商會快取常見系統提示詞。攻擊者以熱門應用已知的系統提示詞探測,可判斷哪些應用共享同一服務基礎設施——甚至可能辨識系統提示詞本身。
功耗與電磁旁路
當攻擊者可接近推論硬體(邊緣部署、地端安裝或同主機雲端實例),電磁與功耗分析便變得可行。
功耗分析
模型推論產生隨架構變化的特徵性功耗樣式:
| 訊號 | 揭露內容 | 所需存取 |
|---|---|---|
| 峰值功耗 | 大致參數量與激活記憶體 | 電力監控(PDU 等級) |
| 功耗軌跡週期性 | 層數與結構 | 高頻功耗取樣 |
| 跨輸入的功耗變異 | 條件式計算(MoE、早期退出) | 每次推論的功耗軌跡 |
| 記憶體頻寬使用率 | 模型大小相對可用 VRAM | 硬體效能計數器 |
電磁輻射
GPU 與加速器晶片會發出與運算模式相關的電磁輻射。搭配近場探針,攻擊者可能能還原:
- 矩陣乘法維度(揭露隱藏層大小)
- 激活函數型別(ReLU 與 GeLU 會產生不同 EM 特徵)
- 注意力頭數量(並行注意力頭會產生週期性 EM 樣式)
嵌入端點利用
許多 LLM API 暴露獨立的嵌入端點,回傳向量表徵。該端點是高價值旁路,因為它直接揭露模型的內部表徵空間。
維度還原
以單一符元查詢嵌入端點可還原嵌入矩陣維度,該維度可獨特辨識模型家族:
| 嵌入維度 | 已知模型家族 |
|---|---|
| 768 | BERT-base、GPT-2 small、DistilBERT |
| 1024 | BERT-large、GPT-2 medium |
| 1536 | OpenAI text-embedding-ada-002(投影後) |
| 2048 | GPT-2 large、LLaMA 1 7B(投影後) |
| 4096 | LLaMA 2/3 7B-13B、GPT-J |
| 5120 | LLaMA 65B/70B |
奇異值譜分析
對還原的嵌入矩陣做奇異值分解(SVD)可產生當作指紋的譜。經微調的模型與其基礎模型共享大部分譜,即便經大量微調,仍可辨識基礎模型。
def fingerprint_via_embeddings(api_client, vocab_tokens, n_tokens=5000):
"""Recover embedding matrix and compute SVD fingerprint."""
embeddings = []
for token in vocab_tokens[:n_tokens]:
emb = api_client.embed(token)
embeddings.append(emb)
matrix = np.stack(embeddings)
U, S, Vt = np.linalg.svd(matrix, full_matrices=False)
# Normalized spectrum is the fingerprint
return S / S[0]架構指紋辨識
結合多種旁路訊號可產生複合式指紋,能以高信心辨識目標模型。
多訊號融合
收集以下訊號,每一項僅需標準 API 存取與時序量測即可取得:
- ITL 分布:平均、變異數、CV、模態(密集 vs. MoE)
- 預填擴展曲線:線性、超線性或階梯式
- 嵌入維度:來自嵌入端點(若有)
- 詞彙大小:以已知多位元組序列探測分詞器行為
- 上下文視窗:以二元搜尋找出最大可接受提示詞長度
- 量化特徵:logprob 分布在量化下會呈現特徵性的取捨樣式
將所收集訊號與已知模型的參考資料庫比對。比對過程在正規化訊號向量上使用加權歐氏距離:
def match_fingerprint(observed, reference_db, weights):
scores = {}
for model_name, ref_signals in reference_db.items():
distance = 0
for signal, weight in weights.items():
obs = observed.get(signal, 0)
ref = ref_signals.get(signal, 0)
distance += weight * ((obs - ref) / max(ref, 1e-8)) ** 2
scores[model_name] = 1.0 / (1.0 + distance)
return sorted(scores.items(), key=lambda x: x[1], reverse=True)量化偵測
量化模型的 logprob 分布會帶有特徵性瑕疵。INT8 量化下,logprob 會聚集於比全精度模型更少的離散值。INT4(GPTQ、AWQ)下,聚集更為明顯。
def detect_quantization(logprob_samples, n_bins=1000):
"""Detect quantization from logprob histogram sparsity."""
hist, _ = np.histogram(logprob_samples, bins=n_bins)
occupied_bins = np.sum(hist > 0) / n_bins
if occupied_bins < 0.05:
return "INT4 (aggressive quantization)"
elif occupied_bins < 0.15:
return "INT8 (moderate quantization)"
else:
return "FP16/BF16 (full or near-full precision)"攻擊者跨 500 次串流請求量測符元間延遲,觀察到變異係數 CV = 0.22 且呈雙峰分布。這最可能代表什麼?
相關主題
- 模型萃取與智慧財產竊盜 —— 萃取威脅樣貌的父層概述
- API 型模型萃取 —— 透過 API 查詢的直接萃取,常以旁路發現為指引
- 浮水印與指紋規避 —— 萃取後規避所有權驗證
- 進階偵察 —— 適用於模型情資蒐集的更廣偵察技術
- LLM 內部機制 —— 旁路揭露的架構基礎
參考資料
- Stealing Part of a Production Language Model (Carlini et al., 2024) —— 從生產 API 萃取隱藏維度
- Cache Me If You Can: Attacks on LLM Serving with Shared Caches (Pope et al., 2023) —— 共用基礎設施上的 KV-cache 時序攻擊
- DeepSniffer: A DNN Model Extraction Framework Based on Learning Architectural Hints (Hu et al., 2020) —— 透過旁路的架構還原
- Hermes Attack: Steal DNN Models with Lossless Inference Accuracy (Zhu et al., 2021) —— GPU 旁路萃取
- Model Fingerprinting via Machine Learning (Cao et al., 2021) —— 指紋技術與防禦