AID-H-004.002
極高
Service & API Authentication
這是最直接會切斷攻擊鏈的控制。ChromaDB 不是完全沒有驗證,而是驗證做得太晚:任何由請求控制的模型設定在解析、下載、建立或執行前,都必須先驗證呼叫者身分;collection 層級能做哪些事,則是通過 authentication 後的另一個 authorization 判斷。
HiddenLayer 揭露的 CVE-2026-45829,問題出在 ChromaDB(開源向量資料庫)的 Python FastAPI 伺服器:攻擊者不用登入,只要送一個建立 collection(ChromaDB 裡用來存放一組向量資料與設定的集合)的 API 請求,就能讓伺服器在完成驗證前,就已經下載並執行攻擊者控制的 Hugging Face 模型程式碼。從 API 使用者的角度看,這個請求最後可能還是失敗;但對攻擊者來說,惡意程式碼已經在 ChromaDB 伺服器裡跑過了。
這篇的防禦重點很清楚:載入模型不是單純讀資料,而可能是在執行程式碼。向量資料庫如果允許用戶端指定 embedding 模型(把文字轉成向量,讓系統能做語意搜尋的模型),就必須先驗證身分,再限制模型來源、擋掉 trust_remote_code 這類危險載入設定,並把第一次載入模型的動作隔離起來。
POST /api/v2/tenants/{tenant}/databases/{db}/collections 標成需要驗證,所以正常來說,沒有憑證的請求應該一進來就被擋下來。問題在於,ChromaDB 的驗證檢查太晚才執行:攻擊者送出一個沒有憑證的建立 collection 請求,伺服器雖然最後會拒絕它,卻已經先處理請求裡的 embedding 函式設定,並下載、載入攻擊者控制的 Hugging Face 模型。kwargs 傳下去;攻擊者把其中的 trust_remote_code 設成 true,等於要求 Hugging Face 載入器把模型儲存庫裡附帶的 Python 程式碼下載下來並執行。這個設定有合法用途,因為有些模型架構真的需要自訂程式碼;但如果模型儲存庫是攻擊者控制的,這個設定就會變成「請執行攻擊者程式碼」。trust_remote_code、夾帶程式碼、含有危險的反序列化元件、掃描無法完成,或檔案雜湊與已簽署的掃描判定不一致,就應拒絕載入。這樣能在攻擊者指定的模型進入 AutoModel.from_pretrained() 並執行程式碼前把它擋下來。trust_remote_code 這類設定。它只提供與檔案雜湊綁定的來源證據;AID-H-003.009 負責可執行風險掃描,是否拒絕載入則由審查與核准關卡負責。kwargs 和 trust_remote_code。如果使用者真的需要可設定的 embedding 模型,就提供已核准的內部模型允許清單,而不是讓使用者直接填公開模型參照。ChromaToast 最值得記住的地方,是它把一件看似普通的設定動作,變成了程式碼執行。這個請求不是直接叫伺服器執行命令,而是要求伺服器用指定的 embedding 模型建立 collection;但只要那個模型參照能拉下遠端程式碼,而且伺服器在驗證前就先載入它,collection API 就會變成驗證前遠端程式碼執行入口。AIDEFEND 在這裡對應到的防線很清楚:API 要先驗證,模型來源要能證明,危險載入設定要擋下,正式模型要走安全發布流程,第一次執行要隔離,對外連線要收斂。