先看結論與判斷條件
- 先分別盤點模型、推理執行時、預後處理邏輯、提示模板、API 憑據、快取、日誌和服務端資源。
- 檔案加密保護靜態儲存階段,模型載入後的執行狀態、呼叫介面和輸出仍需單獨控制。
- 長期高許可權 API Key 不應作為客戶端秘密,優先使用服務端代理、短期令牌、最小許可權和可撤銷策略。
- Play Integrity 與 App Attest 可以提供應用例項或環境證據,但最終授權和風險處置仍在服務端。
先把移動 AI 應用拆成七類資產
移動 AI 安全經常被簡化成模型有沒有加密。實際攻擊面至少包含模型檔案、推理執行時、輸入預處理、輸出後處理、提示或業務規則、遠端 API 憑據、使用者資料與日誌。每類資產的洩露後果、更新方式和責任人不同。
模型權重被複制可能造成智慧財產權和業務能力外洩;提示模板或後處理邏輯被修改可能改變業務行為;長期 API Key 洩露可能直接產生費用、資料訪問或資源濫用;輸入輸出日誌則可能包含使用者隱私。只保護模型檔案,不能覆蓋其餘風險。
資產表應記錄存放位置、生成來源、傳輸路徑、執行時使用方式、更新和回滾機制、最小許可權、日誌範圍與保留週期。無法說明生命週期的資產,不應僅靠一個加密開關獲得已保護結論。
| 資產 | 主要風險 | 優先控制 | 不能由什麼替代 |
|---|---|---|---|
| 模型檔案 | 複製、靜態分析、版本替換 | 受控交付、檔案保護、完整性和版本配對 | 介面鑑權 |
| 推理執行時 | 注入、除錯、記憶體觀察和依賴風險 | 執行時加固、依賴治理、異常與相容驗證 | 只給模型檔案加密 |
| 預後處理邏輯 | 規則被還原或修改 | 關鍵路徑保護、服務端複核和迴歸 | 模型權重保護 |
| API 憑據 | 濫用、費用和資料越權 | 服務端代理、短期令牌、限權和輪換 | 程式碼混淆或模型加密 |
| 使用者輸入輸出 | 隱私洩露、注入和敏感資訊回顯 | 最小收集、過濾、脫敏和訪問控制 | 裝置加密的泛化承諾 |
| 日誌與快取 | 長期留存敏感材料 | 分類、脫敏、過期和受控匯出 | 關閉一個除錯開關 |
| 服務端資源 | 未授權呼叫和自動化濫用 | 賬號、額度、行為、版本與完整性策略 | 客戶端自報可信 |
模型檔案在執行時必須變成可用材料
無論使用 Core ML、LiteRT 或其他端側執行時,模型都要被載入、解析並參與計算。檔案層加密可以減少從安裝包或應用目錄直接複製的便利性,卻不能讓執行中的應用不接觸模型材料。攻擊者若能夠控制程序或觀察執行時,風險模型會從靜態檔案轉向載入、記憶體、呼叫和輸出。
這並不說明模型加密沒有價值。它能減少低成本複製、阻止直接替換,並與包體保護、完整性、執行環境檢測和版本配對形成縱深防禦。關鍵是把結論寫成提高成本和縮小暴露面,而不是無法提取。
模型更新還會引入相容問題。模型版本必須與預處理、特徵形狀、執行時版本、硬體能力和後處理規則配對。更新失敗時需要安全回滾,不能讓舊模型與新邏輯隨機組合。
| 階段 | 暴露面 | 控制重點 | 驗證問題 |
|---|---|---|---|
| 構建與打包 | 倉庫、CI、安裝包和資源目錄 | 訪問控制、金鑰隔離、檔案保護和產物身份 | 最終包中出現了哪些模型和配置 |
| 下載與更新 | 網路、快取和版本切換 | 傳輸保護、簽名或完整性、原子替換和回滾 | 異常更新是否會載入不匹配模型 |
| 載入與推理 | 程序記憶體、執行時介面和硬體後端 | 執行時保護、最小駐留、異常處理和相容 | 模型何時可用,失敗如何停止 |
| 輸出與日誌 | 結果、置信度、除錯資訊和使用者資料 | 最小輸出、脫敏、訪問控制和過期 | 日誌是否洩露模型或使用者敏感資訊 |
長期高許可權 API Key 不應成為客戶端秘密
Android 安全文件明確指出,應用被編譯後,原始碼中的 API Key 可能透過反編譯被發現。混淆和加固可以增加定位成本,卻不能改變客戶端必須持有和使用該憑據的事實。只要金鑰在通用客戶端中長期有效且許可權很高,洩露後的影響就難以限制。
Android Keystore 可以讓某些金鑰材料保持不可匯出,但官方也說明,當應用程序被攻破時,攻擊者可能仍然能夠使用應用的金鑰執行操作。它適合保護裝置繫結的私鑰和本地加密,不應被誤解為可以安全存放任意遠端服務的長期共享金鑰。
更穩妥的架構是讓客戶端透過使用者身份和裝置上下文向自有服務申請短期、限權、可撤銷的令牌,或者由服務端代理高風險模型呼叫。服務端實施賬號授權、額度、速率、模型範圍、資料範圍和異常行為監控。
- 憑據按開發、測試和生產隔離
- 令牌具有最小模型和資料許可權
- 服務端可撤銷並限制額度與速率
- 客戶端不儲存長期高許可權共享金鑰
request = verify_user_session(input.session)
app = verify_app_evidence(input.attestation)
policy = load_policy(user=request.user, app=app.identity)
if policy.version_state == UNKNOWN:
return CHALLENGE_OR_LIMIT
if policy.account_scope.allows(input.model_scope) == false:
return DENY
if policy.risk_score >= HIGH:
return STEP_UP_VERIFICATION
return issue_short_lived_token(
scope=input.model_scope,
quota=policy.quota,
expires_in=policy.short_window
)完整性訊號只能參與服務端決策
Play Integrity 可以為 Android 後端提供應用識別、裝置完整性、賬號許可和部分環境風險訊號。Apple App Attest 透過裝置生成金鑰、一次性挑戰、服務端驗證 attestation 和後續 assertion,幫助服務端判斷請求是否來自有效應用例項。兩者的共同點是證據最終由服務端驗證。
這些機制也有明確邊界。Play 相關訊號受分發來源、裝置和服務狀態影響;Apple 文件說明 App Attest 並非所有裝置型別都支援,而且單一策略不能消除所有欺詐。服務端應區分透過、失敗、不可用、暫時錯誤和未配置,不應把不可用直接等同攻擊,也不應在客戶端本地完成最終判定。
完整性訊號與模型加密解決不同問題。前者幫助驗證應用例項和執行環境,後者降低模型靜態暴露。真正的授權仍需要賬號、業務資源、版本、請求內容、額度和行為上下文。
| 層 | 提供什麼 | 由誰驗證 | 常見誤用 |
|---|---|---|---|
| 模型檔案保護 | 靜態儲存和替換阻力 | 客戶端與交付鏈 | 把檔案加密當成介面授權 |
| Play Integrity | Android 應用、裝置、賬號和環境相關訊號 | 服務端 | 客戶端自己返回可信布林值 |
| App Attest | Apple 應用例項金鑰的 attestation 與 assertion | 服務端 | 忽略 challenge、計數器或不支援裝置 |
| 賬號與業務策略 | 使用者是否能訪問特定模型、資料和額度 | 服務端 | 只看裝置訊號不看使用者許可權 |
| 行為風控 | 速率、重放、批次濫用和異常上下文 | 服務端 | 一次透過後永久信任 |
驗證移動 AI 應用要同時看靜態、執行和服務端
靜態檢查回答安裝包裡有哪些模型、配置、字串、憑據和除錯資源;執行檢查回答模型如何載入、失敗如何處理、日誌是否洩露、更新能否回滾;服務端檢查回答賬號、版本、完整性、額度和資料許可權是否真正生效。三類證據缺一類,結論都會偏向區域性。
測試應使用唯一候選包和明確模型版本,記錄目標系統、裝置能力、執行時後端、模型來源和更新狀態。端側推理的效能、記憶體和相容性與模型結構、量化、硬體和執行時有關,不能引用其他模型或裝置的數字。
異常路徑尤其重要:模型檔案缺失或損壞、更新中斷、執行時不支援、服務端令牌過期、完整性訊號不可用、日誌上傳失敗、使用者撤回許可權。系統必須安全降級,並且給使用者和運維可恢復的狀態。
| 證據面 | 檢查內容 | 透過條件 | 結論邊界 |
|---|---|---|---|
| 安裝包靜態面 | 模型、金鑰、配置、日誌標記和除錯資源 | 無長期高許可權秘密,模型交付符合設計 | 不能證明執行時不可觀察 |
| 模型執行面 | 載入、記憶體生命週期、錯誤、效能和回滾 | 目標裝置穩定且異常安全 | 不能證明服務端授權正確 |
| 網路與憑據 | 令牌時效、許可權、輪換、重放和證書策略 | 最小許可權且可撤銷 | 不能證明模型檔案受保護 |
| 服務端策略 | 賬號、版本、完整性、額度和行為 | 高風險資源由服務端最終決定 | 不能把單一平臺訊號當絕對可信 |
| 隱私與日誌 | 輸入輸出、快取、診斷和匯出 | 最小收集、脫敏和可過期 | 需結合業務資料分類要求 |
設計結論與不能承諾的範圍
模型加密值得做,但它屬於模型生命週期中的一個控制點。商業 AI App 還需要保護預後處理邏輯、避免長期高許可權金鑰進入客戶端、讓服務端完成最終授權、對平臺完整性訊號做容錯,並治理使用者資料和日誌。
沒有真實候選包、模型版本、目標裝置和服務端介面時,只能評審架構和待驗證項,不能聲稱模型防提取、介面防濫用、執行時注入阻斷或效能透過。任何此類結論都需要當前證據包。
御盾在本頁的行動入口用於申請 App 加固與相容性評估,不代表已經驗證某個模型框架或某項 AI 專屬能力。專案範圍應在提交技術棧、模型交付方式和關鍵業務路徑後單獨確認。
- 模型、執行時、憑據和資料分別建賬
- 高風險呼叫由服務端最終授權
- 平臺訊號具有不可用和降級路徑
- 模型更新可以校驗、原子切換和回滾
- 所有結論繫結候選包與模型版本
事實依據與適用邊界
以下內容區分官方事實、本文工程判斷和不能外推的範圍,避免把設計建議寫成未經驗證的產品結論。
| 本文判斷 | 事實或工程依據 | 適用限制 |
|---|---|---|
| 編譯進客戶端的 API Key 可能被反編譯發現。 | Android 官方安全清單直接說明原始碼包含 API Key 時,攻擊者可能反編譯應用並找到這些資源。 | 部分平臺限制型低許可權 Key 可以按供應商規則放在客戶端,但仍需限制範圍和監控。 |
| Android Keystore 不能讓被攻破程序失去使用金鑰的能力。 | Android 官方說明金鑰材料可保持不可匯出,但應用程序被攻破時攻擊者可能仍能使用應用的金鑰。 | 具體保護能力取決於金鑰用途、硬體支援、認證約束和實現。 |
| App Attest 的證明和 assertion 必須在服務端驗證。 | Apple 官方流程使用服務端 challenge、attestation 驗證、儲存公鑰和後續 assertion 計數器。 | 並非所有裝置型別都支援,且 Apple 明確單一策略不能消除所有欺詐。 |
| 模型檔案保護不能替代服務端資源授權。 | 兩者保護物件不同:一個面向客戶端檔案和執行材料,一個面向賬號、模型、資料和額度許可權。 | 這是架構職責判斷,不代表任何特定模型加密實現已經透過。 |
| 端側模型效能和相容結論必須繫結模型與裝置。 | 模型結構、量化方式、執行時、硬體後端、系統版本和輸入規模共同影響結果。 | 本文沒有提供或暗示御盾的模型效能數字。 |
工程常見問題
模型已經加密,為什麼還不能把 API Key 放在 App 裡?
模型加密保護模型檔案,API Key 是訪問遠端資源的憑據。客戶端必須使用該 Key 時,攻擊者仍可能透過靜態或執行觀察獲得或濫用它。
把 API Key 存到 Android Keystore 就絕對安全嗎?
Keystore 可以減少金鑰材料被匯出,但被攻破的應用程序可能仍能呼叫金鑰。它更適合裝置繫結操作,不替代服務端最小許可權和短期令牌。
Play Integrity 或 App Attest 透過後可以永久信任裝置嗎?
不可以。它們提供特定時間和上下文中的證據,服務端仍需驗證賬號、請求、版本、額度和行為,並處理訊號不可用與狀態變化。
端側模型是否一定要遷移到服務端?
不一定。離線、隱私和低時延場景可能需要端側推理。應根據資產價值和業務條件分層,並把高風險許可權與長期秘密留在服務端。
沒有模型樣本時能做什麼評估?
可以評審資產、交付鏈、憑據架構、更新策略和驗證計劃,但不能聲稱模型防提取、執行時保護或效能相容已經透過。