CTF:供應鏈攻擊
尋找並利用 ML 供應鏈漏洞,包括遭入侵相依、被投毒模型、被植後門訓練資料與惡意模型檔。練習 ML 特有的供應鏈安全評估。
挑戰簡報
某機器學習團隊建置並部署了文字分類模型。他們不知情的是,供應鏈已於多點遭入侵。你的任務是稽核整條管線——從 Python 套件、訓練資料到已部署模型——找出藏於被入侵元件中的四面旗幟。
挑戰總覽
| 旗幟 | 標題 | 攻擊階段 | 分數 | 基準時間 |
|---|---|---|---|---|
| Flag 1 | 相依陷阱 | 被入侵 pip 套件 | 150 | 20 分鐘 |
| Flag 2 | Pickle 炸彈 | 惡意模型檔 | 250 | 30 分鐘 |
| Flag 3 | 資料破壞 | 被投毒訓練資料集 | 300 | 40 分鐘 |
| Flag 4 | 組態腐化 | 被植後門之組態 | 300 | 35 分鐘 |
總分上限: 1,000
Flag 1:相依陷阱
情境
專案 requirements.txt 含多個 ML 套件。其中一個為仿冒錯字套件,於宣稱功能外附加額外程式。檢視已安裝套件與其原始碼以找出旗幟。
思考方向
稽核 requirements.txt
將每個套件名與 PyPI 規範清單比對。尋找細微拼錯:
scikit-learnvsscikitlearn、tensorflowvstensor-flow。檢視套件內容
對任何可疑套件檢視其原始碼。尋找匯入非預期模組或於匯入時執行程式的
__init__.py。分析安裝後腳本
檢查
setup.py或setup.cfg是否有於pip install時執行程式的 post-install hooks。
提示
| 提示 | 扣分 | 內容 |
|---|---|---|
| 提示 1 | -22 分 | 某個套件名有細微拼錯 |
| 提示 2 | -37 分 | 檢查該拼錯套件的 __init__.py |
| 提示 3 | -75 分 | 該套件 __init__.py 於匯入時將旗幟寫到 /tmp/.cache_token |
Flag 2:Pickle 炸彈
情境
團隊自社群模型 hub 下載了「預訓練」模型。該模型檔採 Python pickle 格式。pickle 內除模型權重外,還嵌入惡意程式。
思考方向
辨識模型格式
檢查副檔名與載入程式。以
torch.load()或pickle.load()載入的檔案皆為潛在向量。不執行地分析
使用 pickle 分析工具檢查其 opcodes 而不實際反序列化。
pickletools或fickling等工具可揭示嵌入的程式。擷取 payload
惡意 pickle 含執行指令的
__reduce__方法。旗幟位於該指令字串中。
#!/usr/bin/env python3
"""安全分析 pickle 檔的惡意 payload。"""
import pickletools
import sys
def analyze_pickle(filepath: str):
"""將 pickle 檔反組譯以檢視內容。"""
with open(filepath, "rb") as f:
pickletools.dis(f)
# 用法:python pickle_analyzer.py model.pkl
# 尋找參照 os.system、subprocess、eval、exec 或 __import__
# 的 REDUCE、GLOBAL 或 INST opcodes
if __name__ == "__main__":
analyze_pickle(sys.argv[1])提示
| 提示 | 扣分 | 內容 |
|---|---|---|
| 提示 1 | -37 分 | 模型檔為 model_checkpoint.pkl |
| 提示 2 | -62 分 | 用 pickletools.dis() 反組譯、不執行 |
| 提示 3 | -125 分 | 尋找參照 os.system 或 subprocess.run 的 GLOBAL opcode |
Flag 3:資料破壞
情境
訓練資料集被以後門樣本投毒。一小比例的訓練樣本含觸發片語,使模型產生特定(錯誤)分類。請辨識觸發片語與目標標籤以構成旗幟。
思考方向
統計分析
分析資料集的標籤分佈。尋找特定文字模式與標籤間的異常關聯。
N-gram 分析
搜尋於某一類別中不成比例出現的 n-gram。觸發片語會顯示與目標標籤極高的相關性。
構成旗幟
旗幟為
FLAG\——其中觸發片語與目標標籤即為你所發現之內容。
提示
| 提示 | 扣分 | 內容 |
|---|---|---|
| 提示 1 | -45 分 | 約 2% 的訓練樣本被投毒 |
| 提示 2 | -75 分 | 觸發器是某特定類別被投毒樣本中出現之常見英文片語 |
| 提示 3 | -150 分 | 對各類別執行 n-gram 分析,尋找類別相關性 >90% 的片語 |
Flag 4:組態腐化
情境
訓練組態檔被修改以加入影響模型行為的細微變動。該修改藏於一份大型 YAML 組態檔中,於推論時改變模型如何處理輸入。
思考方向
版控分析
若組態於版控中,與先前版本做 diff。尋找不屬於正常超參數調整的變動。
語意分析
仔細閱讀組態。尋找不符合預期綱要之條目、不尋常前處理步驟,或修改輸出之 post-processing hook。
找出隱藏條目
後門為某條 post-processing 規則,於特定條件下修改模型輸出。旗幟以該規則條件字串編碼。
提示
| 提示 | 扣分 | 內容 |
|---|---|---|
| 提示 1 | -45 分 | 組態超過 200 行——修改位於 postprocessing 段 |
| 提示 2 | -75 分 | 尋找具 Base64 編碼條件的規則 |
| 提示 3 | -150 分 | 對 postprocessing override 規則中 Base64 字串解碼 |
計分與 CTF 結束後
完成所有四面旗幟展現了完整的 ML 供應鏈資安評估能力。這些攻擊向量對應到現實中已影響生產級 ML 系統的供應鏈入侵。
供應鏈安全檢核表
完成本 CTF 後,以下檢核表可用於真實世界 ML 供應鏈稽核:
| 元件 | 驗證方式 | 工具 |
|---|---|---|
| Python 套件 | 將名稱與 PyPI 規範比對;檢視 __init__.py 與 setup.py 中可疑程式 | pip-audit、safety、人工審視 |
| 模型檔 | 分析序列化格式;掃描 pickle 檔之程式執行 payload;驗證雜湊與已發布 checksum | pickletools、fickling、safetensors-check |
| 訓練資料 | 對標籤異常做統計分析;對觸發模式做 n-gram 分析;驗證資料來源 | 自製腳本、pandas、nltk |
| 組態 | 與版控基線 diff;綱要驗證;掃描編碼字串或不尋常條目 | diff、YAML schema 驗證器 |
| 預訓練模型 | 依已發布基準進行行為指紋;權重分佈分析 | 自製評估腳本 |
ML 供應鏈的縱深防禦
沒有任何單一檢查能攔截所有供應鏈入侵。有效的防禦需於每一階段驗證:
- 相依釘選與雜湊驗證。 釘選確切套件版本並驗證雜湊。使用 lockfile。新增相依前稽核。
- 安全模型格式。 優先選擇 SafeTensors 或 ONNX,避免以 pickle 為本之格式。若無可避免地使用 pickle,請以沙箱載入。
- 資料來源追蹤。 為訓練資料自來源、前處理、至訓練維持保管鏈。
- 組態管理。 將所有組態納入版控,對變動要求程式碼審查。並對預期結構進行綱要驗證。
- 行為驗證。 部署前對模型執行行為測試,偵測因任何供應鏈入侵所引入之行為異常。
相關主題
- ML 管線投毒 - 完整管線入侵實驗
- 模型登錄入侵 - 登錄特定攻擊技術
- 供應鏈破壞者 CTF - 更多供應鏈挑戰
- 基礎設施安全 - 部署階段安全
參考資料
- "BadNets: Identifying Vulnerabilities in the Machine Learning Model Supply Chain" - Gu et al.(2019)- 奠基性的 ML 供應鏈後門研究
- "Backdoor Attacks on Pre-trained Models by Layerwise Weight Poisoning" - Li et al.(2021)- 權重層級的模型投毒技術
- "Risks of AI-Specific Supply Chain Attacks" - Trail of Bits(2024)- 完整的 ML 供應鏈威脅分析
- "Never a Dill Moment: Exploiting Machine Learning Pickle Files" - Muñoz(2023)- 對 ML 模型檔的 pickle 反序列化攻擊
為什麼以 pickle 為本之模型檔於 ML 供應鏈特別危險?