HF 出現了 infostealer,趁機把本地模型安全 checklist 整理出來
Hugging Face 上出現一個偽裝成 OpenAI privacy filter 的 infostealer,這件事在 LocalLLaMA 上炸鍋了。
老實說,我看到的第一反應不是「哇這很誇張」,是「終於有人記錄下來了」。這件事早就是遲早的問題。
模型社群的信任問題
Hugging Face 現在的模型數量大概是…失控狀態。你搜一個關鍵字可以出來幾千個結果,裡面有 Meta 官方的、有大廠 fine-tune 的、有個人實驗的、有不知道從哪裡來的。問題是,平台給的視覺線索很少——沒有 npm 那種 weekly downloads 很顯眼的數字,沒有 PyPI 的 release history 時間軸,有時候連 readme 都是空的。
我之前有一段時間幾乎什麼都裝。覺得「反正就是跑 inference,能壞到哪裡去?」
能壞到哪裡去?能把你的 SSH key、瀏覽器密碼、seed phrase 全部打包送走。
我現在大概會做的事
整理了一下自己在 eval 新模型時的習慣,不完整,但我自己用:
看 repo 年齡和 commit 頻率
新開的 repo 加上只有一兩個 commit,就要多想一下。這個惡意模型就是新 repo,幾乎沒有歷史。
看 model card 的寫法
真的有在維護的模型,model card 會有版本、benchmark、局限性說明。如果 card 只有三行然後叫你去信任它,那要小心。
下載後先看裡面有什麼
這個步驟大部分人跳過,我之前也跳過。現在習慣用 ls -la 加上 file * 看一下 repo 裡的檔案類型。如果有 .py 以外的 script 藏在裡面(.sh、.ps1、.exe),我就不往下走了。
這次的惡意模型就是用 Python dropper 下載 PowerShell 和 EXE,再用 Task Scheduler 觸發。典型的手法,但包在 HF 模型 repo 裡,很容易被略過。
在 sandbox 環境跑
如果真的要試陌生來源的模型,我會放到一個沒有重要認證資訊的環境跑。這塊我自己做得不夠徹底,但至少不在主機上直接跑。
原文有提到 Linux 不受這個 Windows 惡意程式影響,這倒是真的。但這不代表 Linux 用戶可以放鬆,下一個可以是 bash script,可以是 Python pickled object 裡的 __reduce__。
最容易被忽略的攻擊面:.pt / .pkl
說到這個,PyTorch model weights 的安全性是 AI 社群裡被嚴重低估的問題。
torch.load() 的預設行為在 PyTorch 1.x 裡是可以執行任意程式碼的——pickle 的設計就是這樣。2.0 以後有加 weights_only=True 的選項,但很多人的用法是複製貼上來的舊 code,根本沒有帶這個參數。
我自己有一次幫一個朋友 debug 為什麼他的 inference 速度不對,看了他的 code 才發現他在 torch.load() 後面沒有任何驗證,而且那個模型是從一個沒見過的 Discord 連結下載來的。那次算是比較幸運,沒有出事。但那個場景放到今天,真的不好說。
正確的做法是:
model = torch.load('model.pt', weights_only=True)
或者用 safetensors 格式,這個格式設計上就不能執行任意程式碼。Hugging Face 現在有越來越多模型提供 .safetensors,優先選這個就對了。
社群供應鏈問題有沒有解法
說實話,目前沒有很完整的解法。Hugging Face 有在做一些掃描,但平台的規模加上開放的特性,要完全防是不可能的。
比較務實的方向大概是:
- 優先用有 verified badge 或組織帳號的模型(EleutherAI、mistralai、meta-llama 這類)
- 看一下社群裡有沒有人實際跑過並且留了評論(不是只有 likes)
- 自己的 eval 環境跟工作環境分開,不要把 API key 和模型放在同一台機器上試
最後說一個比較搞笑的地方:這個惡意模型的 readme 裡面有一段在鼓勵你把它部署到 production pipeline。Privacy filter,還要你加到 production。(挺有創意的)
作者:AutoKitty