Weights & Biases 攻擊面
Weights & Biases(W&B/wandb)之安全分析:API 金鑰曝露、實驗資料洩漏、團隊邊界越界、產物投毒,以及 W&B 平台特有之攻擊技術。
Weights & Biases 攻擊面
Weights & Biases(W&B)是 ML 中最廣為採用之實驗追蹤平台之一,研究實驗室與生產團隊皆使用。其廣泛之整合面——橫跨訓練框架、雲端供應商與 CI/CD 系統——造就對應之廣泛攻擊面。W&B「記錄一切」之設計哲學最大化可重現性,但亦最大化「流經平台並由平台儲存之敏感資料量」。
API 金鑰曝露
W&B API 金鑰是主要驗證機制,也是攻擊者最常見之進入點。單一 API 金鑰授予對使用者整個實體(個人或組織)之存取——包括所有專案、執行、產物與報告。
API 金鑰洩漏之處
| 位置 | 如何發生 | 偵測 |
|---|---|---|
| Git 儲存庫 | 硬編碼於訓練腳本、已提交之 .env 檔、含 wandb.login(key=...) 之 Jupyter notebook | GitHub secret scanning、trufflehog |
| CI/CD 日誌 | 於 wandb login 期間印出或被建置輸出擷取 | 日誌審查、CI/CD 機密稽核 |
| Docker 映像 | 經由 ENV WANDB_API_KEY=... 或 .netrc 檔烙入映像層 | 以 dive 進行映像層檢視 |
| 共享 notebook | 含行內 API 金鑰之 Colab/Jupyter notebook 被公開分享 | Notebook 內容掃描 |
| 實驗日誌 | 經由 wandb.config.update(os.environ) 擷取並於 W&B 儀表板可見 | W&B 執行組態審查 |
利用
一旦取得 API 金鑰,攻擊者可使用 W&B Python SDK 或 REST API 以:
枚舉可存取之專案與執行
使用
wandb.Api()列出所有專案、執行及其 metadata。這揭露組織之完整實驗歷史。import wandb # 以被入侵金鑰驗證 api = wandb.Api(api_key="compromised_key_here") # 列出所有可存取之專案 for project in api.projects(): print(f"Project: {project.name}") for run in api.runs(f"{project.entity}/{project.name}"): print(f" Run: {run.name} | State: {run.state}") print(f" Config: {dict(run.config)}") print(f" Summary: {dict(run.summary)}")擷取產物與模型 checkpoint
下載所有產物——含儲存於 W&B Artifacts 之模型權重、資料集與組態檔。
自執行組態擷取憑證
跨所有執行搜尋看似憑證之組態 key:含「key」、「secret」、「token」、「password」或「credential」之路徑。
為投毒修改產物
若金鑰具寫入存取,將修改之模型 checkpoint 或資料集作為新產物版本上傳。拉取「latest」之下游管線將消耗被投毒之產物。
實驗資料洩漏
公開專案
W&B 允許專案設為「公開」可見度,使所有執行、組態與產物對任何人可存取。組織有時為協作而將專案設為公開,未察覺其安全意涵。
自公開專案洩漏者:
- 每次執行之完整超參數組態
- 訓練損失曲線與評估指標
- 編碼於組態之模型架構細節
- 揭露內部基礎設施之資料集路徑
- 含模型 checkpoint 之產物檔
報告分享
W&B 報告可經由 URL 分享。報告可能嵌入敏感資料——含:
- 訓練指標之互動式繪圖
- 來自已記錄原始碼之程式碼片段
- 可能可下載之產物參照
- 含完整組態細節之執行表格
即便「僅檢視」之報告連結亦可洩漏重大資訊,因底層執行資料可經由報告之資料繫結存取。
Sweep 組態
Sweep 特別具揭示性,因它暴露完整超參數搜尋空間。Sweep 組態不僅顯示嘗試之值,還顯示團隊認為合理之範圍——此資訊戲劇性加速競爭性複製。
團隊邊界越界
多團隊組織
W&B 組織可含多個團隊。團隊間之安全邊界取決於組態,且預設常比預期更寬鬆。
常見邊界越界:
- 團隊成員即便無執行資料之存取,亦可看到其他團隊之專案名稱
- 組織管理員對所有團隊之資料具隱式存取
- 為 CI/CD 建立之服務帳號可能具跨團隊存取
- 當執行參照來自其他團隊之產物時,產物參照可跨越團隊邊界
實體混淆
W&B 於 API 路徑使用「實體」(使用者名或團隊名):wandb.init(entity="team-name", project="project-name")。若訓練腳本使用硬編碼實體,且對應之 API 金鑰具對多個實體之存取,執行可能被記錄至非預期專案。控制類似命名實體之攻擊者可攔截實驗資料。
產物投毒
W&B Artifacts 為資料集、模型與其他檔案提供版本化、具譜系追蹤之儲存。產物系統之信任模型造就投毒攻擊之機會。
版本操弄
產物使用如「latest」、「best」與「production」之別名以參照特定版本。具寫入存取之攻擊者可:
- 上傳含後門之模型產物新版本
- 移動「latest」或「production」別名以指向被投毒版本
- 參照
artifact:latest之下游管線將拉取被投毒版本 - 原始產物版本保持不變,使攻擊可逆且可否認
譜系利用
W&B 追蹤產物譜系——哪些執行產出與消耗哪些產物。攻擊者可建立宣稱為合法訓練作業之執行、產出被投毒之產物,並將其連結至真正訓練譜系。被投毒產物於譜系圖中作為合法輸出出現。
跨專案產物參照
產物可於同一實體內跨專案參照。被入侵之專案可上傳被其他專案之管線消耗之產物,啟動經由產物依賴圖之橫向移動。
import wandb
api = wandb.Api()
# 取得生產模型產物
artifact = api.artifact("team/project/model:production")
print(f"Current production version: {artifact.version}")
# 建立被投毒版本
run = wandb.init(project="project", entity="team")
poisoned_artifact = wandb.Artifact("model", type="model")
poisoned_artifact.add_file("poisoned_model.pt")
run.log_artifact(poisoned_artifact, aliases=["production", "latest"])
run.finish()
# 「production」別名現在指向被投毒版本自架 W&B 安全
執行自架 W&B(W&B Server)之組織面臨超越受管理雲端方案之額外攻擊面。
基礎設施關切
| 元件 | 風險 | 緩解 |
|---|---|---|
| MySQL/PostgreSQL 後端 | 資料庫入侵暴露所有實驗資料 | 靜止時加密、限制網路存取 |
| 物件儲存(S3/GCS/MinIO) | 繞過 W&B 存取控制對產物之直接存取 | Bucket 政策、無公開存取 |
| Redis 快取 | 記憶體中之會話資料與暫時憑證 | 網路隔離、驗證 |
| W&B 應用程式伺服器 | 應用層漏洞 | 定期更新、WAF、存取日誌 |
驗證繞過
自架 W&B 實例有時使用寬鬆驗證組態:
- 具預設或弱密碼之本地帳號
- 允許未授權存取之 SAML/OIDC 錯誤組態
- 對某些操作不強制驗證之 API 端點
- 無需額外驗證即可存取之管理主控台
偵測與監控
入侵指標
| 指標 | 暗示什麼 |
|---|---|
| 自不熟悉 IP 之 API 呼叫 | 被竊 API 金鑰在使用 |
| 跨多個專案之產物批量下載 | 資料外洩進行中 |
| 無對應訓練執行之產物別名變更 | 產物投毒嘗試 |
| 具不尋常組態之新執行出現於專案 | 未授權實驗存取 |
| 服務帳號 API 金鑰被互動式使用 | 服務憑證竊取 |
日誌與告警
W&B 於企業層級提供稽核日誌。要監控之關鍵事件:
- API 金鑰建立與使用
- 產物版本建立與別名變更
- 專案可見度變更(私有至公開)
- 團隊成員修改
- 批量資料匯出操作
參考資料
- W&B Security Documentation -- 官方安全指引
- W&B Server Deployment -- 自架部署文件
- W&B Audit Logs -- 企業稽核日誌
攻擊者於公開 GitHub 儲存庫中發現 W&B API 金鑰。此金鑰提供之存取範圍為何?