結論と決定条件
- まず、モデル、推論ランタイム、前処理・後処理ロジック、プロンプトテンプレート、API 認証情報、キャッシュ、ログ、およびサーバー側リソースを個別に棚卸ししてください。
- ファイル暗号化は静的保存段階を保護しますが、ロード後のランタイム状態、API 呼び出し、および出力には別途制御が必要です。
- 長寿命の高特権 API キーをクライアントシークレットとして保管すべきではありません。サーバー側プロキシ、短命トークン、最小権限の原則、および取り消し可能な戦略を優先してください。
- Play Integrity や App Attest はアプリケーションインスタンスや環境の証拠を提供しますが、最終的な認可とリスク対策はサーバー側で実施する必要があります。
モバイル AI アプリケーションを 7 つのアセットクラスに分解する
モバイル AI セキュリティは往々にして「モデルが暗号化されているか」だけに単純化されがちですが、実際にはモデルファイル、推論ランタイム、入力前処理、出力後処理、プロンプトまたは業務ルール、リモート API 認証情報、ユーザーデータ、ログなど、少なくともこれらが攻撃対象領域に含まれます。各アセットクラスは漏洩時の影響、更新メカニズム、所有権の責務が異なります。
モデル重みのコピーは知的財産の窃取や業務能力の喪失につながり、プロンプトテンプレートや後処理ロジックの改ざんは業務挙動の変更を招きます。長寿命 API キーの漏洩は直接的な金銭的損失、不正なデータアクセス、リソース乱用を引き起こす可能性があり、入出力ログにはユーザープライバシーデータが含まれる場合があります。モデルファイルのみを保護しても、これらの残存リスクをカバーできません。
資産台帳には、保管場所、生成元、伝送経路、ランタイムでの使用パターン、更新およびロールバックの仕組み、最小権限の原則、ログの対象範囲、保持期間を記載する必要があります。ライフサイクルが定義されていない資産は、暗号化スイッチを有効にしただけで保護されたと見なしてはなりません。
| 資産 | 主要なリスク | 優先コントロール | 代替不可 |
|---|---|---|---|
| モデルファイル | コピー、静的解析、バージョン置換 | 制御された配信、ファイル保護、整合性チェック、バージョン紐付け | API 認可 |
| 推論ランタイム | インジェクション、デバッグ、メモリ検査、依存関係のリスク | アプリケーションハードニング、依存関係ガバナンス、異常検知および互換性検証 | モデルファイルの暗号化のみ |
| 前処理・後処理ロジック | ルールの逆算または改ざん | クリティカルパスの保護、サーバー側検証、回帰テスト | モデル重みの保護 |
| API 認証情報 | 不正利用、コスト超過、データ権限のエスカレーション | サーバーサイドプロキシ、短命トークン、権限制限、ローテーション | コード難読化またはモデル暗号化 |
| ユーザー入力/出力 | プライバシー漏洩、インジェクション攻撃、機密データの反映 | 最小限の収集、フィルタリング、マスキング、アクセス制御 | デバイス暗号化に関する一般的な約束 |
| ログとキャッシュ | 機密情報の長期保持 | 分類、マスキング、有効期限設定、制御されたエクスポート | 単一のデバッグスイッチの無効化 |
| サーバーサイドリソース | 不正な関数呼び出しと自動化された悪用 | アカウントポリシー、クォータ、行動分析、バージョニング、整合性戦略 | クライアント側で自己申告される信頼 |
モデルファイルはランタイム中に利用可能な状態になる必要がある
Core ML、LiteRT、その他のオンデバイスランタイムのいずれを使用する場合でも、モデルは読み込まれ、解析され、計算に供される必要があります。ファイルレベルの暗号化は、インストールパッケージやアプリディレクトリからの直接コピーの手間を増やすだけであり、実行中のアプリケーションがモデル素材にアクセスすることを防げません。攻撃者がプロセスを制御するか、ランタイムを観察できる場合、リスクモデルは静的ファイルから、読み込み、メモリ、関数呼び出し、および出力へと移行します。
これはモデル暗号化に価値がないことを意味するものではありません。安易なコピーのコストを引き上げ、直接的な置換を防ぎ、パッケージ保護、完全性チェック、ランタイム環境検出、バージョン紐付けと併せて多層防御戦略の一環を構成します。重要なのは、抽出が不可能だと主張するのではなく、攻撃者のコストを増大させ、露出面(blast radius)を縮小するという観点でメリットを提示することです。
モデルの更新は互換性の課題も引き起こします。モデルバージョンは、前処理ロジック、特徴量の形状、ランタイムバージョン、ハードウェア機能、後処理ルールと紐付ける必要があります。更新失敗時には、旧モデルと新ロジックがランダムに組み合わされる事態を防ぐため、安全なロールバックが必須です。
| フェーズ | 露出面 | 制御の焦点 | 検証質問項目 |
|---|---|---|---|
| ビルドとパッケージング | リポジトリ、CI パイプライン、インストールパッケージ、およびリソースディレクトリ | アクセス制御、キー分離、ファイル保護、およびアーティファクトの真正性 | 最終パッケージに含まれるモデルと設定は何か。 |
| ダウンロードと更新 | ネットワーク、キャッシュ、およびバージョン切り替え | 伝送保護、署名または完全性チェック、アトミックな置き換え、およびロールバック | 異常な更新により、整合性のないモデルがロードされるリスクはあるか。 |
| ロードと推論 | プロセスメモリ、ランタイムインターフェース、およびハードウェアバックエンド | ランタイム保護、最小限の常駐、例外処理、および互換性 | モデルはいつ利用可能になり、失敗時に実行をどのように停止させるか。 |
| 出力とログ記録 | 結果、信頼度スコア、デバッグ情報、およびユーザーデータ | 最小限の出力、マスキング、アクセス制御、および有効期限 | ログにモデルの詳細や機密ユーザー情報が漏洩していないか。 |
長寿命かつ高権限の API キーをクライアントシークレットとして扱ってはならない
Android のセキュリティ文書では、ソースコードに埋め込まれた API キーはアプリコンパイル後の逆コンパイルにより発見され得ると明記されています。難読化やアプリケーションハードニングにより特定のコストを引き上げることはできますが、クライアントがこれらの認証情報を保持・使用しなければならない事実を変えることはできません。汎用的なクライアント内でキーが長寿命かつ高権限であり続ける限り、漏洩時の影響(blast radius)を制限することは困難です。
Android Keystore は特定の鍵素材のエクスポートを防げますが、公式ドキュメントではアプリケーションプロセスが侵害された場合、攻撃者がアプリの鍵を使用して操作を実行できる可能性があることが明記されています。これはデバイスに紐付けられた秘密鍵やローカル暗号化の保護に適していますが、リモートサービス向けの任意の長寿命共有シークレットに対する安全な保管庫であると誤解してはなりません。
より堅牢なアーキテクチャでは、クライアントがユーザー ID とデバイスコンテキストに基づき自社のサービスから短寿命で制限付きかつ失効可能なトークンを要求するか、サーバーサイドプロキシが高リスクなモデル呼び出しを処理する必要があります。サーバーはアカウント認可、クォータ、レート制限、モデルスコープ、データスコープ、および異常行動の監視を強制しなければなりません。
- 開発、テスト、本番環境ごとに認証情報を分離する
- トークンが持つモデルおよびデータの権限を最小限に抑える
- サーバーサイドでの失効機能を有効化し、クォータとレート制限を強制する
- クライアントが長寿命の高権限共有鍵を保存することを防止する
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 は、デバイス鍵の生成、ワンタイムチャレンジの発行、サーバー上でのアテステーション検証、および後続のアサーション処理を通じて、リクエストが有効なアプリインスタンスから発信されたかをサーバーが判断するのに役立ちます。共通点は、証拠の最終検証がサーバーによって行われることです。
これらの仕組みには明確な境界があります。Play 関連のシグナルは配布ソース、デバイス状態、サービス条件の影響を受けます。また Apple のドキュメントでは、App Attest がすべてのデバイスタイプでサポートされているわけではなく、単一のポリシーですべての不正を排除できるわけではないと記載されています。サーバーは「成功」「失敗」「利用不可」「一時的エラー」「未設定」の状態を区別しなければなりません。「利用不可」を直接攻撃とみなしたり、クライアント側で最終判断を下したりしてはなりません。
完全性シグナルとモデル暗号化は異なる課題に対処します。前者はアプリケーションインスタンスとランタイム環境の検証を支援し、後者は静的モデルの露出を低減します。真の認可には、アカウントコンテキスト、ビジネスリソースチェック、バージョン検証、リクエスト内容分析、クォータ強制、および行動コンテキストが依然として必要です。
| レイヤー | 提供機能 | 検証担当者 | 一般的な誤用 |
|---|---|---|---|
| モデルファイル保護 | 静的ストレージへのアクセスおよび置換に対する耐性 | クライアントおよび配送チェーン | ファイル暗号化を API 認可とみなすこと |
| Play インテグリティ | Android アプリ、デバイス、アカウント、および環境に関連するシグナル | サーバー側 | クライアント自身が信頼済みのブール値を返すこと |
| App Attest | Apple アプリインスタンスキーのアテステーションとアサーション | サーバー側 | チャレンジ、カウンター、または非対応デバイスを無視すること |
| アカウントおよびビジネスポリシー | ユーザーが特定のモデル、データ、およびクォータにアクセス可能かどうか | サーバー側 | ユーザー権限を無視してデバイスシグナルのみに依存すること |
| 行動リスク制御 | レート制限、リプレイ検知、大量悪用防止、および異常なコンテキストの検出 | サーバー側 | 単一のパス後に永続的な信頼を付与すること |
モバイル AI アプリケーションの検証には、静的、ランタイム、およびサーバー側の視点が必要
静的チェックは、インストールパッケージ内にどのモデル、設定、文字列、認証情報、およびデバッグリソースが存在するかを回答します。ランタイムチェックは、モデルがどのようにロードされるか、失敗がどのように処理されるか、ログがデータを漏洩していないか、アップデートがロールバック可能かを回答します。サーバー側チェックは、アカウント、バージョン、完全性、クォータ、およびデータ権限が実際に強制されているかを回答します。これら 3 つのエビデンスタイプのいずれかが欠けると、結論が部分的な視点に偏ります。
テストでは、固有のリリース候補と明示的なモデルバージョンを使用し、対象システム、デバイス機能、ランタイムバックエンド、モデルソース、および更新状態を文書化する必要があります。オンデバイス推論のパフォーマンス、メモリ使用量、および互換性は、モデル構造、量子化、ハードウェア、およびランタイムに依存するため、他のモデルやデバイスからの数値を引用することはできません。
例外パスは重要です。モデルファイルの欠落または破損、更新の中断、非対応ランタイム、サーバートークンの有効期限切れ、完全性シグナルの利用不可、ログアップロードの失敗、およびユーザー権限の取り消しが該当します。システムは安全に縮退し、ユーザーと運用チームの双方に対して回復可能な状態を提供する必要があります。
| エビデンスの対象範囲 | チェック内容 | 合格条件 | 結論の適用限界 |
|---|---|---|---|
| インストールパッケージ(静的) | モデル、鍵、設定、ログマーカー、およびデバッグリソース | 長寿命な高権限シークレットを排除し、モデル配信が設計と整合していること | ランタイムが観測不能であることを証明できない |
| モデルランタイム | 読み込み、メモリライフサイクル、エラー処理、パフォーマンス、およびロールバック | 対象デバイス上で安定動作し、安全な例外処理を実装していること | サーバー側認可の正当性を証明できない |
| ネットワークと認証情報 | トークンの有効性、権限、ローテーション、リプレイ保護、および証明書ポリシー | 最小権限の原則と取り消し可能性 | モデルファイルが保護されていることを証明できない |
| サーバー側ポリシー | アカウント、バージョン、完全性、クォータ、および挙動 | 高リスクリソースの最終判断はサーバーが行うこと | 単一のプラットフォームシグナルを絶対的に信頼してはならない |
| プライバシーとログ | 入出力、キャッシュ、診断情報、およびエクスポート | 収集の最小化、マスキング、および有効期限の設定 | ビジネスデータ分類要件と組み合わせることが必須 |
設計結論とスコープの制限事項
モデル暗号化は有効だが、モデルライフサイクルにおける一つの制御点に過ぎない。商用 AI アプリでは、前後処理ロジックの保護、長寿命な高権限鍵のクライアント流入防止、サーバーによる最終認可の実施、プラットフォーム完全性シグナルに対するフォールトトレランスの実装、およびユーザーデータとログのガバナンスも必要である。
実際のリリース候補、モデルバージョン、対象デバイス、およびサーバー側インターフェースがない現状では、アーキテクチャと未検証項目のレビューのみが可能である。モデルの抽出耐性、インターフェースの悪用耐性、ランタイムインジェクションのブロック、またはパフォーマンス目標の達成を主張することはできない。これらの結論には、現時点でのエビデンスパッケージが必要である。
本ページの Yudun によるアクションエントリーポイントは、アプリケーションハードニングと互換性評価の申請用であり、特定のモデルフレームワークや AI 専用機能の検証を表すものではない。プロジェクトスコープは、技術スタック、モデル配信方法、および重要なビジネスパスを提出した後、別途確定する必要がある。
- モデル、ランタイム、認証情報、およびデータ用に個別の登録簿を維持すること
- 高リスクな関数呼び出しの最終認可をサーバーに行わせること
- プラットフォームシグナル利用不可時の代替経路と機能低下モードを用意すること
- モデル更新において、検証、アトミックスイッチング、およびロールバックをサポートすること
- すべての結論を特定のリリース候補とモデルバージョンに紐付けること
証拠と適用可能性の境界
このセクションでは、文書化されたプラットフォームの事実、技術的な判断、および未検証の製品主張に一般化できない制限を分けて説明します。
| 条文判決 | 事実または工学的根拠 | 適用制限 |
|---|---|---|
| クライアントにコンパイルされた API キーは、デコンパイルにより発見される可能性があります。 | 公式の Android セキュリティチェックリストでは、ソースコードに API キーが含まれている場合、攻撃者がアプリをデコンパイルしてこれらのリソースを特定できると明記されています。 | ベンダーのルールに基づき、プラットフォーム制限付きの低権限キーがクライアント上に存在する場合がありますが、スコープの制限と監視は依然として必須です。 |
| Android Keystore は、侵害されたプロセスがキーを使用することを防げません。 | 公式の Android ドキュメントによると、キー素材のエクスポートを防ぐことはできても、アプリケーションプロセスが侵害されれば、攻撃者はそのアプリのキーを利用できてしまいます。 | 具体的な保護機能は、キーの用途、ハードウェアサポート、認証制約、および実装の詳細に依存します。 |
| App Attest によるアテステーションとアサーションは、サーバー側で検証する必要があります。 | Apple の公式ワークフローでは、サーバー側のチャレンジ、アテステーションの検証、公開鍵の保存、および後続のアサーションカウンターを用います。 | すべてのデバイスタイプが対応しているわけではなく、Apple も単一のポリシーですべての不正を排除できるわけではないと明言しています。 |
| モデルファイルの保護だけで、サーバー側のリソース認可を代替することはできません。 | これらは異なる対象を保護します。一方はクライアント側のファイルとランタイム素材を対象とし、他方はアカウント、モデル、データ、およびクォータの権限を対象とします。 | これはアーキテクチャ上の責任範囲に関する判断であり、特定のモデル暗号化の実装が検証を通過したことを意味するものではありません。 |
| オンデバイスモデルのパフォーマンスと互換性に関する結論は、特定のモデルとデバイスに紐付ける必要があります。 | モデル構造、量子化手法、ランタイム、ハードウェアバックエンド、システムバージョン、および入力規模が結果に複合的に影響します。 | 本記事は、Yudun モデルのパフォーマンス数値を提供することも示唆することもありません。 |
エンジニアリングに関する質問
モデルはすでに暗号化されているのに、なぜ API キーをアプリ内に配置してはいけないのですか?
モデル暗号化はモデルファイルを保護しますが、API キーはリモートリソースへのアクセス credential です。クライアントでキーを使用する必要がある場合、攻撃者は静的解析やランタイム観測を通じてそれを取得したり悪用したりする可能性があります。
API キーを Android Keystore に保存すれば、絶対に安全ですか?
Keystore はキー素材のエクスポートリスクを低減できますが、アプリケーションプロセスが侵害されればキーの呼び出し(function invocation)は依然として可能です。これはデバイスバインド型の操作に適しており、サーバー側の最小権限原則や短命トークンの代替にはなりません。
Play Integrity や App Attest を通過したデバイスは、永続的に信頼できますか?
いいえ。これらは特定の時点と文脈における証拠にすぎません。サーバーは、シグナルの利用不可や状態変化に対処しつつ、アカウント、リクエスト、バージョン、クォータ、および動作の検証を引き続き実施する必要があります。
オンデバイスモデルをサーバーへ移行する必要がありますか?
必ずしも必要ではありません。オフライン環境、プライバシー機密性の高い場面、低遅延が求められるユースケースでは、オンデバイス推論が必要です。資産は価値とビジネス要件に応じて階層化し、高リスクな権限や長寿命の秘密鍵はサーバー側に保持すべきです。
モデルサンプルなしで実施可能な評価にはどのようなものがありますか?
資産、デリバリーチェーン、認証情報アーキテクチャ、更新戦略、および検証計画のレビューは可能ですが、モデル抽出防止、ランタイム保護、あるいはパフォーマンス互換性が合格したと断言することはできません。
独自のアプリでこれをテストしてみませんか?
Yudun PoC と互換性評価のために、リリース候補、ターゲット システム、重要なビジネス パスを提出します。