隨著 AI 模型在功能和創建成本方面的增長,它們保存了更多敏感或專有數據,保護靜態數據變得越來越重要。為此,組織正在設計策略和工具,通常作為數據丟失預防和安全供應鏈計劃的一部分,以保護模型權重。
雖然安全工程討論的重點是預防(我們如何預防 X?),但檢測(發生了 X 嗎?)是成熟的深度防御框架中類似的關鍵部分。這一部分可顯著縮短檢測、隔離和補救入侵所需的時間。目前,對于 AI 模型的檢測功能與用于監控任何其他敏感數據的檢測功能相同,沒有任何檢測功能專注于 AI/ML 的獨特性。
在本文中,我們將介紹 canary,然后展示如何使用 canary 令牌增強適用于 AI 和 ML 模型的常見 Python Pickle 序列化格式,以提供超出普通網絡監控解決方案的其他 AI 特定的損失檢測功能。雖然首選像 safetensors 這樣的更安全的模型格式,但組織仍然支持 Pickle 支持的模型文件的原因有很多,在其中構建防御是良好風險緩解策略的一部分。
Canaries:輕量級線
在最基本的層面上,canaries 是環境中留下的偽影,這些偽影是良性用戶不可能訪問的。例如,授權用戶通常會記住自己的密碼,但是一般來說,用戶不會在憑據文件中搜索密碼,然后嘗試使用這些憑據對網絡上的服務進行身份驗證。
安全工程師可以創建虛假憑據,將其留在可發現的位置,并在憑據被使用時生成警報,以調查其訪問和使用情況。這是 CanaryTokens 背后的邏輯。Canary tokens 相對來說生成速度快、簡單,幾乎無需維護,可以在基礎設施中處于休眠狀態數月。如果正確放置,很少會出現誤報。
Thinkst Canary 是一項安全服務,幫助創建和監控金絲雀。它們支持各種格式和結構。在這種情況下,我們專注于 DNS Canarytokens。
Thinkst 會為您要創建的每個 Canary 令牌動態生成唯一的主機名。如果該主機名在 DNS 中被查詢,您將收到警報。該功能具有驚人的可擴展性,并提供創建自定義域的功能。此外,該功能還允許您根據需要創建自定義域。
雖然這篇博客文章主要介紹了自動 Canary 創建,但您也可以手動使用 免費版本的 Canarytoken,或構建和維護自己的 Canary 跟蹤和警報系統。
機器學習模型格式
最近對機器學習安全性的關注通常集中在 Python Pickle 和 Pickle-backed 文件格式的反序列化漏洞上。雖然這顯然包括以 .pkl
結尾的文件,但也可能包括由 PyTorch 或其他 ML 相鄰庫(如 NumPy)生成的文件。
如果用戶加載不受信任的 Pickle,他們將面臨任意代碼執行的風險。這意味著他們可能會遭受惡意軟件的攻擊,影響主機或機器學習系統的安全。任意代碼執行的大部分分析和范圍都集中在惡意軟件對主機或機器學習系統的潛在影響上。
我們問自己:“如果我們 必須 使用具有這種漏洞能力的模型,可以將其用于善事嗎?”
機器學習模型 Canary
向序列化模型構件中注入代碼相對容易,該構件會將信標作為金絲雀。例如,在我們的初始研究中,我們使用 Thinkst DNS Canarytokens 來保留所有原始功能,同時在加載時也會以靜默方式向 Thinkst 發出信標。
我們可以使用此功能來跟蹤使用情況或確定是否有人使用不應該使用的模型(真正的 Canary)。如果必要,我們可以通過此警報觸發事件響應操作手冊或獵殺操作。圖 1 顯示了從 Canary 生成到未經授權的用戶生成警報的工作流程。

如下代碼塊所示,此方法易于與 Thinkst Canary 一起實施,也可以與專有服務器端跟蹤功能一起使用。
生成新模型神器后,可以將其放置在授權用戶不太可能訪問的位置。Canary 需要很少的主動監控。設置它們,然后忘記它們,直到觸發警報。
def inject_pickle(original: Path, out: Path, target: str ): """ Mock for a function that takes a pickle-backed model file, injects code to ping <target> and writes it to an output file """ return def get_hostname(location: str ) - > str : """ Register with Thinkst server and get DNS canary """ payload = { 'auth_token' : api_key, 'memo' : f "ML Canary: {location}" , 'kind' : 'dns' , } r = requests.post(url, data = payload) return r.json()[ "canarytoken" ][ "hostname" ] def upload( file : Path, destination: str ): """ Mock for uploading a file to a destination """ return def create_canary(model_file: Path, canary_file: Path, destination: str ): """ Register a new canary with Thinkst and generate a new 'canarified' model """ host = get_hostname(memo = f "Model Canary at {destination}/{canary_file.name}" ) inject_pickle(model_file, canary_file, host) upload(canary_file, destination) create_canary( "model.pkl" , "super_secret_model.pkl" , "s3://model-bucket/" ) |
所提供的代碼包含一個差異,該差異演示了如何在序列化模型前面追加一個對 exec
的調用。此調用充當我們 Canary DNS 端點的信標。
< 000001b0 : 5496 3949 d7f8 bf94 8694 5294 8c10 5f73 T. 9I ......R..._s < 000001c0 : 6b6c 6561 726e 5f76 6572 7369 6f6e 948c klearn_version.. < 000001d0 : 0531 2e31 2e33 9475 622e . 1.1 . 3.ub . - - - > 000001b0 : 5496 3949 d7f8 bf94 8694 5280 0263 5f5f T. 9I ......R..c__ > 000001c0 : 6275 696c 7469 6e5f 5f0a 6578 6563 0a28 builtin__. exec .( > 000001d0 : 637a 6c69 620a 6465 636f 6d70 7265 7373 czlib.decompress |
以下是它的實際運作方式。安全工程師創建了一個 Canary 模型文件,并將其放置在私有資源庫中。幾個月后,Thinkst Canary 警報被觸發,啟動了為保護私有資源庫和敏感模型而定制的事件響應流程。在這個早期階段,防御者可以利用這個信號來識別、隔離和補救導致未經授權的訪問的配置錯誤。
基本的加載信標
功能可能只是開始,這是任意代碼執行的美妙之處。這種技術可以擴展到更精細的主機指紋識別,或者其他網絡欺詐操作。
安全的 AI 策略
安全的 AI 策略可以從安全的文件格式和強大的預防性控制入手。為降低剩余風險,重要的是要考慮在檢測策略中添加金絲雀功能,以便在未經授權的用戶訪問專有模型時收到警報。
與其他防御性控制相比,Canary 模型易于實施,無需維護或開銷,并且可以生成可行的警報。這些技術使我們朝著一個世界邁進,在這個世界中,未經授權的用戶在搜索、exfiltrating 和執行模型之前應該三思而后行。
有關 AI 安全的更多信息,請查看其他 NVIDIA 技術博客 posts。
致謝
我們要感謝美國軍事學院學員詹姆斯·魯伊茲在 NVIDIA AI Red Team 的學術個人高級開發經驗期間,對模型 Canaries 原型設計所做出的貢獻。
?