OZero Security
ドキュメント

はじめに

このガイドでは、OZero Security のインストールから最初のセキュリティ機能適用までを段階的に案内します。セキュリティの専門知識がなくても、約3分で基本設定を完了できます。

約3分 · Unity 2022.3 LTS+ · iOS 14.0+ / Android API 24+

目的から始める

今行いたい作業を選ぶと、このマニュアルの該当セクションまたは API リファレンスへ移動します。

3分クイックスタート パッケージをインポートし、ダッシュボードでプリセットを適用して最初のビルドを作成します。 リリース前チェックリスト ビルド整合性、プラットフォーム設定、診断、Release 構成を確認します。 機能別設定ガイド 保護モジュール、共通ポリシー、任意の Managed UI を設定します。 トラブルシューティング インポート、IL2CPP、stripping、プラットフォーム、ライセンスの問題を解決します。 ライセンス・Pro 運用 アクティベーション、Native Variant、テレメトリー、ポータルポリシー、サブスクリプションのライフサイクルを確認します。 API リファレンス 公開型、フィールド、既定値、enum、コールバック、エラーコードを確認します。

概要

OZero Security は、一般的なハッキングツールがアクセスしにくい Native C++ レイヤーでセキュリティロジックを実行し、Unity ゲームを保護します。Unity エディター内のダッシュボードでモジュールを有効化するだけで、コアな保護機能が動作します。シーンの設定や追加のコード作成は必要ありません。

基本提供される保護機能:
  • ビルド整合性検査(アプリ改ざん検知)
  • スピードハックおよびタイムハック検知
  • メモリインジェクション監視
  • 暗号化されたインゲーム変数型(Secure Types)
  • 暗号化されたセーブファイルと PlayerPrefs
コード接続が不要な自動ブートストラップおよび Config 暗号化
  • 有効化された検出器は SDK 開始時に自動的に準備されます。シーンに別のオブジェクトを配置したり、繰り返し初期化コードを記述したりする必要はありません。
  • セキュリティ設定はビルド処理中に保護され、一般プレイヤーの配布物に平文の設定が露出することはありません。
  • Native C++ ランタイムガードが、管理された Unity コードの外側で追加の検証レイヤーを提供します。
  • 検知結果はコールバック、ログ、Pro テレメトリで確認できるため、テストや運用中に原因を追跡しやすくなります。

1 パッケージのインポート

Unity エディターを開き、OZero Security パッケージをインポートします。Unity Package Manager を使用するか、.unitypackage ファイルをダブルクリックしてインポートできます。

Import Unity Package ダイアログが表示されたら、すべての項目がチェックされた状態で Import をクリックしてください。必要なスクリプト、ネイティブプラグイン、エディターツールが自動的に追加されます。

Import Unity Package dialog with all OZeroSecurity files selected
インポートの前に Unity のプレイモードを終了し、可能であればエディターを一度再起動してから進めてください。実行中のプレイヤーが OZero DLL をロードした状態では、Windows が DLL ファイルをロックし、インポートや上書きが失敗する可能性があります。インポート後、Unity がスクリプトを再コンパイルするため、右下の進行状況バーが消えるまで待ってから次のステップに進んでください。

Windows: 1.2.0 → 1.2.1 への更新中に「Copying file failed / Access is denied」が表示される場合

1.2.0 のプロジェクトに 1.2.1 をインポートすると、Plugins/x86_64/OZeroSecurity64.dll について Copying file failed … Access is denied のポップアップが表示され、Unity を再起動しても繰り返すことがあります。エディターが起動時に SDK のネイティブライブラリを読み込むため、Windows がファイルをロックすることが原因です。macOS・Linux は該当しません。次回のアップデートでこの手順が不要になるよう修正する予定です。

  1. ポップアップで Cancel を押します(Force Quit ではありません)。
  2. Unity を完全に終了します。タスクマネージャーに Unity.exe が残っていないことを確認してください。
  3. エクスプローラーで Assets/OZeroSecurity/Plugins/x86_64/ にある OZeroSecurity64.dll と OZeroPCStoreBridge64.dll だけを削除します。.meta ファイルは残してください。
  4. Unity でプロジェクトを開きます。DLL に関するコンソールエラーは無視してかまいません。
  5. Package Manager で 1.2.1 全体をもう一度 Import します。
  6. Unity を再起動し、Check Setup を実行します。

Welcome ウィンドウ

OZero SDK パッケージを import すると、Welcome ウィンドウ(Window > OZero Security > Welcome)が自動で開きます。OZero SDK パッケージを import するたびに(同じバージョンを再 import した場合も)開き、新しい SDK バージョンが初めて読み込まれたときにも開きます。Built-in TMP ダイアログパッケージや TMP リソースの import では開きません。

OZero Security Welcome window with Check Setup, Read the Manual and Security Config OZero Security Welcome window with Check Setup, Read the Manual, Security Config and Online Services

ウィンドウ上部には大きな STEP 1 · Run Setup カードが 1 枚あります。Start setup を押すと Check Setup が開き、プロジェクトにまだ必要な設定が表示され、Auto Setup が変更ごとに確認を取りながら適用します。その下には、セットアップ後に使うカードが 2 枚あります。Read the Manual には Online(OZero Web サイトのマニュアル)と Offline(パッケージに同梱された HTML マニュアル、Assets/OZeroSecurity/Documentation/HTML/index.html)のボタンがあり、同梱マニュアルがない場合 Offline ボタンは無効になります。Security Config(Open config)は Edit > Project Settings > OZero Security を開き、セットアップ後にプリセットや個別の保護機能を変更できるようにします。

アドオンがインストールされたプロジェクトでは Online Services 行も表示されます。Open を押すと Window > OZero Security > Online Services ウィンドウを開きます(設定がなければ作成します)。

アドオンがインストールされている場合、Offline ボタンはアドオンに同梱されたマニュアル(Assets/OZeroSecurity/Online/Documentation/HTML/index.html)を開きます。

Don't show this window automatically again をオンにすると、このプロジェクトでは自動で開かなくなります。メニューからはいつでも開けます。batch モードの場合や OZERO_SUPPRESS_WELCOME 環境変数が設定されている場合は開かないため、CI や自動ビルドは止まりません。

セキュリティ設定(ProjectSettings/OZeroSecuritySettings.asset、Standard プリセット)と、オンラインアドオンを使う場合はライセンス設定(ProjectSettings/OZeroLicenseSettings.asset)が、import 後に Unity エディターがアイドル状態になると自動で作成されます。-batchmode -quit でパッケージを import するだけの CI では作成されないため、プロジェクトを一度エディターで開くか、ビルドスクリプトから OZeroSecurityProjectSettings.LoadOrCreate()(アドオンは OZeroLicenseProjectSettings.LoadOrCreate() も)を呼んでください。ProjectSettings/OZeroSecuritySettings.asset と ProjectSettings/OZeroLicenseSettings.asset はバージョン管理にコミットし、ユーザーごとの秘密値を含む UserSettings/OZeroSecuritySecrets.json はコミットしないでください。

2 ダッシュボードを開く

インポートが完了したら、Unity のメニューバーから Config Dashboard を開きます:

Window -> OZero Security -> Config & Dashboard
OZero Security page in Edit > Project Settings (Config & Dashboard)

Config Dashboard が開くと、この画面でプリセット、セキュリティモジュール、ライセンス、ビルド整合性設定を一度に管理できます。Project ウィンドウでファイルを直接探して修正する必要はありません。ダッシュボードは Edit > Project Settings の OZero Security ページで、そこから直接開くこともできます。

Unity エディターメニューの説明

OZeroSecurity は、設定ウィンドウを Window > OZero Security、診断や bake コマンドを Tools > OZero Security に配置しています。セキュリティプリセットは Config & Dashboard から適用する設計です。保存前に変更後の設定を確認できます。

詳しく: すべてのメニュー
メニュー 役割 使用タイミング
Window > OZero Security > WelcomeSDK のスタート画面を開きます。Check Setup、マニュアル(オンライン/オフライン)、Security Config にすぐ移動できます。OZero SDK パッケージの import 後に自動で開きます。閉じた後はこのメニューで再度開きます。
Window > OZero Security > Config & Dashboardセキュリティ設定を編集する Edit > Project Settings > OZero Security を開きます。プロジェクトに設定がない場合は Standard プリセットで作成します。プリセット適用、モジュール有効化、対応ポリシー設定、ビルド整合性設定の確認を最初にここで行います。
Window > OZero Security > Online ServicesOnline Services 設定(ProjectSettings/OZeroLicenseSettings.asset)を別ウィンドウで開きます。ライセンス、サーバー接続、オンラインサービスを設定します。同じ設定は Security Config(各モジュールの Pro - Online ブロックと Pro - License & Online Services カード)にもあります。Standard と Pro のライセンス設定、サーバーエンドポイント、テレメトリオプションを入力するときに使用します。
Window > OZero Security > Check Setupプロジェクトとリリース設定でよく発生する問題をエディター上で診断します。パッケージのインポート直後、リリースビルド前、またはモジュールが期待どおり動作しない場合に実行します。
Window > OZero Security > macOS Distribution Signingすべての macOS プレイヤービルドに Developer ID 署名、任意の公証、OZero 整合性ファイルの再生成を自動で適用するよう設定します。Mac で作成した macOS ビルドを配布する前にオンにします。Windows で作成したビルドには署名スクリプトを使います(macOS の署名 を参照)。
Tools > OZero Security > Internal > Check Integrity ManifestOZero 整合性マニフェストを開き、デコードされた内容を確認します。ビルド整合性のトラブルシュートやサポート調査でマニフェスト内容を確認するときに使用します。
Tools > OZero Security > Internal > Bake Security Config Blob保護されたセキュリティ設定 blob を StreamingAssets に再生成します。高度なデバッグまたは CI ワークフローで使用します。通常のプレイヤービルドでは自動的に bake されます。
Tools > OZero Security > Internal > Bake Assembly Hash直近のビルド出力に対して oz_ahash.bin を再生成します。フルビルドパイプラインを再実行せず、コードだけを再ビルドした場合にのみ使用します。
Tools > OZero Security > Re-bake Integrity After Code Signing (Windows or Linux player)...コード署名した Windows・Linux プレイヤーの OZero 整合性ファイルを再生成します。実行ファイルやネイティブモジュールに署名した後に使います(Windows / Linux の署名 を参照)。
Tools > OZero Security > Setup > Android > Keystore SHA ExtractorAndroid keystore から SHA-1 と SHA-256 fingerprint を抽出します。Build Integrity の Android 署名 fingerprint を入力するときに使用します。
Tools > OZero Security > Internal > Add Debug SHA Key to ConfigAndroid debug keystore を探し、その SHA-256 fingerprint を config に追加します。ローカル Android デバッグビルドでのみ使用します。リリースビルドではリリース署名キーの fingerprint を使用してください。
Tools > OZero Security > Setup > PC Store > Scan RedistributablePC ビルドまたはプラグインフォルダー内の Steam redistributable ファイルと既知の emulator artifact をスキャンします。Steam リリースのパッケージング前、または疑わしい Steam ファイルが含まれていないか確認するときに使用します。
Tools > OZero Security > Diagnostics > Check Time.timeScale UsageOZero の時間保護と競合する可能性がある直接的な Time.timeScale 書き換えコードをスキャンします。リリース前、または Speed & Time Hack モジュールがプロジェクト側の time-scale ポリシー問題を報告した場合に実行します。

Check Setup と Auto Setup

Window > OZero Security > Check Setup を開くか、Welcome ウィンドウで Start setup を押してください。パッケージをインポートした直後と、リリースビルドの前に一度ずつ実行することをおすすめします。

Check Setup はプロジェクト、現在のビルドターゲット、セキュリティ設定を検査し、ビルドを止める項目と推奨項目を表示します。各項目には Docs(説明)と修正ボタンがあります。ビルドを止める項目から解決してください。

Check Setup window with one blocking issue, two warnings and the Auto Setup banner

Auto Setup を押すと、推奨される変更を 1 ステップずつ表示します。各ステップで現在の値と変更後の値を確認し、Apply または Skip を選んでください。終了すると、適用した項目、スキップした項目、残っている項目が要約で表示されます。ブロックする項目と Auto Setup が適用できる変更がすべてなくなると、Setup complete ボックスと Open Build Settings ボタンが表示されます。あとは通常どおりビルドしてください。

Auto Setup step 1 of 5 showing the change with Apply, Skip and Stop

Auto Setup が変更する項目: Development Build のオフ、IL2CPP への切り替え、Managed Stripping Low、Android API 24・ARM64、DeveloperSecret の生成、TMP ダイアログパッケージのインポート、manifest 署名キーの生成(Require Manifest Signature のオンを含む)、Android デバッグ SHA の登録。

署名キーファイル: Auto Setup が作成した manifest 署名の秘密キーファイルは、プロジェクトとバージョン管理の外に置き、CI を含むすべてのビルドマシンから使えるようにしてください。
詳しく: Auto Setup のステップと動作

Check Setup(Window > OZero Security > Check Setup、または Welcome ウィンドウの Start setup)は、プロジェクト、アクティブなビルドターゲット、セキュリティ設定、プラットフォームごとのリリース設定を点検し、ブロックする問題、推奨事項、情報を表示します。各項目には Docs と修正ボタンがあり、ウィンドウ上部に Auto Setup が適用できる推奨変更の数が表示されます。ウィンドウ上部のボタンは左から Auto Setup(適用待ちの変更数を表示)、Re-check(チェックを再実行)、Manual、Security Config です。Security Configは Edit > Project Settings > OZero Security を開きます。実際のプレイヤービルドでもビルド時の検証はそのまま実行されます。

OZero SDK パッケージを import した後に Check Setup を初めて開いたとき、Auto Setup が適用できる変更があれば、Auto Setup を開始するか確認します(Start Auto Setup / Not now)。同じバージョンを再 import した場合も import のたびに確認し、batch モードでは確認しません。後から Auto Setup ボタンで開始することもできます。

OZero Auto Setup prompt with Start Auto Setup and Not now over the Check Setup window

Auto Setup はまず適用するステップの一覧を表示します。プロジェクトとアクティブなビルドターゲットに必要なステップだけが表示されるので、Start(または Cancel)を選びます。ステップごとに現在の値と変更後の値を示し、Apply、Skip、Stop から選ばせます。最後の要約画面に適用した項目、スキップした項目、まだ残っている項目が表示され、Run Auto Setup Again で最初からやり直せます。表示される可能性のあるステップは次のとおりです。

Auto Setup planned steps with Start and Cancel
  1. Development Build をオフにする
  2. Scripting Backend を IL2CPP に変更する
  3. IL2CPP の場合のみ: Managed Stripping Level を Low に設定する
  4. Android: 最小 API レベル 24、ターゲットアーキテクチャ ARM64
  5. DeveloperSecret を生成する
  6. Built-in TMP ダイアログパッケージを import する。必要に応じて TextMeshPro/Unity UI をインストールし、TMP Essential Resources とダイアログパッケージを順に import します。すべて終わるまで Processing 画面に進行段階と経過秒数が表示され、終わると次のステップに進みます。スクリプトの再読み込みを挟んでも続行します。
  7. マニフェスト署名キーペアを生成する(トラストアンカーは自動で更新されます)。秘密鍵ファイルの作成場所はステップ画面に表示されます。結果のダイアログは表示されず、秘密鍵の場所とフィンガープリントはコンソールログに残ります。すでにキーがある場合は、上書きするか確認するダイアログが表示されます。次のステップで Require Manifest Signature をオンにします。
  8. Android デバッグ SHA を追加する。結果はコンソールログに残ります。デバッグ keystore がない場合は、作成するか確認するダイアログが表示されます。 Security Config や Keystore SHA Extractor のボタンから直接実行した場合は、従来どおり結果のダイアログが表示されます。
Auto Setup Processing screen with the elapsed time Auto Setup summary with Applied, Skipped and Still open

セキュリティ設定の Fail Build on Setup Warnings がオンの場合(既定値)、キー生成と Require Manifest Signature も通常のステップです。スキップすると警告が残り、プレイヤービルドは preflight で失敗します。ステップ画面と要約画面にもその旨が表示されます。この設定がオフの場合だけ「(optional, review first)」と表示される任意のステップになります。キー生成ステップでは秘密鍵ファイルの作成場所が表示されます。秘密鍵はプロジェクトの外に置いてバージョン管理から除外し、CI を含むすべてのビルドマシンで使えるようにしてください。

このエディターで適用できないステップ(例: Unity エディターに IL2CPP モジュールがインストールされていない場合の IL2CPP ステップ)は 1 ステップずつ進めず、概要と要約画面の Needs your action に別に表示されます。IL2CPP モジュールがない場合は Unity Hub > Installs > Add modules で対象プラットフォームの IL2CPP モジュールを追加してから、Auto Setup をもう一度実行してください。Player Settings の変更は Undo で元に戻せません。適用した変更はすべて要約画面に表示されます。

次の 2 つの Check Setup エラーは OZero のネイティブロードアンカーを守ります(クライアント側保護の限界)。OZero native plugins are not set to Load on startup: Auto Setup が OZero ネイティブプラグインの Load on startup を再びオンにします。この設定はオフにしないでください。Android boot provider library is missing: Mono バックエンドの Android ビルドに必要なライブラリです。OZero Security パッケージを再インポートして Assets/OZeroSecurity/Plugins/Android/OZeroSecurityBoot.androidlib を復元してください。

オンラインアドオンがある場合、Auto Setup はお客様だけが知っている値も入力を受けて設定します。こうしたステップには入力欄が表示されるので、値を入力して Apply を押します。値は保存前に確認され、Console やログには記録されません。確認に失敗するとステップに理由が表示され、何も保存されません。値を直して入力し直すか、Skip を押してください。

  • License Key:Pro license key is empty、Native Variant <NNNN> needs your license key、… is bound to a different license key の項目で表示されます。プロジェクトにライセンス専用の Native Variant がある場合は、保存前にその Variant のライセンスと照合し、別のライセンスのキーは保存しません。
  • Server Public Key:Pro server signing public key is not configured の項目で表示されます。Customer Portal > Server Key から署名公開鍵(16 進数 64 文字)をコピーして入力してください。それ以外の形式は拒否され、小文字で保存されます。
  • Application Identifier:Application identifier is not registered for Native Variant <NNNN> の項目で表示されます。入力する値はアクティブなビルドターゲットによって異なり、Customer Portal > Platform settings と同じです。Android は Package Name、iOS は Bundle Identifier を入力し、入力欄には現在の識別子があらかじめ入っています。この設定がオフだと Unity は入力した識別子を無視するため、Apply は Player Settings の Override Default Package Name / Bundle Identifier もオンにします。Windows、macOS、Linux は、Customer Portal > Platform settings でこのプラットフォームに登録した Company Name と Product Name(ポータルでは Company / Product と表示)をそれぞれの欄に入力します。両方の欄には現在の値があらかじめ入っており、company.product または com.company.product として照合されます。Apply は Player Settings の Company Name と Product Name を設定し、Product Name はビルドされたアプリの名前にもなります。WebGL はポータルに登録したページの origin(ドメイン)で識別されるため、プロジェクトで変更するものはなく、このステップは利用不可と表示されます。値はライセンスに登録済みである必要があり、登録されていない場合は Customer Portal で登録してからパッケージを再ダウンロードするよう案内されます。

エディター Play Mode(開発段階)

エディターの Play Mode には専用の保護設定があるため、開発の妨げになりません。Window > OZero Security > Config & Dashboard > Editor Play Mode > Protection で Off または Test を選んでください。

Protection エディター Play Mode での動作 使う場面
Off何も中断せず、検出はログに残すだけです。既定値。普段の開発に。
Test対応・案内 UI・コールバックをエディターで実行し、終了の代わりに Play だけを止めます。Receiver と案内 UI を試すとき。

エディターはリリース環境ではないため、最終的な動作は必ずプレイヤービルドで確認してください。

詳しく: モードごとの動作とログ

エディター Play Mode には専用の保護設定があり、OZero が開発を妨げないようにしています。Window > OZero Security > Config & Dashboard > Editor Play Mode > Protection で Off または Test を選びます。設定は ProjectSettings/OZeroEditorPlayMode.json に保存されるため、バージョン管理でチームと共有されます。セキュリティ設定とは別なので、プレイヤービルドやセキュリティ設定ハッシュには影響しません。変更は次の Play から適用され、Play 開始時に Console に現在のモードが 1 行で記録されます([OZero] Editor Play Mode Protection: Off - ...)。

Off: 検出器(速度、インジェクション、整合性など)を有効にしません。自分で追加した PhysicsHack コンポーネントや SecureVariable の改ざんを検出した場合は、種類ごとに 1 回だけ警告ログ([OZero] <type> detected in Editor Play Mode - no response because Editor Play Mode Protection is Off)を出し、それ以外は何もしません。コールバック、通知 UI、テレメトリはなく、Play も続きます。SecureVariable の暗号化自体は通常どおり動作します。セキュリティレベルの拒否(例: セキュリティ設定ハッシュの許可リスト)も、エディター Play Mode ではログに残るだけです。

Test: ビルドせずに現在の設定で検出器を有効にします。以前のビルドで残った StreamingAssets/oz_cfg.bin は無視されます。検出すると設定された応答(コールバック、通知 UI、テレメトリ)を実行します。プレイヤーなら終了する場面では、同じ猶予時間の後に Play Mode だけが停止し、Editor Play Mode will stop in N ms がログに出ます。セキュリティレベルの拒否も、設定された応答(Fail On Security Level Reject)を実行します。

どちらのモードでも SDK が Unity エディターのプロセスを終了することはなく、ネイティブ起動検査(デバッガー、エミュレーター、Linux ホスト層)はエディターでは常にオフです。エディターはリリース環境ではないため、最終的な動作は必ずプレイヤービルドで確認してください。

オンラインアドオンを使う場合、Pro のアクティベーションとオンライン機能はエディターでもこれまでどおり動作します。アドオンのサーバーループは Play Mode を終了したときやスクリプトの再読み込み時に停止します。

3 モジュールの有効化

ダッシュボード内でセキュリティモジュールの一覧とトグルスイッチを確認できます。使用するモジュールを有効化してください。以下は推奨される開始設定です。

OZero Security page in Edit > Project Settings (Config & Dashboard)

セキュリティのプリセットを選択する

まずプリセットを選択した後、プロジェクトに合わせて個別のモジュールだけ調整してください。一般的なライブゲームは Standard から始めることをお勧めします。保護のレベル、パフォーマンス、誤検知の可能性のバランスが最も良いです。

プリセット 推奨される使用先 適用されるポリシーの要約 Pro サーバー検証 (Check Integrity With Server)
Low プロトタイプ、開発ビルド、初期の QA 主要な検査のみ(テスト用) オフ。オフライン実行が必要なゲーム向け(サーバーによるビルド判定と実行中の再確認なし)
Standard ほとんどのリリース済みゲーム 主要な保護+起動時・実行時の検証(推奨) オン。OZeroManaged 判定、起動時にオンラインが必要
Strict リスクの高いライブサービス、PvP、対戦型のビルド 最大範囲。十分にテストしてから適用 オン。CustomerGameServer 判定。ゲームサーバーが challenge を渡し、クライアントが OZeroOnlineAttestation.RequestGameServerAttestation を呼び、ゲームサーバーが /v1/validate で検証
モジュール 機能説明 推奨有無
Build Integrity Validator アプリバイナリの改ざんの有無を検知 推奨
Speed Hack Detector 時間操作チート検知 推奨
Injection Detector メモリフッキングツールの監視 推奨
Install Source Validator 不正な APK のブロック(Android 専用) 選択
シーンにオブジェクトを置く必要はありません。使いたいモジュールをオンにするだけで設定は Project Settings に自動保存され、次回の実行からモジュールが自動で起動します。
詳しく: プリセットが変更する値

Quick Preset パネルには、現在の設定に一致するプリセットが Current: Standard のように表示され、該当するボタンが太字と * で示されます。適用後に値を手動で変更すると Current: Custom と表示され、どのボタンにも印は付きません。推奨値は Standard で、ボタンには Standard (Recommended) と表示されます。プリセット名は Low / Standard / Strict のままです。各ボタンの下にプリセットの説明が表示され、ボタンのツールチップにも同じ説明が出ます。

Security Config Quick Preset showing Current: Standard with the Standard button marked

Windows システムモジュール検査(enableWindowsSystemModuleScan): Low OFF / Standard・Strict ON。ライセンス階層ではなくセキュリティプリセットの設定です。互換性と観測規則は Injection 設定を確認してください。

設定の取得は enableRemoteSpeedHackConfig、enableRemoteInjectionConfig、enableRemotePhysicsConfig で切り替えます。セキュリティプリセットは、プロジェクトのライセンスティア(Online Services 設定)が Pro のときだけこれらを有効にし、Standard またはライセンス設定がない場合は Pro 専用のサーバーオプションをすべて無効のままにします(ティアを Pro に変更したらプリセットを再適用してください)。これらは Pro のみで動作します。リモート設定オプション自体は BIV サーバー検証、インストール元の同期、サーバーホワイトリスト、テレメトリーを有効にしません。プリセットはこれとは別にこれらの値を変更します(上のプリセット表を参照)。

  • Low: 軽い核心の検査だけ維持します。テストの環境が早すぎる段階でブロックされないよう、プラットフォームネイティブ検査と強制終了のポリシーを緩和します。
  • Standard: 核心保護のセット、開始の際の検証、ランタイムの再検証、エミュレーターの検査、推奨される IL2CPP ファイルのカバレッジをオンにします。互換性と保護のレベルのバランスを合わせた構成です。
  • Strict: 最も広いカバレッジを適用し、より多くの失敗を致命的な違反として処理します。プラットフォーム、署名、ストア配布フローを十分にテストした後に適用してください。

ライセンスモデル — Standard / Pro

OZero Security は Standard と Pro の2つのティアーで提供されます。Standard はサーバー連携なしでローカル保護機能を使用します。Pro はプロジェクト別の Native Variant パッケージ、マニフェスト / Bundle ID バインディング、テレメトリー、署名付きサーバー時刻、リモートポリシー、サーバー検証を提供します。

下のマトリクスは、開発者の観点から SDK がランタイムにティアー別に実際どのように動作するかをまとめたものです。全体の機能の比較はホームページの ライセンスモード比較表 で確認してください。
項目 Standard Pro
ライセンスキー — (なし) OZ-PRO-XXXX ×6
10個の保護モジュール 10個の保護モジュール全体を活性化 10個の全体 (Standard と同一)
お客様ごとの独立したネイティブセキュリティモジュール 提供なし 提供あり
クラウドのテレメトリー なし 有効
リモート設定 なし あり
ビルド整合性のサーバー検証 なし あり
署名された時間 (時計の操作防止) オフ — WebTime は HTTPS HEAD のみ使用 オン — 署名された /v1/time 応答を使用
Standard から Pro へ拡張しても、ゲームプレイコードはそのまま利用できます。独立したネイティブセキュリティモジュールを適用し、Online Services 設定で Pro のサーバー機能を設定してください。
アプリのプライバシーポリシーに記載する文言

Pro サーバー機能を有効にしたアプリは、OZero SDK が処理する情報をエンドユーザーに知らせる必要があります。以下の文言をアプリのプライバシーポリシーに貼り付け、角かっこの部分は有効にした機能に合わせて残すか削除してください。全項目はOZeroSecurity プライバシーポリシーをご覧ください。

한국어

이 앱은 부정 행위와 변조를 방지하기 위해 OZero Security SDK(오제로시큐리티 주식회사)를 사용합니다. 보안 검사는 기기 안에서 이루어지며, [Pro 서버 기능이 켜진 경우] 보안 이벤트가 발생하면 다음 정보가 OZero 서버로 전송됩니다: 앱별로 해시된 기기 식별자, 플랫폼·운영체제, 앱 버전, 탐지된 보안 이벤트의 종류와 결과, 탐지에 관련된 외부 프로그램 모듈의 파일명·서명자·해시, 접속 국가. [물리 검증을 켠 경우: 캐릭터 위치·속도·씬 이름.] [Steam 확인을 켠 경우: Steam 인증 티켓과 SteamID(해시로 저장).] 기기의 원문 식별자, IP 주소, 채팅·닉네임·결제 정보는 전송되지 않습니다. 전송된 기록은 90일 후 삭제되며, 외부 프로그램 모듈 정보는 개인·기기와 연결되지 않는 형태로 OZero의 부정 프로그램 판별 기준을 개선하는 데 사용됩니다. 자세한 내용: https://www.ozerosecurity.com/privacy.html

English

This app uses the OZero Security SDK (OZero Security Inc.) to prevent cheating and tampering. Security checks run on the device. [When Pro server features are enabled] the following is sent to OZero servers when a security event occurs: an app-specific hashed device identifier, platform and OS, app version, the type and result of the security event, the file name, signer and hash of third-party modules involved in the detection, and the country of connection. [Physics validation: character position, velocity and scene name.] [Steam verification: the Steam auth ticket and SteamID, stored hashed.] The raw device identifier, IP address, chat, nicknames and payment data are not sent. Records are deleted after 90 days. Module information is used, in a form not linked to any person or device, to improve OZero's cheat-program classification. Details: https://www.ozerosecurity.com/privacy.html

日本語

本アプリは不正行為と改ざんを防ぐために OZero Security SDK(OZero Security Inc.)を使用しています。セキュリティ検査は端末内で行われ、[Pro サーバー機能が有効な場合] セキュリティイベント発生時に次の情報が OZero サーバーへ送信されます:アプリごとにハッシュ化した端末識別子、プラットフォーム・OS、アプリのバージョン、検知したイベントの種類と結果、検知に関係した外部モジュールのファイル名・署名者・ハッシュ、接続国。[物理検証:キャラクターの位置・速度・シーン名。][Steam 確認:Steam 認証チケットと SteamID(ハッシュで保存)。] 端末の生の識別子、IP アドレス、チャット・ニックネーム・決済情報は送信されません。記録は 90 日後に削除され、モジュール情報は個人や端末と結び付かない形で OZero の不正プログラム判定基準の改善に使われます。詳細:https://www.ozerosecurity.com/privacy.html

中文(简体)

本应用使用 OZero Security SDK(OZero Security Inc.)防止作弊与篡改。安全检查在设备内进行,[启用 Pro 服务器功能时] 发生安全事件时会向 OZero 服务器发送以下信息:按应用哈希处理的设备标识符、平台与操作系统、应用版本、安全事件的类型与结果、与检测相关的第三方模块的文件名·签名者·哈希、连接国家。[物理验证:角色位置、速度与场景名。][Steam 验证:Steam 认证票据与 SteamID(以哈希保存)。] 不会发送设备原始标识符、IP 地址、聊天、昵称与支付信息。记录在 90 天后删除;模块信息以不关联个人或设备的形式用于改进 OZero 的作弊程序判定标准。详情:https://www.ozerosecurity.com/privacy.html

Online Services 設定

Security Config はアドオンの設定を 2 か所に表示します。Protection Modules グループの最後、つまりページの一番下(Steam Anti-Piracy (PC Only) の後)にある Pro - License & Online Services カードは License(ティアとライセンスキー)から始まります。Tier が Pro の場合は Server Connection、Offline & Device Policy、Security Level Enforcement(Security Config Hash (build allowlist) の一覧を含む)、Telemetry、Online Verification UI、Validate License Now も表示され、各検出モジュールのセクション(Build Integrity、Install Source (Android Only)、Device Binding、Speed & Time Hack、Injection & Hooking、Steam Anti-Piracy (PC Only))に、そのモジュールのオンライン設定をまとめた Pro - Online ブロックが追加されます。モジュールの Activate がオフの間、このブロックは無効です。

Pro - License & Online Services card at the bottom of the OZero Security page in Project Settings

値は ProjectSettings/OZeroLicenseSettings.asset に保存され、このファイルをバージョン管理にコミットします。Project ウィンドウに設定アセットはありません。同じ設定は独立した画面でも編集できます。Security Config と Welcome ウィンドウの Online Services ボタンは Window > OZero Security > Online Services ウィンドウを開き(設定がなければ作成し)、このウィンドウには Select Settings Asset と Validate License Now ボタンがあります。ウィンドウ上部の Security Config と Check Setup ボタンでそれぞれの画面に移動できます。この節の残りは独立画面について説明しますが、項目名は Security Config でも同じです。

ティアは License セクションで選びます。License Key 欄はどちらのティアでも表示されます。Standard を選ぶと License セクションだけが表示され、Standard はサーバーなしで動作するためオンラインサービスはオフで、OZero サーバーには何も送信しないという案内が出ます。License Key は Native Variant 込みのパッケージを使う場合だけ入力し、ローカルでのみ確認されます。Pro を選ぶと、サーバー接続とオンラインサービスの設定が表示されます。

設定は Security Config と同じように構成され、順序は Quick Preset、License、Server Connection、Offline & Device Policy、Security Level Enforcement(ヘッダーの Enable でオン)、モジュールセクション Build Integrity、Install Source、Device Binding、Speed & Time Hack、Injection & Hooking、Steam Anti-Piracy、そして Telemetry、Online Verification UI です。

プリセットは SDK 全体で 1 つです。ここの Low / Standard / Strict ボタンは Security Config と同じプリセットを適用するため、どちらで適用しても結果は同じです。ここでも Standard が推奨値で Standard (Recommended) と表示され、各ボタンの下に説明が出ます。プリセットを適用すると、検知モジュール、オンラインサービスの既定値、Declared Security Level がまとめて変わり、ライセンス・サーバー URL・キーは保持されます。パネルには Current: Standard のように現在の状態が表示され、該当するボタンが太字と * で示されます。適用後にオンライン設定を手動で変更すると Current: Custom になり、どのボタンにも印は付きません。Declared Security Level が適用したプリセットと異なる場合は、Security Level Enforcement セクションに警告が出ます。

モジュールセクションは Security Config と名前・順序が同じです。ヘッダーには Security Config でのモジュールの状態(Active / Inactive、読み取り専用)が表示され、各セクションの先頭にはオンラインサービスがそのモジュールに追加する内容が 1 行で説明されます。サーバースイッチはセクションの最初の行にあります。

Security Config では、モジュールがオフの間、そのモジュールの Pro - Online ブロックが Activate this module to use its online settings. の案内とともに無効表示になります。独立画面では、無効なモジュールのセクションに、モジュールを有効にするまでこのオンライン設定は効果がないという案内と Open Security Config ボタンが表示されます。

Telemetry と Online Verification UI はオンライン専用です。Telemetry は Customer Portal に送るセキュリティイベントとリモート物理設定を扱います。Online Verification UI はサーバー検証中に表示される画面(検証中、再試行、オンライン必須、タイムアウト)の動作を決めます。設定項目は UI ポリシー、再試行・オンライン必須の時間、タイムアウト時の動作、ネットワーク復帰時の自動再試行です。ダイアログのデザインと言語は Security Config > Player Notice (Managed UI) に従います。Check Integrity With Server と Check Steam DRM With Server がどちらもオフの場合は、使用されないという案内が出ます。

アドオンに個別のログスイッチはなく、ログは Security Config の Enable Debug Logs に従います。

Pro パッケージと Native Variant

Pro のお客様は Customer Portal のダウンロードから Pro 統合パッケージを受け取ります。ライセンス用に作成された 1 つの .unitypackage に、Standard SDK、オンラインアドオン、全プラットフォームの Native Variant が含まれます。カードには次の 2 つのオプションがあります。

Variant を交換(ローテーション)する場合: 以前の Variant で作成した既存ビルドは引き続き動作します。新しい Variant は、交換後に新しくダウンロードしたパッケージで作成したビルドから適用されます。交換するとローテーション回数を 1 回使用し、交換後は返金を受けられません。

Native Variant 込みのパッケージを Tier Standard で使うには、Tier は Standard のまま、Security Config > Pro - License & Online Services > License に License Key だけを入力します。ビルドとプレイヤーはキーをローカルでのみ確認し、Tier Standard は OZero サーバーと通信しません。これは既定でオンの Allow Standard Build With Premium License に従います。オフの場合、Check Setup がこのオプションをオンにするか Tier を Pro にするよう案内します。

ライセンスキーなしでビルドするには、Standard variant(0000)込みのパッケージをダウンロードしてください。

Unity Asset Store で SDK を購入した場合は、SDK を Asset Store からインストールし、Customer Portal からは Pro 拡張パッケージだけをダウンロードします。カードで選んだ SDK バージョン用のオンラインアドオンと割り当て済み Native Variant が含まれ、SDK 本体は含まれません。

Check Setup の Native Variant 項目

パッケージに Native Variant が含まれている場合、Check Setup がビルド前にプロジェクトが一致しているかを表示します。プレイヤービルドも同じ理由で停止します。

Check Setup の項目 対処
Native Variant <NNNN> needs your license keySecurity Config > Pro - License & Online Services > License に License Key を入力します(Tier は Standard のままで構いません)。または Standard variant(0000)込みのパッケージをダウンロードします。Check Setup > Auto Setup で入力することもできます。
Native Variant <NNNN> is bound to a different license keyパッケージをダウンロードしたライセンスのキーを入力するか、このライセンスでサインインした状態でパッケージを再ダウンロードします。Check Setup > Auto Setup で入力することもできます。
Application identifier is not registered for Native Variant <NNNN>ビルドターゲットに応じて、Customer Portal > Platform settings に登録された値に合わせます。Android / iOS:Player Settings > Other Settings > Override Default Package Name / Bundle Identifier をオンにし、登録済みの Package Name / Bundle Identifier を入力します。Windows / macOS / Linux:Company Name と Product Name を登録済みの値にします。WebGL:登録済みのページ origin で識別されるため、プロジェクトで変更するものはありません。または Customer Portal でライセンスに識別子を登録してからパッケージを再ダウンロードします。Check Setup > Auto Setup で入力することもできます(設定前に Native Variant と照合されます)。
Native Variant <NNNN> is license-bound, but Tier is StandardAllow Standard Build With Premium License をオンにするか、Tier を Pro にします。
Native Variant <NNNN> matches this project対処は不要です。Tier Standard ではキーはローカルでのみ確認されます。
Native Variant: Standard public (0000)対処は不要です。Standard variant(0000)にライセンスキーは不要です。

ゲームサーバー連携: デバイス ID とユーザー UUID

Pro では、ゲームサーバーが OZero の使う ID と連携できます。OZero のデバイス ID を読み取ってプレイヤーのアカウントと一緒に保存し、ゲームのユーザー UUID(アカウント ID)を紐付けると、Customer Portal でそのユーザーが使ったデバイスを調べたり、ユーザーをブロックしたりできます。

デバイス ID の読み取り

OZeroLicenseRuntime.CurrentDeviceId を読み取ってください。既定の設定では Customer Portal とテレメトリに表示される値と同じです。アカウントを紐付けるために DeviceIdProvider を置き換えないでください。サーバーが把握しているデバイス ID が変わってしまいます。代わりに下のユーザー UUID API を使えば、デバイス ID はそのまま保たれます。

ユーザー UUID の紐付け

ユーザーのブロック

Customer Portal のユーザーブロックルールには、次の 2 つの動作のどちらかを設定します。

ユーザーブロックとデバイスブロックは OZeroLicenseRuntime.LastServerBlockCode で区別します。ユーザーは "USER_BLOCKED"、デバイスは "DEVICE_BLOCKED" です。判定は SetExternalUserId の呼び出し後およそ 5 秒以内に実行され(デバイスポリシー heartbeat がオフでも実行)、最短間隔は 30 秒です。ネットワークに失敗した場合はセッションを終了せず、次の確認で判定します。

Customer Portal: ユーザー UUID ページ

Customer Portal で 運用情報 > ユーザー UUID を開きます(Pro)。ページには 3 つのタブがあります。

salt を再発行(設定タブ)すると既存の紐付けが切れます。以前の salt で作られたユーザーの紐付けとブロックルールはユーザーと一致しなくなり、既存のルールは古いキーのまま残ります。ゲームは次の有効化で新しい salt を受け取り、お客様のサーバーも新しい salt で h1 を計算し直す必要があります。

ブロックルールの保存・解除と salt の再発行は、操作履歴のユーザー UUIDカテゴリーに記録されます。

Customer Portal はシングルページアプリです。更新後に画面が古いままだったり表示がおかしかったりする場合は、ページを再読み込みしてください。

設定タブと同じ例です。API リファレンス(OZeroLicenseRuntime)のテストベクターで実装を確認してください。

// C#
using System.Security.Cryptography;
using System.Text;

static string ExtUserHash(string salt, string uuid)
{
    var id = uuid.Trim(' ', '\t', '\n', '\v', '\f', '\r');
    var bytes = SHA256.HashData(Encoding.UTF8.GetBytes("OZERO-EXTUID-V1|" + salt + "|" + id));
    return Convert.ToHexString(bytes).ToLowerInvariant();
}

// Node.js
const crypto = require("crypto");

function extUserHash(salt, uuid) {
  const id = uuid.replace(/^[ \t\n\v\f\r]+|[ \t\n\v\f\r]+$/g, "");
  return crypto.createHash("sha256").update("OZERO-EXTUID-V1|" + salt + "|" + id, "utf8").digest("hex");
}

# Python
import hashlib

def ext_user_hash(salt: str, uuid: str) -> str:
    uid = uuid.strip(" \t\n\v\f\r")
    return hashlib.sha256(f"OZERO-EXTUID-V1|{salt}|{uid}".encode("utf-8")).hexdigest()

例: サインイン、サインアウト、policy コールバック

using OZeroSDK.Security;
using OZeroSDK.Security.License;
using UnityEngine;

public sealed class OZeroAccountLink : MonoBehaviour
{
    private void OnEnable()
        => OZeroSecurityManager.Instance.RegisterUserPolicyActionCallback(OnPolicyAction);

    private void OnDisable()
        => OZeroSecurityManager.Instance.UnregisterUserPolicyActionCallback(OnPolicyAction);

    // Call after your sign-in succeeds.
    public void OnSignedIn(string accountUuid)
    {
        if (!OZeroLicenseRuntime.SetExternalUserId(accountUuid))
            Debug.LogWarning("OZero: user id rejected (empty, too long, or control characters).");

        // Optional: keep the OZero device id with the account on your server.
        string deviceId = OZeroLicenseRuntime.CurrentDeviceId;
        MyGameServer.ReportDevice(accountUuid, deviceId);
    }

    // Call on sign-out.
    public void OnSignedOut() => OZeroLicenseRuntime.ClearExternalUserId();

    private void OnPolicyAction(OZeroPolicyActionEvent evt)
    {
        if (evt.Module != "user_policy")
            return;

        if (evt.ActionId == "user_blocked")
        {
            // Terminate rule: the SDK shows the termination notice and ends the session next.
            MyGame.SaveQuickly();
            return;
        }

        // Callback-only rule: the game decides what to do.
        Debug.LogWarning($"User block rule {evt.PolicyId}: {evt.Reason}");
        MyGame.RestrictAccount(evt.Reason);
    }
}

プライバシーとストアへの申告

セキュリティ設定ハッシュの許可リスト

ビルドごとにセキュリティ設定(OZeroSecurityConfig、オンラインアドオンの設定を含む)を封印し、その SHA-256 ハッシュを計算します。配布するビルドのハッシュを承認すると、サーバーのセキュリティレベル確認はそのビルドだけを通過させます。そのため、設定を弱めた改ざんビルドが高いセキュリティレベルを宣言しても通過できません。

Pro 専用です。Security Config > Pro - License & Online Services > Security Level Enforcement がオン(ヘッダーの Enable、enableSecurityLevelCheck)のときだけ動作します。オフの場合、ビルドはハッシュを送らないため許可リストは効果がなく、このセクションにはハッシュ一覧の代わりに警告が 1 つだけ表示されます。

ビルドのハッシュを確認する

セキュリティ設定を 1 つでも変更すると(オンラインアドオンの設定を含む)ハッシュが変わります。リリースビルドごとに新しいハッシュを承認し直してください。適用モードでは、承認されていないハッシュのビルドは拒否されます。

Customer Portal でハッシュを承認する

ポリシー設定 > セキュリティ設定ハッシュを開きます(Pro)。

承認と解除は操作履歴に記録されます。CI からハッシュを登録するには、API リファレンスのセキュリティ設定ハッシュ(CI)を参照してください。

Pro ライセンスキーの登録

Standard は追加のライセンス設定なしで使用できます。Pro を使う場合は、プロジェクトに発行されたライセンスキーを Online Services 設定(ProjectSettings/OZeroLicenseSettings.asset に保存)に入力します。Pro キーは、ポータルからプロジェクト専用 Native Variant パッケージをダウンロードし、ビルド時にそのパッケージが現在のプロジェクト用か確認するために使われます。Pro キーはさらに、実行時のサーバー有効化と Pro 専用サーバー機能にも使われます。

1. 設定アセットの作成

オンラインアドオンは、import 後にエディターがアイドル状態になるとライセンス設定を ProjectSettings/OZeroLicenseSettings.asset に自動で作成します(古い OZeroLicenseConfig アセットが Assets/ の下に残っている間は作成しません)。ライセンスは Security Config 一番下の Pro - License & Online Services カードで入力します。License でティアを選び、ライセンスキーを入力します(Standard では Native Variant パッケージを使う場合だけ)。サーバー URL と鍵は Server Connection にあります。Security Config または Welcome ウィンドウの Online Services を押すと、同じ設定を持つ Window > OZero Security > Online Services ウィンドウが開き、設定がない場合は作成されます。ProjectSettings/OZeroLicenseSettings.asset はバージョン管理にコミットしてください。

ライセンス設定は Project ウィンドウのアセットではなく、ProjectSettings/OZeroLicenseSettings.asset に保存されます。Online Services ボタン(Security Config または Welcome ウィンドウ)または Window > OZero Security > Online Services から開いてください。

2. Inspector フィールドを埋める

フィールド 必須の可否 説明
tier すべてのティアー このビルドに適用するライセンス階層を選びます。Standard は共通 Native モジュールのみを使用し、サーバーとは通信しません。Pro はプロジェクト専用 Native Variant と manifest 検証に加えて、サーバー有効化、テレメトリー、リモートポリシーなどの運用機能を利用します。
licenseKey Pro プロジェクトに発行された OZ-PRO-... 形式のライセンスキーです。Native Variant のプロジェクトバインディングを検証し、ランタイム有効化と Pro サーバー機能に使用します。
appIdentifier 自動送信 Pro 有効化リクエストを送るとき、SDK は Unity の Application.identifier を一緒に送信します。Customer Portal に登録された Bundle ID または Package Name とこの値が一致しない場合、有効化が拒否されることがあります。まず Unity Player Settings の Identifier を確認してください。
serverBaseUrl Pro runtime Pro 機能が OZero サーバーと通信するときに使う基本 URL です。有効化、テレメトリー、signed time、attestation、サーバーポリシー確認に使われます。Standard ランタイムはこの URL を呼び出しません。OZero サポートから別の URL を案内されていない場合は、既定値 https://api.ozerosecurity.com のままにしてください。
serverPublicKeyHex Pro runtime Customer Portal > Server Key メニューに表示される署名用公開キーです。Pro ランタイムはこの値を使って、activation、signed time、attestation、offline policy の応答が OZero サーバーから来たものか確認します。Standard ランタイムはこの値を使いません。Pro Variant manifest は SDK 内蔵の OZero Variant signing key で別途検証されます。
previousServerPublicKeyHex Pro 任意 Pro サーバー署名キーを切り替える短い期間だけ使う以前の公開キーです。OZero サポートからキー切り替えを案内された場合だけ入力し、通常は空のままにしてください。Standard ランタイムはこの値を使いません。
offlineProPolicyMode Pro デバイスがオフラインのとき、ローカル Build Integrity が署名済みポータルブロックポリシーをどう使うかを決める Pro オプションです。ApplyCachedBlockPolicies は有効なキャッシュポリシーがある場合だけ適用する fail-open の既定値で、多くのライブゲームに推奨します。RequireFreshPolicy は使用可能な署名済みポリシーがなく、サーバー Integrity が有効な場合に fail-closed で扱います。IgnoreCachedBlockPolicies はテストや移行のためにキャッシュポリシーをバイパスします。各値の意味は OZeroOfflineProPolicyMode で確認できます。
activationTimeoutSeconds Pro runtime SDK が Pro アクティベーションの応答を待つ時間で、既定値は 15 秒です。サーバーが応答しない場合、保存済みの Pro 情報が有効で、ポータルポリシーがオフライン利用を許可しているときだけ使用します。オンライン確認が必要なポリシーでは、サーバーに接続できるまでアプリの起動を停止します。
enableLog 選択 インスペクターには表示されなくなりました。ライセンスキャッシュの使用、有効化成功、タイムアウト、署名不一致などのログは Security Config の Enable Debug Logs に従います。
Pro サーバー機能
enableDevicePolicyHeartbeat Pro 現在の端末が Customer Portal でブロックされていないかを、Pro サーバーに定期的に確認します。サーバーが DEVICE_BLOCKED を返すと、SDK は保存済みの Pro 権限情報を削除し、アプリ実行をブロックします。
devicePolicyHeartbeatInterval Pro 端末ブロック状態を確認する基本間隔です。既定値は 300 秒です。0 にすると定期確認を行いません。
devicePolicyHeartbeatJitterPercent Pro 多くの端末が同じ瞬間にサーバーへアクセスしないよう、確認間隔に少し差をつける割合です。既定値 20 は、設定された間隔の前後に少し時間をずらすという意味です。入力範囲は 0〜75 です。
enableSecurityLevelCheck Pro 有効にすると、アプリ起動時に /v1/security-level でこのビルドのセキュリティ設定をサーバーに確認します。ポータルで要求される最低レベルより低い場合、サーバーが拒否することがあります。既定値は false です。
declaredSecurityLevel Pro このビルドがサーバーへ報告するセキュリティレベルです。既定値は Standard です。Low はプロトタイプや内部テストに使用し、Strict は強いポリシーで通常ユーザーがブロックされないことを QA で確認したあとに使用してください。
failOnSecurityLevelReject Pro 有効にすると、サーバーがセキュリティレベルまたは設定ハッシュを明確に拒否した場合、アプリのブロックフローを実行します。単純なネットワークエラー、サーバーメンテナンス、ライセンス点検状態は改ざん扱いにせず、Pro サーバー機能だけを無効にします。
securityLevelCheckInterval Pro アプリ実行中にもセキュリティレベルを再確認するかを決める間隔です。既定値 0 は、アプリ起動時に一度だけ確認するという意味です。
securityLevelCheckJitterPercent Pro 多くの端末で再確認タイミングが重ならないよう、セキュリティレベル確認間隔に少し差をつける割合です。既定値は 20、入力範囲は 0〜75 です。

3. Check Integrity With Server を確認

ビルドする前に Security Config > Build Integrity > Pro - Online > Check Integrity With Server が意図した値か確認してください。Standard・Strict プリセットはオン、Low プリセットはオフにし、新しく作成した Online 設定は Standard の値(オン)で始まります。オンにするとサーバーによるビルド判定と実行中の再確認が加わり、Standard では起動時にオンラインが必要です。ポータルの端末・Variant のブロックはこの値に関係なく適用されます。既定の Built-In 確認 UI を使う場合は TMP dialog パッケージが必要で、Auto Setup がインポートします。オフラインで実行する必要がある場合はオフラインの動作を参照してください。

4. ビルド & 検証

追加のコードを書く必要はありません。アプリが起動すると、SDK がビルド時に暗号化リソースとしてプレイヤーに含めたライセンス設定を自動的に読み込みます。初回実行後、Player ログで [OZeroLicense] activated; tier=pro caps=5 のような行を確認してください。Pro に設定したのに Standard モードと表示される場合は、まず ProjectSettings/OZeroLicenseSettings.asset が存在し、ビルド前に保存されているか、Check Setup に Old OZeroLicenseConfig asset found が出ていないかを確認してください。

ライセンスキーはビルドに含まれるため、パスワードのように実行時に隠すことはできません。ただし公開リポジトリ、ドキュメント、スクリーンショットには載せないでください。外部に出ると、別の人がデバイス上限を消費できる可能性があります。製品コードのように扱ってください。

オフラインの動作

Standard はサーバーなしで動作します。Pro は保存済みのアクティベーション情報を使ってオフラインで起動できますが、ライセンスポリシーで起動時のオンライン確認を必須にした場合はサーバー接続が必要です。

Standard — インターネットなしで起動

Standard はサーバーに許可を確認しません。アプリに含まれるローカル保護モジュールだけを実行するため、プレイヤーがオフラインでもゲームは起動します。テレメトリーや signed time など、Pro サーバーが必要な機能だけが使われません。

Pro — ローカル保護はオフライン継続、選択したサーバー機能はキャッシュを使用

任意の Pro サーバー機能を有効にした場合、オンライン時に端末とライセンスを確認します。選択したサーバー機能は、一定時間だけ一時的な切断に耐えられます。この確認は、取得済み Native Variant のビルドやローカル保護を制限しません。

オフラインで実行する必要があるゲーム: Standard・Strict プリセットは Check Integrity With Server をオンにするため、サーバー検証のためにオンライン接続が必要です。オフラインで実行するには Low プリセットを適用するか、Security Config > Build Integrity > Pro - Online > Check Integrity With Server をオフにしてください。この場合、サーバーによるビルド判定と実行中の再確認は行われません。

保存済みの Pro アクティベーション情報は、サーバーが署名したアクティベーショントークンの有効期限まで有効です。有効期限は OZero サーバーがトークン発行時に決め(現在はアクティベーション成功から 7 日)、SDK 側で延長することはできません。この期間を過ぎると、再びアクティベーションに成功するまで Pro サーバー機能は利用できません。適用済みの Native Variant とローカル検知設定は変わりません。この有効期間は、以下のローカル時刻ポリシーとは別に適用されます。

Pro — 端末時刻の使用方法を選ぶ

Customer Portal > License > Local clock で、保存済みの Pro アクティベーション情報をオフライン起動に使用できるか設定します。オンラインアクティベーションにはサーバー時刻が使われるため、端末の日時がずれているだけでオンラインの Pro 機能が制限されることはありません。

設定 アプリ起動時の動作
ローカル時刻を使用 端末時刻が選択した許容範囲内であれば、保存済みの Pro アクティベーション情報を使ってオフライン起動できます。既定値は 10 分で、3 分、1 時間、3 時間、6 時間、12 時間、24 時間も選択できます。
ローカル時刻を使用しない 端末時刻を確認しない代わりに、アプリを起動するたびにライセンスサーバーへの接続が必要です。常にオンラインで起動するサービスに適しています。
オンライン確認が必要な状態でサーバーに接続できない場合、Pro の保護レベルを下げて続行せず、アプリの起動を停止します。設定変更は次回のアクティベーションから反映され、Native Variant の再割り当てや交換は必要ありません。

Pro — ポータルでブロックしたビルドはオフラインでも止める

一時的なサーバー障害やネットワーク障害で基本保護として起動を続けることと、運営者がポータルで明示的にブロックしたビルドを許可することは別の問題です。Pro 認証が成功すると、サーバーはブロック対象のビルドハッシュ、SDK バージョン、アプリバージョンなどを署名付きリストとして返します。SDK はこのポリシーを一時的なサーバー機能状態とは別に扱います。

この動作は Security Config の Pro - License & Online Services カードにある Offline & Device Policy セクションの Offline Pro Policy Mode(OZeroLicenseConfig.offlineProPolicyMode、Online Services ウィンドウにもあります)で設定します。デバイスがサーバーに接続できないとき、ローカル Build Integrity が最後に受け取った署名済み Pro ポータルブロックポリシーをどう扱うかを決めます。

モード 使用基準
ApplyCachedBlockPolicies 多くのライブゲームに推奨する既定値です。有効な署名済みポリシーキャッシュがあれば、ポータルでブロックしたビルドやバージョンをオフラインでも引き続きブロックします。逆にキャッシュがない、削除された、または期限切れの状態でデバイスがオフラインの場合、このポリシーゲートはビルドを失敗させずに通過します。
RequireFreshPolicy オンライン中心のゲーム向け strict モードです。初回起動、再インストール、キャッシュ削除、キャッシュ期限切れなど、使用可能な署名済みポリシーがない場合は、古いまたは存在しないポリシーを信頼せず Build Integrity を失敗として扱います。この fail-closed 動作にはサーバー Integrity オプションの有効化が必要です。
IgnoreCachedBlockPolicies テストや移行のための bypass モードです。オフライン中はキャッシュ済みポータルブロックポリシーを読まないため、このゲートではポータルブロックルールが適用されません。ライブサービスビルドには推奨しません。

要約すると、ApplyCachedBlockPolicies は運用既定の fail-open モード、RequireFreshPolicy は fail-closed ポリシーモード、IgnoreCachedBlockPolicies はテスト用 bypass です。毎回の検証でオンラインサーバー確認を必須にしたい場合は、このオプションだけに依存せず、サーバー Integrity または Managed Verification の必須オプションも一緒に設定してください。

ApplyCachedBlockPolicies では、完全なオフライン初回起動、再インストール、キャッシュ削除、キャッシュ期限切れの状態でポータルブロックポリシーを適用できません。そのような場合にも有効な署名済みポリシーを必須にしたい場合は、RequireFreshPolicy とサーバー Integrity を一緒に使用してください。
状態 ディテクター テレメトリー Signed Time
オンライン、ちょうど活性化 10個の全て On On On
オフライン、保存済み Pro 情報が有効 10個の全て On Off (オフラインイベントは保存しない) 可能な場合は WebTime を代替使用
オフライン、保存済み Pro 情報が期限切れ 10個の全て On Off (次のオンライン認証まで) Off (次のオンライン認証まで)
初回起動 + 完全オフライン 10個の全て On 最初のオンライン実行まで Off 最初のオンライン実行まで Off
テレメトリは端末がオンラインのときだけ送信されます。オフライン中に発生したイベントはファイルに保存せず、警告ログを 1 行だけ残して破棄します。ローカルキューを残すと攻撃者がそのキューを改変できるためです。オンラインに戻ったあとに新しく発生した検知イベントは通常どおり送信されます。

ライセンス問題の解決

問題が起きたら、まず Unity Player ログで [OZeroLicense] を検索してください。このログで、SDK が Standard として起動したか、Pro 認証が成功したか、失敗した場合になぜ Standard へ下がったかを確認できます。セキュリティイベント送信の問題は [OZeroTelemetry] も一緒に検索してください。

ログに表示される内容 意味 対応方法
[OZeroLicense] Standard / serverless mode. SDK が Standard モードで起動しました。 Standard を使う予定なら正常です。ProjectSettings/OZeroLicenseSettings.asset がない場合、ビルドは Standard(サーバー未使用)で動作します。Pro を期待している場合は、このファイルがあるか(Security Config または Welcome ウィンドウの Online Services ボタンで作成されます)、tier=Pro と licenseKey が入力されているか、Check Setup に Old OZeroLicenseConfig asset found が出ていないかを確認してください。
Pro->Standard downgrade: /v1/activate returned LICENSE_NOT_FOUND サーバーがライセンスキーを見つけられない、または現在使用できない状態です。 licenseKey を Customer Portal に表示されるキーともう一度比較してください。大文字小文字とダッシュはそのままにします。ポータル上の状態が pending、suspended、revoked、expired の場合、Pro 認証は成功しません。
ANDROID_BUNDLE_ID_MISMATCH / WINDOWS_PRODUCT_NAME_MISMATCH 現在のビルドのアプリ情報が、ポータルに登録された値と異なります。 Android/iOS は Player Settings の Application.identifier、Windows・macOS・Linux は Player Settings の Company Name と Product Name、WebGL は実行 origin を確認してください。Unity の既定値(DefaultCompany、My project、New Unity Project、空の値)は登録できないため、Pro でデスクトップのビルドターゲットの場合は Check Setup が Company Name is still Unity's default(または Product Name is still Unity's default)という警告を表示し、そのままではアクティベーションが 403 DESKTOP_COMPANY_NAME_MISMATCH / DESKTOP_PRODUCT_NAME_MISMATCH で拒否され、Standard として動作します。ポータルの登録値と違う場合、/v1/activate は拒否されます。値を変更した後は、新しいビルドで再テストしてください。
activation token signature verification failed サーバー応答は届きましたが、SDK がその応答を信頼できないと判断しました。 これは Pro アクティベーションだけで確認する項目です。Customer Portal > Server Key の Active publicKey を Window > OZero Security > Online Services > Server Connection > Server Public Key Hex に入力してください。ポータルに kid が一緒に表示されても、Unity には 64 文字の hex publicKey だけを入れます。値が正しいのに失敗する場合は、企業プロキシや MITM 機器を通らない直接ネットワークで一度テストしてください。Check Setup に Pro server signing public key is not configured と表示された場合は、Check Setup > Auto Setup で貼り付けることもできます。
private native variant manifest signature is invalid Variant パッケージの manifest が無い、編集された、または信頼済みの OZero Variant signing key で署名されていません。 これは Server Public Key Hex を入力して直す問題ではありません。Pro Variant パッケージは、割り当てられたパッケージを再ダウンロードし、manifest と native plugin ファイルを同じパッケージ由来のまま使ってください。新しく取得したパッケージでも失敗する場合は、manifest ファイルと Unity ビルドログを OZero サポートへ送ってください。
DEVICE_BLOCKED この端末は Customer Portal でブロックされています。 ポータルでその deviceId のセキュリティイベントを確認してください。実際の攻撃やポリシー違反ならブロックを維持し、QA 端末や誤検知ならポータルで解除します。SDK はこの応答を受け取ると保存済み Pro 権限を消去し、ブロック処理を実行します。
/v1/activate timed out / network error サーバーに接続できない、または応答が遅すぎます。 端末が https://api.ozerosecurity.com/health に接続できるか確認してください。社内ファイアウォール、プロキシ、DNS も確認します。遅延が大きい地域では activationTimeoutSeconds を少し増やしてテストしてください。保存済み Pro 情報があれば、SDK はそれを先に使用します。
cached entitlement past TTL; clearing. 保存済み Pro 情報の有効期間が切れました。 端末がアクティベーショントークンの有効期限(最後のアクティベーション成功から 7 日)を超えてオフラインだと、保存済み Pro 情報は信頼されなくなります。ゲームは Standard レベルで継続し、次のオンライン認証に成功すると Pro 機能が戻ります。この期間は OZero サーバーが決めるもので、SDK 側で延長できません。
SERVER_NOT_CONFIGURED / SIGN_FAILED サーバーが認証トークンに署名できませんでした。 多くの場合、クライアント設定ではなくサーバー側の Server Key または暗号化キー状態の問題です。Customer Portal の Server Key 状態を確認してください。本番サーバーで発生した場合は、ログ時刻、licenseKey の一部、発生プラットフォームを OZero サポートへ伝えてください。
リリースビルドでは Security Config の Enable Debug Logs をオフにすることを推奨します。ライセンスフローのログもこの設定に従います。QA には便利ですが、一般ユーザー向けビルドにティア、機能状態、検知フローの詳細を残す必要はありません。

プロジェクト設定

個別のセキュリティモジュールを調整する前に、ネイティブプラグインとストアのビルド、プラットフォームの検証に影響を与える Unity Player Settings を先に確認してください。

最小のビルドターゲット

プラットフォーム 最小のターゲット 説明
Unity Editor 2022.3 LTS+ 2022.3 LTS 以降が必要です。Unity 6 にも対応しています。
iOS 14.0+ Player Settings の Target minimum iOS Version を 14.0 以上に設定してください。
macOS Apple Silicon Apple Silicon(arm64)の Mac のみ対応です。IL2CPP を推奨します。
Android API 24+ Minimum API Level を 24(Android 7.0)以上に設定してください。リリースビルドには IL2CPP・ARM64 を推奨します。
詳しく: プラットフォームごとの要件
  • Unity Editor: OZero Security SDK は Unity 2022.3 LTS 以上が必要で、Unity 6 も検証済みです。2021.3 のプロジェクトはパッケージをインポートする前にアップグレードしてください。
  • iOS: iOS ビルドでは Project Settings > Player > iOS > Target minimum iOS Version を 14.0 以上に設定してください。ABI 21 のインジェクション検知器は Apple のシステムイメージと注入コードを区別するのに iOS 14 の shared-cache API を使うため、それ未満では Editor の preflight が失敗します。
  • macOS: macOS ビルドは Apple Silicon (arm64) の Mac に対応します。Intel Mac には対応していません。IL2CPP を推奨します。Scripting Backend が Mono の場合、Check Setup が IL2CPP 推奨の警告を表示し、既定の Fail Build on Setup Warnings 設定によりビルドが失敗します。意図的に Mono を使う場合は、この設定をオフにして macOS 署名 の手順に従ってください。
Apple のプライバシーマニフェスト

Apple privacy manifest: SDK には PrivacyInfo.xcprivacy が含まれ、Unity のポストプロセスがアプリの manifest を iOS の Xcode アプリターゲットと macOS の Contents/Resources に書き込みます。Standard ビルドは、OZero がアプリ内の SDK 状態に Unity PlayerPrefs を使うため UserDefaults の CA92.1 理由だけを宣言し、収集データは宣言しません。OZero サーバー機能を使う Pro ライセンスのビルドは、PrivacyInfo.ServerFeatures.plist の収集データ 4 種(Device ID、User ID、Gameplay Content、Other Diagnostic Data)もあわせて宣言します。いずれもユーザーにリンクされ、トラッキングには使われず、アプリの機能のためのものです。アプリの同じ場所(iOS の Xcode プロジェクトルート、macOS の Contents/Resources)にすでに PrivacyInfo.xcprivacy がある場合は、上書きせずに SDK の宣言を統合します。アクセス API の理由と収集データは種類ごとに統合し、アプリの NSPrivacyTracking と NSPrivacyTrackingDomains はそのまま残します。最終アプリで manifest を維持し、提出前に Xcode のプライバシーレポートを確認してください。

リリースビルドの推奨設定

リリースビルドには次の設定を推奨します。

詳しく: これらの設定を推奨する理由

セキュリティ強化(IL2CPP 設定): Android、iOS など Unity が対応する環境では、ビルド方式を IL2CPP にしてください。IL2CPP はリバースエンジニアリングを完全に防ぐものではありませんが、C# コードやメタデータがそのまま露出する範囲を減らし、OZero のセキュリティチェックがより堅いリリース環境で動作する助けになります。パス: Project Settings > Player > Other Settings > Scripting Backend

容量最適化(Managed Stripping 設定): 使用していない managed code を削除してアプリ容量を減らす機能です。最初から強く削りすぎるとアプリが実行時に失敗する可能性があるため、まずは Low または Medium から始めてください。Mono バックエンドでは Managed Stripping Level を Disabled のままにしてください。有効にすると Unity が managed .pdb ファイル(<Product>_Data/Managed/*.pdb)も含め、OZero のリリースビルド検査がそれをデバッグシンボルとみなしてビルドを止めます。

注意: 設定を変更した後は、シーン遷移、データ保存、Addressables、決済や広告などの外部 SDK が実機で正しく動作することを確認してから、stripping level を上げてください。

クライアント側保護の限界

Mono ビルドは一般的なツールで逆コンパイル・改変できるため、改変されたビルドはクライアント側の検査を飛ばせます。IL2CPP は改変のコストを大きく高めますが、完全な防止ではありません。本当の対策は、サーバー検証と、ゲームコードを Secure Variables などの OZero API に依存させることです。

回避による被害が大きいゲームには、次の構成を推奨します。

詳しく: 起動ファイルの編集とロードアンカー

プレイヤーの起動ファイルの編集。 Unity は RuntimeInitializeOnLoads.json、ScriptingAssemblies.json、globalgamemanagers.assets のスクリプト表から OZero の起動地点を見つけます。これらのファイルを削除または編集したビルドでは、OZero がまったく起動しないことがあります。SDK 1.2.0 は次の 3 つで対応します。

  • ネイティブロードアンカー: スクリプトが実行される前に OZero のネイティブコードが先に起動します。Windows・macOS・Linux はプラグインの Load on startup 設定でプレイヤーがロードします。iOS と IL2CPP の Android はネイティブコアがアプリのバイナリにリンクされ(Android は Plugins/Android/<abi>/libOZeroSecurity.a が libil2cpp.so の中に)、静的初期化で起動するため、manifest や起動用 JSON ファイルを編集しても影響を受けず、回避には libil2cpp.so のバイナリパッチが必要です。Mono の Android は静的リンクができないため、OZeroSecurityBoot.androidlib の ContentProvider が libOZeroSecurity.so をロードします。90 秒以内に OZero のブートストラップが開始されない場合、ネイティブコードがプロセスを終了します(abort reason 0x0BADB008)。
  • ハッシュ範囲: これらの起動ファイルは Build Integrity の集約ハッシュ(oz_ahash)に常に含まれます。Windows・macOS・Linux(Mono・IL2CPP)は 4 ファイルすべて、Android は RuntimeInitializeOnLoads.json と ScriptingAssemblies.json が対象のため、OZero の起動後は一部だけの編集も検出されます。
  • manifest 署名: Standard プリセットも Strict と同様に署名済み manifest を要求するようになりました(Require Manifest Signature オン)。
Development ビルドのデバッグ: Wait For Managed Debugger をオンにした Development ビルドは、デバッガーがアタッチされるまで最初のシーンをロードする前に停止します。90 秒以内にアタッチしないと、ロードアンカーがプレイヤーを終了します(abort reason 0x0BADB008)。開発用の例外スイッチは攻撃者にとってもスイッチになるため、用意していません。
SDK 単独では防げないケース: 攻撃者が globalgamemanagers の preload 一覧から OZero を外す(デスクトップ)か、アプリのバイナリをパッチ(iOS、IL2CPP の Android)したうえでビルドを再署名すると、OZero が起動しない状態を作れてしまいます。Mono の Android ではずっと簡単で、manifest から provider を削除して APK を再署名するだけでアンカーがなくなるため、Android のリリースビルドには IL2CPP を使ってください。根本的な対策は、ゲームコードを Secure Variables(OZeroSV) などの OZero API に実際に依存させ、OZero を外したビルドではゲームを進められないようにすることです。
OZero の Windows ネイティブプラグインは C/C++ ランタイムを静的に含むため、プレイヤーの PC に Visual C++ 再頒布可能パッケージがなくても動作します。

macOS: Developer ID 署名と公証

Unity が作成した macOS ビルドは ad-hoc 署名のため、Build Integrity がオンだと起動から約 10 秒後に終了します。配布するには Developer ID Application 証明書で署名する必要があります。自動署名をオンにしておくと、ビルドの終了時に OZero が署名します。

自動署名をオンにする(推奨)

  1. Window > OZero Security > macOS Distribution Signing を開き、Sign macOS builds をオンにしてください。ビルドターゲットが macOS なら、Check Setup の Open signing settings からも開けます。
  2. Certificate で Developer ID Application 証明書を選んでください。キーチェーンに 1 つしかなければ Automatic のままで構いません。
  3. ビルド中に公証も行う場合は Notarize をオンにし、xcrun notarytool store-credentials で一度作成した Notary keychain profile の名前を入力してください。
  4. Save をクリックしてください。以降、macOS ビルドが終わるたびに自動で署名され、Console に macOS distribution signing complete と表示されたらそのまま配布できます。
注意: codesign にはロック解除されたキーチェーンが必要なため、ログインした Mac のセッションでビルドしてください。署名済みのアプリを後から別のツールで署名し直すと整合性ファイルが一致せず起動時に終了するため、再署名しないでください。
詳しく: 自動署名の設定と CI

必要なもの: Xcode command line tools をインストールした Mac と、ログイン中のユーザーのキーチェーンにある Developer ID Application 証明書。公証も行う場合は、xcrun notarytool store-credentials <プロファイル名> で公証用の資格情報を一度保存してください。

  • Certificate の一覧から Developer ID Application 証明書を選びます。キーチェーンに 1 つしかない場合は Automatic のままで構いません。Refresh で一覧を読み直します。証明書が CI 用キーチェーンなど検索リスト外のキーチェーンにある場合だけ、Advanced (CI or a separate keychain) で Keychain path を指定して Refresh を押してください。それ以外は Advanced を空のままにします。
  • Save をクリックします。以降、macOS ビルドが終わるたびに OZero が自動で署名します(ネストされたコード → OZero 整合性ファイルの再生成 → アプリの署名 → 検証 → 選択時は公証)。Console に macOS distribution signing complete (TeamIdentifier=…) が表示されたら、そのまま配布できます。設定は ProjectSettings/OZeroMacOSSigning.json に保存され、秘密値は保存しません。
  • キーチェーンに Developer ID Application 証明書がちょうど 1 つある場合は、Auto Setup ですぐにオンにできます(macOS distribution signing: Off -> On ステップ)。
設定は ProjectSettings/OZeroMacOSSigning.json に保存され、バージョン管理でチームと共有されます。パスワードは保存しません。ビルドは Mac にログインしたセッションで行ってください。codesign はロック解除されたキーチェーンが必要なため、SSH やロックされた CI セッションでは失敗します。署名に失敗するとビルドも失敗します。Valve の libsteam_api は署名を自動で維持します。他のベンダー署名済みプラグインは Keep vendor signature に記入してください。自動署名がオフ(既定値)の間は、ビルドログに署名の案内が残り、アプリは ad-hoc 署名のままです。Windows のエディターは署名できないため、この設定がオンのまま macOS ビルドを行うと失敗します。その PC では OZERO_MACOS_AUTOSIGN=0 を設定し、Mac でスクリプトを使って署名してください。 署名ログはビルドフォルダーではなく、プロジェクトの Library/OZeroMacSign-logs/<アプリ名> に残ります。
CI: 環境変数は保存された設定より優先されます。OZERO_MACOS_AUTOSIGN(1 または 0)、OZERO_MACOS_SIGN_IDENTITY、OZERO_MACOS_SIGN_KEYCHAIN、OZERO_MACOS_KEEP_SIGNED、OZERO_MACOS_NOTARY_PROFILE(値があると公証をオンにします)。ビルドの前に、ジョブ内で署名用キーチェーンのロックを解除してください。
Windows でビルドした場合や既存の .app に署名する場合: 署名スクリプト

OZero 同梱のスクリプトを Mac で実行します。.app と、そのアプリをビルドした Unity プロジェクトを指定し、実行前にエディターでそのプロジェクトを閉じてください。

bash "/path/to/YourProject/Assets/OZeroSecurity/Tools/macOS/OZeroMacSign.sh" \
  --app "/path/to/YourGame.app" \
  --project "/path/to/YourProject" \
  --notary-profile "YourNotaryProfile"

スクリプトが done を出力したら、そのまま配布できます。その後は再署名しないでください。再署名が必要な場合は、そのアプリに対してスクリプトをもう一度実行します。スクリプトが途中で止まった場合は、最後の行に失敗した手順と対処が表示され、ログは現在のフォルダーの OZeroMacSign-logs に残ります(--log-dir で変更できます)。

オプション: キーチェーンに Developer ID 証明書が複数ある場合は、security find-identity -v -p codesigning に表示される証明書の SHA-1 を --identity で指定します。公証を自分で行う場合は --notary-profile を省略します。Steamworks(libsteam_api)は Valve の署名を自動的に維持し、他のベンダー署名済みプラグインは --keep-signed <ファイル名> で指定します。スクリプトはプロジェクトのエディターバージョンを Unity Hub のフォルダーと Spotlight から探します。見つからない場合は、--unity で Unity 実行ファイルを指定するか、環境変数 OZERO_UNITY_PATH を設定してください。すべてのオプションは --help で確認できます。
Entitlement

自動署名とスクリプトが自動で選びます。--entitlements で独自のファイルを渡す場合や、OZero のツールを使わずに署名する場合は、この表に従ってください。

Entitlement IL2CPP(推奨) Mono Steamworks などベンダー署名済みプラグインも使う場合
com.apple.security.cs.allow-jit—必要—
com.apple.security.cs.disable-library-validation——必要
com.apple.security.cs.allow-dyld-environment-variables追加しない追加しない追加しない
com.apple.security.get-task-allow追加しない追加しない追加しない
追加しない の項目があると、OZero はアプリを終了します。allow-dyld-environment-variables は macos_unsafe_dyld_state、ローカルの任意のプロセスがデバッガーを接続できるようにする get-task-allow は macos_debuggable_signature と判定されます。disable-library-validation がある場合、OZero はブロックせず警告ログのみを残します。より範囲の広い disable-executable-page-protection は不要です。
それでもアプリが終了する場合: メッセージ別の原因と対処
メッセージ 原因 対処
macos_unsafe_dyld_stateアプリが hardened runtime なしで実行されました(例: Unity のビルドをそのまま配布)。または allow-dyld-environment-variables が含まれています。自動署名をオンにするか、スクリプトで署名してください。独自の entitlement ファイルを使う場合は、その項目を削除してください。
macos_debuggable_signatureget-task-allow が含まれています。entitlement ファイルから削除し、署名し直してください。
macos_outer_signer_mismatch整合性ファイルの再生成後に、外側の .app を別の証明書または ad-hoc で再署名しました。自動署名で再ビルドするか、そのアプリに対してスクリプトを再実行してください。外側の .app は同じ Developer ID で 1 回だけ署名します。
aggregate hash mismatch整合性ファイルの再生成後にファイルを署名または変更しました。または再生成を省略しました。自動署名で再ビルドするか、そのアプリに対してスクリプトを再実行してください。その後はアプリ内のファイルを変更しないでください。
Library not loaded … different Team IDsdisable-library-validation がないため、macOS が Steamworks などのベンダー署名済みプラグインを読み込みませんでした。OZero の起動前に発生します。自動署名またはスクリプトを使ってください。どちらもベンダー署名を維持する場合はこの entitlement を自動で追加します。自分で署名する場合は entitlement ファイルに追加してください。
macOS nested signing failed (OZeroMacSign.sh exit …)codesign がキーチェーンを使えませんでした。SSH やロックされた CI セッションでビルドしたか、Developer ID Application 証明書がインストールされていません。Console にスクリプトの出力が表示されます。Mac にログインしたセッションでビルドするか、CI ジョブ内でキーチェーンのロックを解除してください(security unlock-keychain)。証明書は security find-identity -v -p codesigning で確認します。
Notarize is on but no notary keychain profile is set署名設定で Notarize がオンですが、公証用キーチェーンプロファイルが空です。ビルドは署名前に停止します。xcrun notarytool store-credentials <名前> でプロファイルを作成して Notary keychain profile に名前を入力するか、Notarize をオフにしてください。
more than one identity matchesキーチェーンに条件に一致する証明書が複数あります。Certificate の一覧から証明書を 1 つ選ぶか、表示された一覧の SHA-1 を 1 つ Advanced > Identity (SHA-1 or name) に入力してください(スクリプトでは --identity)。
スクリプトを使わずに署名する(CI または独自のパイプライン)

自動署名とスクリプトは、次の 3 つの手順をこの順序で実行します。独自のパイプラインで署名する場合も順序を守ってください。手順 3 の後に何かを再署名した場合は、3 つの手順を最初からやり直す必要があります。

  1. Contents 内のすべての .dylib、.bundle、.framework を codesign --force --options runtime --timestamp で署名します。Valve の libsteam_api は Valve の署名のまま残します。
  2. OZero の整合性ファイルを再生成します。署名すると OZero がビルド時にハッシュしたプラグインファイルが変わるため、この手順を省くとアプリは 0x0A で終了します。ビルドを作成したプロジェクトで Unity を batch mode で実行し、OZERO_MACOS_SIGNED_APP_PATH に .app のパスを指定します(下のコマンド)。IL2CPP と Mono のどちらのビルドも同じ手順です。再生成では、署名した内部コード(GameAssembly.dylib、Mono は UnityPlayer.dylib)の Team ID も記録します。
  3. 外側の .app を --deep なしで、同じ Developer ID と下の entitlement を使って 1 回だけ署名し、公証と staple を行います。外側の署名の Team ID が記録値と異なるか ad-hoc の場合、OZero は macos_outer_signer_mismatch(0x0A)でアプリを終了します。配布物をコピーして外側の署名だけを差し替え、権限を追加したりライブラリを差し込んだりしたコピーを防ぐための検査です。
OZERO_MACOS_SIGNED_APP_PATH="/path/to/YourGame.app" \
  "/path/to/Unity.app/Contents/MacOS/Unity" -batchmode -nographics -quit \
  -projectPath "/path/to/YourProject" \
  -executeMethod OZeroSDK.Security.Editor.OZeroMacOSPostSignIntegrityRebaker.RebakeAfterNestedSigning \
  -logFile rebake.log

Windows / Linux: コード署名と整合性ファイルの再生成

OZero DLL のコード署名: OZero の Windows ネイティブ DLL(OZeroSecurity.dll、OZeroSecurity64.dll、OZeroPCStoreBridge.dll、OZeroPCStoreBridge64.dll、Pro パッケージを含む)には、OZero Security Inc 名義のコード署名とタイムスタンプが入っています。ファイルを右クリックして プロパティ > デジタル署名 を開き、署名者が OZero Security Inc でタイムスタンプがあること、署名の詳細で署名が有効であることを確認してください。署名がない場合や別の発行元が表示される場合は正規のパッケージではないため、カスタマーポータルまたは購入したストアから再度ダウンロードしてください。

Windows や Linux のビルドに自分でコード署名をしない場合、以下の手順は読み飛ばしてください。ビルド後に実行ファイルやネイティブモジュールに署名した場合は、署名の後で OZero の整合性ファイルを再生成する必要があります。そうしないと起動時に整合性エラー(0x0A)で終了します。

  1. 通常どおりビルドしてから、実行ファイルと自社で作成した DLL・.so に署名してください。OZero の DLL はすでに署名済みのため、再署名は不要です。リリースビルドには OS が信頼する証明書が必要で、自己署名のテスト証明書では通りません。
  2. 下のコマンドで、署名済みの出力に合わせて整合性ファイルを再生成してください。エディターでは Tools > OZero Security > Re-bake Integrity After Code Signing (Windows or Linux player)... も使えます。
  3. そのままパッケージ化して配布してください。整合性ファイルは <Game>_Data/StreamingAssets の下にあり、署名の対象ではありません。サーバー検証を使う場合は、再生成が出力した manifest ハッシュを登録してください。
set OZERO_SIGNED_PLAYER_PATH=C:\dist\YourGame.exe
"C:\Program Files\Unity\Hub\Editor\<version>\Editor\Unity.exe" -batchmode -nographics -quit ^
  -projectPath "C:\path\to\YourProject" ^
  -executeMethod OZeroSDK.Security.Editor.OZeroStandalonePostSignIntegrityRebaker.RebakeAfterSigning ^
  -logFile rebake.log
OZero の DLL にも署名した場合: ポリシー上、出力フォルダーのすべての DLL に署名する必要があり OZero の DLL にも署名した場合、署名が変わることでファイルの内容も変わります。このときも手順 2 の再生成を行えば整合性ファイルが新しいファイルに合わせて更新されます。ただし、署名者は OZero Security Inc ではなく貴社の証明書として表示されます。プロジェクト内の元の DLL(Assets/OZeroSecurity/Plugins)には署名しないでください。ビルド時に OZero が署名した Variant マニフェストのハッシュと照合するため、元の DLL が変わるとビルドが止まります。
独自のビルドスクリプト: セキュリティ設定の読み取りと変更(上級)

OZero はビルド開始時(コールバック順序 50)にセキュリティ設定を oz_cfg.bin に焼き込みます。設定は Assets/ の外の Project Settings にあるため、ビルド中に何も移動・復元せず、平文の設定アセットがプレイヤーに含まれることもありません。OZeroSecurityConfig.Instance は、焼き込みの前後どのコールバック順序でもプロジェクトの設定を返します。WebGL ビルドは平文のアセットの代わりにビルド時に生成したリソースを使い、このリソースはビルド後に削除されます。

  • エディターコードでは OZeroSecurityConfig.Instance で値を読み取ります。callbackOrder の制限はありません。
  • スクリプト(CI やビルドパイプライン)から設定を変更するには OZeroSDK.Security.OZeroSecurityProjectSettings を使います。Load() は設定がなければ null を返し、LoadOrCreate() はない場合に Standard プリセットで作成して返し、Save() で保存します。返されたオブジェクトを new SerializedObject(...) などで編集します。保存前でも、ビルドはメモリ上の値を焼き込みます。
  • DeveloperSecret とマニフェスト署名用秘密鍵のパスは、UserSettings/OZeroSecuritySecrets.json にあるユーザーごとの値です。ビルドマシンでは OZERO_DEVELOPER_SECRET と OZERO_MANIFEST_SIGNING_PRIVATE_KEY_PATH を設定してください。設定した環境変数は保存された値より優先され、ファイルには書き戻されません。
  • SDK 1.1 以前の OZeroSecurityConfig アセットが Assets/ の下に残っているとビルドが停止します。Check Setup(Import または Auto Setup)で取り込むか、バッチモードでは -executeMethod OZeroSDK.Security.Editor.OZeroLegacyConfigImporter.ImportForBatchMode を使ってください。
  • オンラインアドオンのライセンス設定も同じ仕組みです。ProjectSettings/OZeroLicenseSettings.asset に保存され(ファイルがなければ Standard、サーバー未使用のビルド)、スクリプトからは OZeroSDK.Security.License.OZeroLicenseProjectSettings(Load、LoadOrCreate、Save、Reload)で変更します。プレイヤーにはビルド時に生成した暗号化リソースとして含まれ、このリソースはビルド後に削除されます。Assets/ の下に古い OZeroLicenseConfig アセットが残っていてもビルドが停止するため、Check Setup(Old OZeroLicenseConfig asset found)またはバッチモードの -executeMethod OZeroSDK.Online.Editor.OZeroLegacyLicenseImporter.ImportForBatchMode で取り込んでください。

Android ProGuard / R8 の設定

Unity で Project Settings > Player > Android > Publishing Settings を開きます。Minify Release をオンにした場合は、Custom ProGuard File も有効にした後、以下のルールを proguard-user.txt に追加してください。Minify を使用しない場合、別途の ProGuard 設定は必要ありません。
# OZero Security - Unity Android ProGuard/R8 keep rules
-keep class com.unity3d.player.UnityPlayer { *; }
-keep class com.unity3d.player.UnityPlayerActivity { *; }
-keep class com.unity3d.player.UnityPlayerGameActivity { *; }
-keep class com.unity3d.player.UnityPlayerForActivityOrService { *; }
-keepattributes *Annotation*,InnerClasses,EnclosingMethod,Signature

# If your game adds custom Java/Kotlin bridge classes that OZero or your code
# calls through AndroidJavaClass / AndroidJavaObject, keep those classes too.
# Replace the package below with your own bridge package.
# -keep class com.yourcompany.yourgame.bridge.** { *; }
詳しく: ルールが必要な理由と Android のネイティブ構成

OZero Security は別途の Java SDK パッケージを要求しません。ただし、Android リリースビルドで Minify、ProGuard、R8 を有効にした場合は、Unity Java ブリッジとプロジェクトで使用するカスタム Android ブリッジクラスを保持する必要があります。そうすることで、パッケージ情報、インストール元、APK 署名証明書チェック、ブートアセットロードに必要な JNI 呼び出しが難読化以降も安定して動作します。

  • Minify をオンにした後にのみ、Android ログで JNI 照会失敗、インストール元検知失敗、APK 署名チェック結果が空と表示される場合は、まずカスタムブリッジの keep ルールを確認してください。
  • ストア配布用のビルドは、IL2CPP、リリース署名、Android Sha Keys に登録された予想される Android SHA-256 フィンガープリント、そして少なくとも1台の実際のデバイスでのクリーン実行テストを基準に検証してください。

ネイティブコアとブート provider: パッケージには ABI ごとに libOZeroSecurity.so と静的コア libOZeroSecurity.a の両方が含まれ、ビルド時に OZero が Scripting Backend に合わせて一方を選ぶため、プラグインのインポート設定を変更する必要はありません。IL2CPP は libOZeroSecurity.a を libil2cpp.so にリンクし、.so とブート provider は除外するため、APK に libOZeroSecurity.so はなく、OZero のコードは libil2cpp.so のハッシュに含まれます。Mono は libOZeroSecurity.so と Plugins/Android/OZeroSecurityBoot.androidlib を含めます。Unity はこのライブラリをエクスポートした Gradle プロジェクトにサブプロジェクトとして追加し、マージされた manifest に provider com.ozerosecurity.boot.OZeroBootProvider(exported=false、authority <applicationId>.ozerosecurity.boot)が追加され、この provider がアプリのプロセス開始時に .so をロードします。カスタムの main manifest や Gradle テンプレートを使う場合も、このライブラリと provider を外さないでください。Mono ビルドがネイティブライブラリをロードできない場合(端末の ABI 用の .so がない場合を含む)、アプリは起動直後に終了します。

5 セキュリティ設定 (OZeroSecurityConfig)

セキュリティ設定は、パッケージを import すると Standard プリセットで作成されます。Edit > Project Settings > OZero Security で編集し、Window > OZero Security > Config & Dashboard も同じページを開きます。共有の値は ProjectSettings/OZeroSecuritySettings.asset に保存され、秘密値を含まないためバージョン管理にコミットします。DeveloperSecret とマニフェスト署名用秘密鍵のパスはユーザーごとの値で UserSettings/OZeroSecuritySecrets.json に保存され、バージョン管理には含めません。ランタイムとエディタースクリプトでは OZeroSecurityConfig.Instance で読み取り、スクリプトから値を変更する場合は独自のビルドスクリプトを参照してください。ページは Quick Preset、Project & Advanced(Common Settings、Editor Play Mode)、Detection Response(Global Threat Response、Player Notice (Managed UI))、Protection Modules の順です。すべてのセクションは折りたたまれた状態で始まるため、タイトルをクリックして展開してから設定してください。Security Termination Notice のポリシーは Detection Response の Player Notice (Managed UI) にあります。

OZero Security page in Edit > Project Settings (Config & Dashboard)

共通設定

すべてのセキュリティモジュールで共有される最上位設定です。この表のデフォルト値は、コードに定義されたシリアライズ初期値を基準にしています。Security Config では Project & Advanced グループの Common Settings にあり、Keys & Storage、Build Checks (Preflight)、Logs & Diagnostics に分かれています。

フィールド Type デフォルト 説明
developerSecret string "" OZeroSV_File と OZeroSafePlayerPrefs のデータを保護するためのプロジェクト別 secret です。任意の文字列を手入力するのではなく、Config Dashboard の Generate Secure Secret ボタンで生成してください。ゲームごとに異なる値を使い、文書、ログ、公開リポジトリに出さないでください。リリース後にこの値を変更すると、古いビルドが保存した保護データを新しいビルドで復号できません。ユーザーごとに UserSettings/OZeroSecuritySecrets.json に保存され、バージョン管理には含まれません。プロジェクトをビルドするすべてのマシンで同じ値が必要なため、パスワードマネージャーで共有するか、ビルドマシンでは OZERO_DEVELOPER_SECRET を設定してください。
enableLog bool true Enable Debug Logs をオンにすると、SDK 初期化、設定の読み込み、ライセンス/テレメトリの流れ、検知イベントなどの内部状態が Unity Console と Player ログに出力されます。開発/QA 段階で原因を特定するのに役立ちますが、検知フローやモジュールの状態が露出する可能性があるため、本番ビルドではオフにすることを推奨します。
enableFailureDiagnostics bool false Enable Failure Diagnostics をオンにすると、セキュリティ違反が発生した際にローカル診断ファイルを Application.persistentDataPath に保存します。ファイルにはモジュール名、ハッシュ、デバイスの状態、インストールパッケージ名、ランタイム設定の一部が含まれる可能性があるため、QA やカスタマーサポートセッションでのみオンにすることを推奨します。

プラットフォームごとの既定の保存場所:
  • Windows: %USERPROFILE%\AppData\LocalLow\CompanyName\ProductName
  • macOS: ~/Library/Application Support/CompanyName/ProductName
  • Linux: ~/.config/unity3d/CompanyName/ProductName
  • Android: /storage/emulated/0/Android/data/package.name/files
  • iOS: アプリサンドボックスの Documents フォルダ
  • WebGL: ブラウザの IndexedDB に基づく /idbfs ストレージ
重要: 最初のリリース前に Generate Secure Secret で developerSecret を生成してください。この値はバージョン管理ではなくユーザーごとに UserSettings/OZeroSecuritySecrets.json に保存され、プロジェクトをビルドするすべてのマシンで同じ値を使う必要があります。パスワードマネージャーで共有するか、ビルドマシンでは環境変数 OZERO_DEVELOPER_SECRET を設定してください(設定すると保存された値より優先されます)。リリース後は変更しないでください。この値を変更すると、既存ユーザーの OZeroSV_File ファイルは読み取れなくなり null が返ります(キー変更として記録され、改ざんとは判定されません)。OZeroSafePlayerPrefs の値は既定値に戻ります。ゲーム側でセーブデータを移行または初期化しない限り、ユーザーはセーブデータを失います。

Player Notice (Managed UI)(全ライセンス)

Security Termination Notice、共通 dialog prefab、localization は StandardとPro で利用できます。Pro では Build Integrity と Steam DRM 用の Managed Verification retry・timeout・provider 設定も表示されます。optional package の import 前に Package Manager から Unity UI と TextMeshPro を install してください。通知はすでに予約された終了を説明するだけで、終了の取消や native deadline の延長はできません。

Build preflight: すべてのライセンスで Security Termination Notice が OZeroBuiltIn の場合、または Pro Managed Verification が Built-In の場合は optional TMP package が必要です。不足すると build を停止します。Dedicated Server では Built-In UI を使用できないため Disabled または custom callback/logging を選択してください。graphical project は Window > OZero Security > Check Setup の Import Package で修復します。
Localization: EN・KO・JA・ZH-CN・ZH-TW の安全な文言を提供します。securityUiLanguageCode、設定 fallback、英語の順で選択します。Managed Verification server の Reason 原文は表示しません。拡張には Tools > OZero Security > Localization > Managed Verification Text を使用します。
即時 fail-close 境界: Bootstrap/config/trust/初期 variant・assembly 検証および watchdog start の失敗は popup なしで即時終了します。Boot-ACK timeout、watchdog 終了、実際の crash、OS kill、headless 実行も UI を保証しません。通知 dispatch は RuntimeNoticeReady 後のみです。安全な OZ-SEC-* code だけを表示し、内部検知情報は公開しません。
ネイティブリリース契約: Windows、macOS、Linux、Android、iOS Player には、一致する ABI 21 ネイティブ variant、有効な OZero 署名付き Variant Manifest V3、保護設定の bootstrap policy field と一致する正確な 8-byte oz_boot.bin が必要です。欠落、不正形式、未署名、不一致、または旧 ABI の artifact は build/runtime failure です。oz_boot.bin は平文の環境フラグだけを含み、改ざん認証 artifact ではありません。
フォント範囲: optional package には、OZero が提供する EN・KO・JA・ZH-CN・ZH-TW のダイアログ文に必要な文字だけが Static TMP SDF subset として含まれます。標準文言は追加のフォント作業なしで使用できます。文言の変更、言語の追加、subset 外の文字表示を行う場合は、charset ファイルから Static SDF を再生成するか、プロジェクト所有の custom prefab でフォントを直接参照してください。更新しないと missing glyph が表示されることがあります。OZero の原本ではなく、プロジェクト所有フォルダーの prefab とフォントを編集してください。
フィールド Type デフォルト 説明
securityTerminationNoticePolicyenumDisabled全ライセンス。runtime fatal event で通知なし、OZero Built-In、custom callback のいずれかを選択します。Low・Standard security preset は Built-In、Strict は Disabled です。初期 fail-close 経路には表示されません。
securityUiDialogPrefabResourcePathstring""全ライセンス。project 所有 security dialog prefab の Resources path です。空の場合は optional TMP package の既定値を使います。旧 managedVerificationDialogPrefabResourcePath 値は自動移行されます。
securityUiLanguageCodestringauto全ライセンス。終了通知と Managed Verification UI の言語です。auto は Application.systemLanguage に従います。旧 managedVerificationLanguageCode 値は自動移行されます。
securityUiFallbackLanguageCodestringen全ライセンス。内蔵英語の安全文言より前に使用する fallback 言語です。旧 managedVerificationFallbackLanguageCode 値は自動移行されます。
Security Config > Pro - License & Online Services > Online Verification UI > Ui Policy (Pro)enumBuiltInBlockingDialogPro Only 機能です。OZero Managed Build Integrity と Steam DRM の状態をユーザーへ表示する UI フローを選択します。内蔵のブロッキング/通知ダイアログには TextMeshPro と optional OZeroSecurity_BuiltInDialog_TMP.unitypackage の import が必要です。この package を import しない場合、または独自 UI に置き換える場合は Custom UI / Callback Only を使用してください。
Security Config > Pro - License & Online Services > Online Verification UI > Retry Timeout Seconds (Pro)int15ユーザーが Retry を押した後、retry-timeout 状態へ移るまで待機する最大時間です。プレイヤーが無期限の検証待ちにならないようにします。
Security Config > Pro - License & Online Services > Online Verification UI > Online Required Timeout Seconds (Pro)int120オンライン必須ダイアログを表示してから、設定された timeout action を適用するまで待機する最大時間です。
Security Config > Pro - License & Online Services > Online Verification UI > Timeout Action (Pro)enumBlockSession検証が時間内に復旧しない場合の動作を制御します。ダイアログを表示し続ける、保護セッションをブロックする、アプリを終了する、またはカスタムフロー用の callback のみ呼び出す、のいずれかを選択します。
Security Config > Pro - License & Online Services > Online Verification UI > Auto Retry When Network Restored (Pro)boolfalseネットワーク接続が復旧した後に Managed Verification を自動で再試行します。明示的なプレイヤー操作なしで再試行しても安全なゲームフローでのみ有効にしてください。

Global Threat Response

セキュリティの脅威が確認されたときのゲームの反応を設定します。テスト中はコールバックとログを先に確認し、実際の配布ビルドではプレイヤーへの通知時間と終了ポリシーをプロジェクトの運用方法に合わせて選択してください。

フィールド Type デフォルト 説明
forceQuitOnDetection bool true forceQuitOnDetection は、確定した脅威が検知されたときに SDK がゲームを自動終了するかどうかを決定します。オフにするとコールバックとログだけを確認でき QA には便利ですが、実際の配布ビルドでは迂回されたクライアントが実行を続ける可能性があるため、慎重に選択してください。
fatalCallbackGraceSeconds float 10 fatalCallbackGraceSeconds は、脅威検知後、ゲーム側のセキュリティコールバックがプレイヤーへの通知 UI を表示できる最大時間です。デフォルト値は 10 秒です。0 に設定すると、通知時間を置かずに即座に終了する以前の方式で動作します。

連携トラブルシューティング

OZero Security を有効化した後にアプリが終了する場合、または特定の環境でだけ問題が出る場合は、まずローカル診断ファイルでどのモジュールが反応したかを確認してください。推測で設定を変えるのではなく、ファイル内の module、subCode、reason を基準に下の表を順に確認します。

終了通知に OZ-SEC-* サポートコードが表示された場合は、問い合わせに含めてください。ポップアップがないことは OZero が無関係である証拠ではありません。初期 fail-close、Boot-ACK・watchdog 終了、実際の crash、OS kill は UI より先に終了する場合があります。ozero_abort.txt、Player log、Check Setup、build preflight の結果を確認してください。Strict preset の通知既定値は Disabled です。
Enable Failure Diagnostics は QA またはカスタマーサポートで原因を確認するときだけ有効にしてください。ファイルにはモジュール名、ハッシュ、デバイス状態、インストーラーパッケージ名、ランタイム設定の一部が含まれる場合があります。公開リリースビルドでは有効にしたまま配布しないでください。

アプリが繰り返し終了する場合

手順 実施内容 確認方法
1Unity で Edit > Project Settings > OZero Security(または Window > OZero Security > Config & Dashboard)を開き、Common Settings > Logs & Diagnostics > Enable Failure Diagnostics を有効にします。QA またはサポート中に原因を確認するときだけ使用し、公開リリースでは有効にしたまま配布しないでください。
2追加で設定を変える前に、同じビルドで問題を一度再現します。再現前に複数の設定を同時に変えると原因を追いにくくなります。まず現在の状態の診断ファイルを確保してください。
3Application.persistentDataPath にある最新の ozero_*_failure.log ファイルを開きます。Build Integrity は ozero_integrity_failure.log と、ozero_integrity_platform_native_failure.log のような詳細ファイルを同時に作る場合があります。アプリが非常に早い段階で終了して failure log がない場合は、ozero_abort.txt と Player log も確認してください。
4ファイルを収集したら、Enable Failure Diagnostics を再度オフにします。サポート手順で明示的に必要な場合を除き、公開リリースビルドで有効にしたままにしないでください。

よく見る診断項目

項目 意味 次に確認すること
moduleイベントを発生させた保護領域です。まず同じ系統の FAQ 行を確認し、必要に応じて Build Integrity、Speed & Time Hack、Injection、Install Source、License など関連 manual セクションへ移動してください。
subCode / checkName短い原因コードまたはチェック名です。下の FAQ で同じ系統の症状を探すときに使います。たとえば platform_native は platform、emulator、signing、root、jailbreak 関連の設定を先に見るという意味です。
reason / subReasonSDK が反応した理由を人が読める形でまとめた内容です。これは最終判断ではなくヒントです。まず module と subCode を確認し、その後で同じキーワードを含む下の症状行を探してください。
platform / buildTypeアプリが実行されたプラットフォームとビルド種類です。QA 用エミュレーターや development build の問題と、実際の release device の問題を分けて見てください。

よくある症状と最初の確認

症状 可能性が高い領域 まず試すこと
OZero 適用後、アプリが起動直後に終了します。起動中にセキュリティ応答が実行された可能性があります。Failure Diagnostics を有効にして一度再現し、module、subCode、reason を確認してください。failure log がない場合は ozero_abort.txt と Player log を確認し、Unity では Window > OZero Security > Check Setup も実行してください。
Android エミュレーターでアプリが繰り返し終了します。Build Integrity または platform native check がエミュレーターを未対応ランタイムとして扱っている可能性があります。エミュレーター QA では blockEmulator (Android) または関連する platform check policy を緩和してください。ただし、リリースビルドでエミュレーターをブロックする方針なら、ストア配布前にポリシーを戻してください。
ライセンス認証に失敗する、または任意の Pro サーバー機能を利用できません。ライセンスキー、アプリ識別情報、ネットワーク、サーバー署名キーの問題が考えられます。ライセンス問題の解決 で LICENSE_NOT_FOUND、ANDROID_BUNDLE_ID_MISMATCH、timeout、signature verification failure など実際のログを確認してください。
Build Integrity または manifest 検証が失敗します。manifest がない、古い、未署名、または現在のビルドと一致していない可能性があります。Check Setup を実行し、integrity manifest を再生成し、signing key を検証してから clean build を作成してください。コード、IL2CPP 出力、watched file、manifest signing key が変わった後は再生成が必要です。
一時停止、スローモーション、早送り後にアプリが終了します。直接 Time.timeScale を変更するコードが時間操作のように見える場合があります。OZeroTime.timeScale を使用してください。TimeScaleTamperExemptions は検証済み plugin または legacy adapter script に限定してください。
長いロード画面中にアプリが終了します。メインスレッドが非常に長くブロックされていました(Watchdog はブロックされたスレッドを待ちますが、5 分以上停止したプロセスは終了します)。信頼できる長いロード区間だけ OZeroWatchdog.BeginLoadingGrace で囲んでください。通常のゲームプレイ停止を隠す目的で使わないでください。
Android で Minify/ProGuard/R8 を有効にした後、アプリが終了します。Unity または custom Android bridge class が削除またはリネームされた可能性があります。Android ProGuard / R8 keep rules を適用してください。Unity bridge class と、プロジェクトが呼び出す Java/Kotlin bridge class を保持する必要があります。
macOS ビルドが起動から約 10 秒後に BuildIntegrity (0x0A) で終了する。アプリが ad-hoc 署名である、hardened runtime がない、allow-dyld-environment-variables や get-task-allow がある、再署名後に整合性ファイルを再生成していない、または外側の .app を内部コードと異なる証明書で署名しています。macOS: Developer ID 署名と公証 に従い、自動署名またはスクリプトで署名してください。Player ログに原因(macos_unsafe_dyld_state、macos_debuggable_signature、macos_outer_signer_mismatch または aggregate hash mismatch)が表示され、その節の最後の表に原因ごとの対処があります。
クリーンな Windows PC で Standalone ビルドがすぐ終了します。OZero ネイティブプラグインがビルド出力に含まれていないか、読み込めていない可能性があります。OZero ネイティブプラグイン(OZeroSecurity64.dll など)がビルド出力に含まれていることを確認し、Player.log の DllNotFoundException が示すファイルを確認してください。OZero プラグインは VC++ ランタイムを必要としませんが、ゲームの他のプラグインは必要とする場合があります。
ビルドが OZeroSecurityConfig asset(s) found in the project で停止します。SDK 1.1 以前の OZeroSecurityConfig アセットが Assets/ の下に残っています。平文のまま配布されるおそれがあるため、ビルドが停止します。Window > OZero Security > Check Setup を開き、Old OZeroSecurityConfig asset found の Import を押してください(Auto Setup でも可)。値が Project Settings に移され、アセットは削除されます。独自のビルドスクリプトを参照してください。
ビルドが OZeroLicenseConfig asset(s) found in the project で停止します。SDK 1.1 以前の OZeroLicenseConfig アセットが Assets/ の下に残っています。平文のまま配布されるおそれがあるため、ビルドが停止します。Window > OZero Security > Check Setup を開き、Old OZeroLicenseConfig asset found の Import を押してください(Auto Setup でも可)。ライセンス設定が ProjectSettings/OZeroLicenseSettings.asset に移され、アセットは削除されます。
増分ビルド(例: Android)が OZero could not confirm its startup sentinel in these scenes, which Unity reused from the build cache というメッセージで止まります。Unity が変更のないシーンを処理せずにビルドキャッシュから再利用しましたが、OZero がそのシーン内容に起動 sentinel を追加した記録がありません(例: SDK 更新後の最初の増分ビルド)。Clean Build で一度ビルドしてください(Build Settings > Clean Build、または BuildOptions.CleanBuildCache)。OZero が処理したシーンを Library/OZeroSecurity/StartupSentinelScenes.txt に記録するため、以降の増分ビルドは通過します。メッセージが could not add its startup sentinel to any built scene の場合は、有効なシーンをビルドに 1 つ以上追加してください。
エディターで検出しても何も起きない、または Play Mode が勝手に止まる。Editor Play Mode Protection の設定(Off または Test)。Off(既定)はエディターでの検出をログに残すだけです。設定した応答を実行するには Test にしてください。Test では、プレイヤーなら終了する検出が猶予時間の後に Play Mode を停止します(ログ Editor Play Mode will stop in N ms)。エディター Play Mode を参照してください。
正常な overlay や録画ツールで Injection イベントが出ます。Injection/Hooking がロード済みモジュールを観測している状況です。まず Failure Diagnostics か Pro ポータルで検知されたモジュール名、ハッシュ、署名者を確認してください。正規のプログラムなら、Pro のお客様はポータル(インジェクション → 検出モジュール)で該当行の許可を押すと、次回のリスト更新で全端末に反映されます。Standard/Pro のお客様はハッシュを injectionWhitelistEntries に入れて新しいビルドを配布します。名前を挙げられないモジュールは許可しないでください。
optional Built-In TMP Dialog package の準備不足エラーでビルドが停止します。Built-In Managed Verification UI policy が選択されていますが、TextMeshPro、TMP Essential Resources、OZero dialog component、または既定 prefab が不足しています。Window > OZero Security > Check Setup を開き、Built-In TMP dialog エラーの Import Package を押してください。package import と script compilation の完了後に Check Setup を再実行し、もう一度ビルドしてください。ゲーム独自の UI を使う場合は Custom UI / Callback Only を選択します。
リリース前の確認: トラブルシューティング中に緩和した設定は、出荷前に再確認してください。エミュレーターブロック、強制終了ポリシー、manifest 署名、ProGuard rules、ローカル診断設定は、リリース方針に合わせて元に戻すか、意図した値として確定してください。

ビルド整合性検証器の設定

修正されたゲームファイル、デバッガーの接続、異常な実行環境を検知するビルド整合性チェッカーを構成します。

フィールド Type デフォルト 説明
Activate Build Integrity checkbox On Dashboard の Build Integrity 有効化チェックボックスです。内部的には useIntegrity に対応します。
validateOnStartupbooltrueゲーム実行直後にビルド整合性チェックを実行します。
validateInEditorboolfalseUnity エディターでも検証を実行します。エディターでは Editor Play Mode Protection が Off(既定)の間は検出器が有効にならないため、Test のときだけ適用されます。テスト用には有用ですが、一般的な開発中はオフにすることを推奨します。
enablePeriodicValidationbooltrueゲームの実行中にも無欠性の検証を繰り返します。開始時に1回の検証だけで十分なビルドでない場合はオンにしておくことをお勧めします。
periodicCheckIntervalfloat300 sゲーム実行中に Build Integrity の再検証を繰り返す基準間隔(秒)です。0 以下にすると定期チェックを無効化します。
periodicCheckJitterPercentfloat35%検証の周期にランダムな変化を加えて、検査のタイミングを予測しにくくします。具体的な周期と範囲は公開された文書では案内せず、デフォルト値の使用をお勧めします。
timingAnomalyConsecutiveRequiredint7タイミングに基づく異常な信号が何回累積されなければデバッガーのタイミングのドリフトとして判断するか決めます。強いデバッガーの信号は即座に失敗することがあります。
timingAnomalyWindowSecondsfloat900 sタイミングに基づく異常な信号を累積する時間の窓です。長いほど寛大で、Strict はより短い窓を使用します。
timingAnomalyFrameHitchSuppressionSecondsfloat20 sシーンのロード、シェーダーのコンパイル、GC、OS のスケジューリングの遅延のような大きなフレームのヒッチが発生した後、一定の時間の間タイミングに基づくデバッガーの検査を緩和します。
checkAssemblyHashbooltrueビルド時に生成された manifest を基準に、コンパイル済みアセンブリのハッシュを検証します(起動時と定期再検査のランタイム検査)。ネイティブの起動時集計検査はこのオプションでは無効になりません。デスクトッププレイヤーでは設定を読み込む前に出荷バイナリを常に検証するため、アセンブリが改ざんされていれば起動段階でフェイルクローズします。その集計に含める IL2CPP ファイルは il2cppHash* フィールドで決まります。
checkDebuggerbooltrueデバッガー接続と、デバッガーのように見えるランタイムのタイミング異常を検知します。
failOnDebugBuildboolfalseUnity デバッグビルドを違反とみなします(リリースビルドで推奨)。
checkPlatformNativebooltrueプラットフォーム別のネイティブチェックを実行します。プラットフォームにより、root/jailbreak、APK 署名、実行環境、プロキシ、解析ツールのシグナルなどを確認します。
failIfManifestMissingboolfalse*Inspector のデフォルトは開発時の利便性のためオフです。ただし development ではないプレイヤービルドでは自動的にオンになり、oz_manifest.ozero が存在しない、または読み取れない場合は違反として処理します。
failIfAssemblyHashBlobMissingboolfalse*Inspector のデフォルトは開発時の利便性のためオフです。ただし development ではないプレイヤービルドでは自動的にオンになり、生成済みのアセンブリハッシュブロブを削除してもハッシュ検証を黙って回避できないようにします。
requireCodeSignature (Windows)boolfalseメイン実行ファイルに有効なコード署名が必要です。Windows 専用。署名すると実行ファイルのハッシュが変わるため、署名後に整合性ファイルを再生成してください(Windows / Linux: コード署名と整合性ファイルの再生成 参照)。省略すると Unexpected or modified native module で終了します。
blockVirtualMachine (Windows)boolfalse仮想マシン内部でのゲーム実行をブロックします。Windows 専用。
blockHyperV (Windows)boolfalseHyper-V VMBus の信号を遮断します。この検査は Hyper-V ゲストと、Hyper-V ルートパーティションとして動作するホスト PC を区別できないため、WSL2・Docker Desktop・Windows Sandbox・コア分離(VBS)・Hyper-V の役割を有効にしているユーザーも一緒に遮断されます。一般公開ビルドではオフのままにし、統制された環境でのみ使用してください。
blockNetworkProxies (Windows)boolfalseネットワークプロキシ、パケット検査、トラフィック分析ツールと疑われる実行信号を検知します。対戦型のビルドで使用するものの、誤検知の可能性をテストしてください。
blockReverseEngineeringTools (Windows)boolfalse逆アセンブルまたはデバッグツールと疑われる実行信号を検知します。開発/QA 環境とライブ環境を分離して検証してください。
blockSystemMonitorTools (Windows)boolfalseプロセス/システム監視ツールと疑われる実行信号を検知します。一般ユーザー環境での誤検知の可能性を考慮してください。
il2cppHashGameAssemblybooltrueIL2CPP デスクトップビルド(Windows・macOS・Linux)の GameAssembly バイナリ(.dll/.dylib/.so)をハッシュ検証します。IL2CPP ファイル保護の最小限の推奨項目です。
il2cppHashGlobalGameManagersboolfalseIL2CPP デスクトップのファイルハッシュ範囲に globalgamemanagers を追加します。コード上のデフォルトはオフですが、Standard と Strict プリセットではオンになります。SDK 1.2.0 以降、Windows・macOS・Linux では globalgamemanagers と globalgamemanagers.assets はこのオプションに関係なく、プレイヤーの起動ファイルとして常にハッシュされます。
il2cppHashSharedAssetsboolfalseIL2CPP デスクトップのファイルハッシュ範囲に sharedassets* ファイルを追加します。コード上のデフォルトはオフですが、Standard と Strict プリセットではオンになります。
il2cppHashSceneFilesboolfalseIL2CPP デスクトップのファイルハッシュ範囲に level* などの Unity シーンファイルを追加します。コード上のデフォルトはオフですが、Standard と Strict プリセットではオンになります。
il2cppHashResourcesAssetsboolfalseIL2CPP 検証範囲に resources.assets を追加します。Strict モードに有用ですが、パッチの流れを先にテストしてください。
il2cppAdditionalWatchedFilesList<string>—プロジェクトに別途のネイティブペイロードが含まれる場合、追加で監視する IL2CPP デスクトップの出力ファイルを _Data フォルダー(macOS は Contents/Resources/Data)からの相対パスで指定します。
blockEmulator (Android)booltrueAndroid 専用です。エミュレーターまたは未サポートのランタイムシグナルを整合性違反として扱います。QA/エミュレーターテスト中には緩和し、プロダクションビルドではより厳格なポリシーを推奨します。
blockSystemRwMount (Android)booltrueAndroid 専用です。システムパーティションが書き込み可能であったり root 系の mount 状態が見えれば整合性違反として処理します。Standard プリセットでは、アンロック済みまたは root 済み QA 端末での誤検知を減らすためにこの値を緩和します。
linuxHostLayerPolicy (Linux)enumMonitorLD_PRELOAD、LD_AUDIT、WINEDLLOVERRIDES のような Linux ホストレイヤーがゲームと OS の間にあるときの反応です。Off は無視、Monitor(Strict を含む全プリセットの既定)はゲームを終了せず記録のみ、Block は違反として扱います。正規の Steam Linux・Proton プレイヤーもこの層を使うため、Block はプレイヤー環境を検証したゲームだけで使ってください。
protonPolicy (Linux / Proton)enumMonitorWindows ビルドが Proton や Wine 上で動作しているときのポリシーで、値は上と同じです。既定の Monitor は Steam Deck・Proton プレイヤーのプレイを妨げず、環境をテレメトリーに記録します。
acknowledgeHostLayerBlockboolfalseBlock のホストレイヤー・Proton ポリシーを使う前に有効にする必要がある確認スイッチです。この確認なしに Block を設定するとビルドの preflight が失敗するため、正規の Linux プレイヤーのゲームを誤って終了させるビルドは出荷されません。
nativeModuleInventoryPolicyOff | Monitor | BlockBlock (Low: Monitor)Windows・Linux プレイヤー専用です。ビルドがゲームフォルダー配下のすべてのネイティブモジュール(*.dll / *.so)を署名付き整合性マニフェストに記録します。起動時に Build Integrity がフォルダーを列挙し記録済みファイルをハッシュ化して、一覧にないネイティブファイルやハッシュが変わったファイルを違反とみなします。Block(既定)は終了、Monitorは記録して続行、Offは検査を省略します。Injection 検知器も同じ一覧でゲーム自身のプラグインを識別します。プレイヤーがゲームフォルダーにネイティブのモッドローダーを追加することを許可するなら Monitor を選んでください。Low プリセットは Monitor です。
androidShaKeysList<string>—期待される APK 署名証明書の SHA-256 フィンガープリントの一覧です。インストールされた APK がこれらのキーのいずれかで署名されていない場合、検証に失敗します(Android 専用)。checkPlatformNative が有効なリリースビルドは、この一覧が空だとビルドが拒否されます。署名チェックがスキップされるのは checkPlatformNative を無効にした場合か開発ビルドの場合だけです。Android ではシーン・アセットファイル(globalgamemanagers、sharedassets*、level*、resources.assets)はハッシュされず、ネイティブライブラリと IL2CPP メタデータだけがハッシュされます。アセットを差し替えて再パッケージした APK を防ぐのはこの署名チェックなので、リリースビルドでは必ず設定してください。 Google Play アプリ署名を使う場合、ビルドはアップロード鍵で署名され、Play がユーザーにインストールする APK はアプリ署名鍵で再署名されます。両方の鍵の SHA-256 を追加してください(Play Console › 設定 › アプリの署名)。アップロード鍵だけではビルドは通りますが、Play からインストールしたすべてのユーザーが署名チェックに失敗します。
expectedBundleIds (iOS)List<string>—許可する iOS Bundle ID リストです。空いていれば Bundle ID の検査をパスします。
excludedAssembliesList<string>—ハッシュ検証から除外するアセンブリ名のリスト(.dll 拡張子を除く)。ランタイムに変更されるアセンブリ(例: 生成されたコード)に使用してください。
Security Config > Build Integrity > Pro - Online > Check Integrity With Server (Pro)boolfalsePro の nonce → attest フローを有効にします。ローカル Build Integrity が通過すると、SDK がビルド整合性の証拠を OZero に送信します。attestationVerificationMode=OZeroManaged、optional OZero TMP dialog package、内蔵 Managed Verification UI を使う場合、ユーザー向け検証フローのためのゲームコードは不要です。プリセット値: Low はオフ、Standard はオン(OZeroManaged)、Strict はオン(CustomerGameServer)です。新しく作成する Online 設定は Standard プリセットの値で始まり、フィールドの既定値自体はオフです。オンにすると、サーバーがビルドを判定し、インジェクション・フックを検出した場合は検証を拒否し、ゲームサーバー用の OZA トークンを発行し、実行中にも再確認します。オフでもポータルの端末・Variant のブロックは適用され、Build Integrity がオンなら署名済みのビルド・バージョンのブロックリストも起動時に適用されます。ただし、新しく設定したビルド・バージョンのブロックは次回の起動から適用されます。Pro でオフの場合、Check Setup に Info Pro server attestation is off が表示されますが、ビルドは止めません。オンにして既定の Built-In 確認 UI を使う場合は TMP dialog パッケージが必要で、Auto Setup がインポートします。
Security Config > Build Integrity > Pro - Online > Attestation Verification Mode (Pro)enumOZeroManaged最終検証を行う側を選びます。既定値と Low・Standard セキュリティプリセットは OZeroManaged で、SDK が OZero に検証を依頼します。Strict は CustomerGameServer です。ゲームサーバーが発行した情報でクライアントが RequestGameServerAttestation(...) を呼び、ゲームサーバーが OZA トークンを検証します。この値は checkIntegrityWithServer がオンのときだけ使われ、Standard・Strict プリセットはそれをオンに、Low プリセットはオフにします。ライセンスのティアが Pro でない場合、どのプリセットを適用しても OZeroManaged のままです。
Security Config > Build Integrity > Pro - Online > Attestation Network Policy (Pro)enumRequireOnlineRevalidation対応するポリシーは RequireOnlineRevalidation のみです。サーバー検証を完了または更新できない場合は OnlineRequired 状態となり、オンラインでの再検証が必要です。未検証のオフラインセッションを許可する選択肢はありません。
manifestSigningPublicKeystring""署名済み Build Integrity manifest を検証する Base64 RSA-2048 公開キーです。Window > OZero Security > Config & Dashboard の Generate Key Pair で生成してください。Online Services > Server Connection > Server Public Key Hex に入力するカスタマーポータルのサーバーキーとは別のキーです。
requireManifestSignatureboolfalse*Standard と Strict のプリセットでオンになります(Standard は SDK 1.2.0 から)。リリースのプレイヤービルドでは manifest 署名の検証が強制的にオンになるため、リリース前にキーペアを生成してください。
manifestSigningPrivateKeyPathstring""ビルド時に manifest 署名に使用する private key PEM のパスです。空のままにすると [ProjectRoot]/OZeroSigningKeys/manifest_private_key.pem を使用します。Editor 専用であり、プレイヤービルドには含まれません。ユーザーごとの値として UserSettings/OZeroSecuritySecrets.json に保存され、バージョン管理には含まれません。ビルドマシンでは環境変数 OZERO_MANIFEST_SIGNING_PRIVATE_KEY_PATH で指定できます。

プラットフォーム別の注意 (ポータルのブロック): Android ビルドは manifest hash を作成しないため、ビルドハッシュのブロックは適用されず、バージョンのブロックのみ適用されます。WebGL は署名済みブロックリストをローカルで検査しません。バージョンのブロックは SDK バージョンとアプリのバージョンを同じリストで比較し、プラットフォームを区別しないため、ブロックしたバージョンはすべてのプラットフォームに適用されます。

既定 UI で使う OZero サーバー attestation

コードなしのフローでは、Security Config > Build Integrity > Pro - Online > Check Integrity With Server をオンにし、Attestation Verification Mode を OZeroManaged に設定し、optional OZero TMP dialog package を import してから Security Config > Pro - License & Online Services > Online Verification UI > Ui Policy を内蔵ダイアログのままにします。SDK が nonce の取得、attest 証拠の送信、OZero 管理セッション判定の取得を行い、ネットワーク必須、再試行、timeout、警告、ブロック状態を既定ダイアログで表示します。既定 UI を置き換える場合、TextMeshPro を使わない場合、または独自 telemetry/session gate を追加する場合は RegisterUserManagedVerificationStateCallback を登録してください。

CustomerGameServer では、ゲームサーバーがサーバー API キーで POST /v1/validate を呼び出してトークンを確認します。全体の流れと例は API リファレンスのサーバー API キーでゲームサーバーと連携するを参照してください。

💡 Tip: ライブビルドをより強いポリシーで保護するには

Pro Strict Attestation は、顧客ポータルの Pro ポリシーで有効にできる強化モードです。このモードでは、OZero サーバーは OZA トークンをすぐには発行せず、まずポータルに登録された有効なビルドからのリクエストかを確認します。提出された nonce、manifest hash、platform、SDK version、アプリ識別情報が同じリクエストの流れに属するかもあわせて検査します。さらに debugger、platform、speedhack、injection の検査結果が正常で、assembly/file/IL2CPP hash のいずれかが検証されている必要があります。条件を満たさない場合は OZA トークンが発行されないため、新しいビルドを配布する前に、顧客ポータルへビルドバージョンと manifest hash を登録してください。

Events

Event Description
OnValidationPassed ローカルの整合性チェックが違反なく完了したときに発生します。Pro サーバーの検証(attestation)はまだ進行中である可能性があります。
OZeroOnlineAttestation.OnAttestationPassed Pro OZA 検証(attestation)トークンが実際に発行された後にのみ発生します。ゲームサーバーのログイン、PvP、ランキング、財貨の流れは、このイベントまたは AttestationToken.IsValid(nowMillis) で検査して通過した場合にのみ進行してください。
OnValidationFailed 整合性チェックが違反を検知したときに発生します。グローバルな onHackDetected イベントも ModulationType.BuildIntegrity と共にトリガーされます。

RSA 署名キーの生成(Build Integrity Manifest)

Build Integrity は、ビルド時に生成される manifest に RSA 署名を追加できます。この manifest には、ランタイムで検証する assembly hash とファイル整合性情報が含まれます。リリースビルドでは manifest 自体が差し替えられると検証基準を信頼できないため、配布前に Window > OZero Security > Config & Dashboard の Generate Key Pair で manifest 署名キーペアを生成してください。SDK 1.2.0 以降、集約ハッシュ(oz_ahash)にはすべてのプリセットでプレイヤーの起動ファイルが常に含まれます。Windows・macOS・Linux(Mono・IL2CPP)は RuntimeInitializeOnLoads.json、ScriptingAssemblies.json、globalgamemanagers、globalgamemanagers.assets、Android はネイティブライブラリと global-metadata.dat に加えて RuntimeInitializeOnLoads.json、ScriptingAssemblies.json です。デスクトップで Compression Method が LZ4/LZ4HC の場合、globalgamemanagers・シーン・アセットは data.unity3d 1 ファイルにまとめられ、そのときは個別ファイルの代わりにこのファイルが存在すれば常にハッシュされます。ファイルが大きくても、SHA-256 の計算は起動時に 1 GB あたり 1 秒前後です。

Manifest 署名が必要な理由

ビルド時に、OZero は 秘密キーで manifest に署名します。プレイヤービルドには秘密キーは含まれず、セキュリティ設定に保存された公開キーだけが含まれます。ランタイムでは、SDK がその公開キーで manifest の署名を確認します。署名が正しければ「ビルド時に作成された manifest がそのまま維持されている」と判断し、その manifest を基準に assembly/file hash 検査を行います。署名がない、または一致しない場合は manifest が差し替えられた、または編集された可能性があるため、Build Integrity 失敗として処理します。その後の動作は Response Settings に従い、ログ、コールバック、アプリ終了などになります。

Build Integrity Manifest Signing UI in the Unity Editor

キーペアを生成する

  1. Unity エディターで Window > OZero Security > Config & Dashboard を開きます。
  2. ページで Build Integrity セクションを展開します。
  3. Require Manifest Signature チェックボックスを有効化します。
  4. Generate Key Pair ボタンをクリックします。
  5. OZero が Build Integrity manifest signing 用のキーペアを生成します。公開キーはセキュリティ設定(Project Settings)に保存され、個人キー はデフォルトで次のパスに保存されます(このパス自体は User Settings にユーザーごとに保存されます):
    [ProjectRoot]/OZeroSigningKeys/manifest_private_key.pem
  6. 個人キーの位置を示す確認のダイアログボックスが表示されます。OK をクリックして閉じます。
重要 — 個人キーのセキュリティ
  • 個人キーファイルは Unity がビルドに含めないように Assets/ フォルダの 外部 に保存されます。絶対に Assets/ の中に移動しないでください。
  • OZeroSigningKeys/ はバージョン管理から除外してください。Git では .gitignore、SVN では svn:ignore に追加します。個人キーをリポジトリへコミットすることは重大なセキュリティリスクです。
  • 個人キーは安全な場所にバックアップしてください。このファイルを持つ人は、そのプロジェクトの有効な Build Integrity manifest を作成できます。
  • 個人キーを紛失した場合、既にリリース済みのビルドはそのまま動作します。ただし、次のアップデートビルドでは旧キーで新しい manifest に署名できません。新しいキーペアを生成し、integrity manifest を再生成して clean build で配布してください。公開キー、fingerprint、manifest、signature が一致していない場合、Build Integrity 検証に失敗することがあります。

ユーザー指定の個人キーのパス(CI/CD & チーム環境)

Manifest Signing Private Key Path は、Generate Key Pair が新しいキーを生成する場所を選ぶ設定ではありません。ビルドと検証ツールが読み込む PEM 秘密キーの場所を指定する設定です。Generate Key Pair はプロジェクトの既定パスにキーを作成し、そのパスを Config に記録します。CI/CD やチームビルドでは、同じ PEM を安全な場所に復元してから、このフィールドでそのパスを指定してください。

  • CI/CD パイプライン — PEM を CI Secret に保存し、Unity ビルドの直前に復元します。ビルドランナーが秘密キーを常にディスクへ保持する必要はありません。
  • チーム環境 — リリースビルド担当者やビルドランナーだけがアクセスできるセキュアなマウントパス、またはシークレットマネージャーを使用します。すべてのリリースビルドマシンは同じ PEM を使用する必要があります。

既存のキーペアの検証

ディスク上の秘密キーと セキュリティ設定に保存された公開キーが一致しているか確認するには、Validate Key Pair をクリックしてください。OZero は PEM から公開キーを再計算し、設定の公開キーと比較します。一致しない場合は、対応する秘密キーを復元するか新しいキーペアを生成し、その後 clean build を作成してください。

キーペアを再生成すべき場合
  • 個人キーを紛失または流出した場合。
  • Validate Key Pair で不一致を報告する場合(キーが同期されていない場合)。
  • 予定されたセキュリティポリシーの一環として意図的にキーを交換する場合。

再生成後も、既にリリース済みのビルドは自分のビルドに含まれるキーと manifest でそのまま動作します。次のアップデートビルドでは、新しい公開キー、fingerprint、manifest、signature が1つのセットとして一致している必要があります。integrity manifest を再生成し、clean build で配布してください。

デュアルフィンガープリントのキー回転

Generate Key Pair ボタンを押すと、公開キーがセキュリティ設定に保存され、同じキーを識別する fingerprint が Assets/OZeroSecurity/Scripts/Security/BuildIntegrity/OZeroManifestTrustAnchor.cs にも記録されます。ランタイムでは、まず 設定内の公開キーが信頼済み fingerprint と一致するか確認してから、署名済み manifest を受け入れます。

現在のキーと以前のキー

ExpectedPublicKeyFingerprintHex は現在のビルドで使うキーの fingerprint です。PreviousPublicKeyFingerprintHex はキー回転期間だけ使う補助スロットです。この機能は manifest の再生成を置き換えるものではなく、サーバー側のキー管理機能でもありません。セキュリティ設定の公開キー、fingerprint、manifest、signature は、同じキーを基準に1つのセットとして一致している必要があります。

安全なキー回転手順

  1. 現在の fingerprint をバックアップします。 Assets/OZeroSecurity/Scripts/Security/BuildIntegrity/OZeroManifestTrustAnchor.cs を開き、ExpectedPublicKeyFingerprintHex の値を一時メモにコピーします。
  2. 以前のキースロットに登録します。 同じファイルの PreviousPublicKeyFingerprintHex に1段階でコピーした値を貼り付けて保存します。
  3. 新しいキーペアを生成します。 Window > OZero Security > Config & Dashboard を開き、Build Integrity セクションで Generate Key Pair をクリックします。新しい公開キーと Expected fingerprint が自動的に更新されます。2番目の手順で入れた Previous の値は維持してください。
  4. integrity manifest を再生成し、clean build を作成します。 新しい manifest と signature は、新しい秘密キーを基準に生成される必要があります。
  5. アップデート移行期間を設けます。 既存リリースビルドは、自分のビルドに含まれるキーと manifest で引き続き動作します。Previous スロットは、新しいビルドの配布中にロールバックや成果物の混在が起きた場合の安全策です。ライブゲームでは通常 1〜4 週間程度を目安にします。
  6. 以前のキースロットを空にします。 古いビルドの使用量が十分に低くなった後、PreviousPublicKeyFingerprintHex = "" に戻し、もう一度リリースすると回転が完了します。
Previous スロットが行うこと

既にリリースされた旧ビルドは、新しいキーを知らなくても動作し続けます。旧ビルドには当時の公開キー、fingerprint、manifest、signature が一緒に含まれているためです。Previous スロットは、新しいリリースラインで管理されたキー回転期間だけ使う安全策です。移行期間が終わったら、後続リリースで空にしておくことを推奨します。

トラブルシュート

問題が起きたら、まず簡単な順序で確認してください。キーがない場合は Generate Key Pair を実行し、キーがある場合は Validate Key Pair を実行します。その後、integrity manifest を再生成して clean build を作成します。ほとんどの問題は、秘密キー PEM、セキュリティ設定の公開キー、OZeroManifestTrustAnchor の fingerprint、生成済みの manifest/signature ファイルのどれかが一致していないときに発生します。

症状 1 — リリースビルドが実行直後に終了する

ExpectedPublicKeyFingerprintHex が空である可能性があります。リリースビルドは fingerprint がない場合、安全のためすぐ失敗します。解決: Generate Key Pair を実行し、Unity の再コンパイルが終わったあと clean build を作成してください。値がすでに入っている場合は Validate Key Pair を実行し、ビルド出力フォルダーを空にしてから再ビルドしてください。

症状 2 — ビルドの開始直前に "no manifest signing public key is configured" でビルドが中断される

Project Settings > OZero Security > Build Integrity > Manifest Signing Public Key が空のときに発生します。解決: Window > OZero Security > Config & Dashboard を開き、Build Integrity セクションの Generate Key Pair をクリックしてから再度ビルドしてください。

症状 3 — ランタイムのログ: "Manifest signing public key does NOT match the pinned trust anchor fingerprint — APK appears to have been repacked with attacker-controlled keys"

セキュリティ設定の公開キーと OZeroManifestTrustAnchor に記録された fingerprint が一致しないときに発生します。キーペアの一部だけを復元した場合や、生成されたファイルを手動で編集した場合によく発生します。解決: Validate Key Pair を実行してください。不一致が報告された場合は、対応する PEM を復元するか新しいキーペアを生成し、integrity manifest を再生成して clean build を作成してください。配布済みビルドでのみこのメッセージが表示される場合は、APK または実行ファイルが再パッケージされていないかも確認してください。

症状 4 — キー回転後、新しいビルドで manifest 検証に失敗する

回転したキーセットの一部が古い値のままになっている可能性があります。公開キー、fingerprint、manifest、signature が同じキーを基準に一致しているか確認してください。解決: 移行期間が必要な場合だけ以前の fingerprint を PreviousPublicKeyFingerprintHex に維持し、Validate Key Pair 実行、integrity manifest 再生成、ビルド出力フォルダーの整理、clean build の順に再ビルドしてください。

症状 5 — ローカルのビルドは成功するが、CI のビルドが "private key not found" または誤ったキーで署名される

CI にはローカル PC の OZeroSigningKeys/manifest_private_key.pem が自動では存在しません。解決: PEM を CI Secret に保管し、Unity ビルドの直前に既定パス、または Manifest Signing Private Key Path に指定したパスへ復元してください。すべてのリリースランナーが同じ PEM を使用する必要があり、リリース環境でも一度 Validate Key Pair を実行して確認することを推奨します。

Install Source (Android Only) の設定

ゲームが承認されたストアまたは経路からインストールされた場合にのみ実行されるように制限します。サイドロードや再パッケージされた APK の防止に役立ちます。

フィールド Type デフォルト 説明
Activate Install Source bool true Install Source モジュールを有効化します。
allowGooglePlayStore bool true Google Play ストア経由のインストールを許可します。
allowSamsungGalaxyStore bool false Samsung Galaxy Store 経由のインストールを許可します。
allowAmazonAppstore bool false Amazon Appstore 経由のインストールを許可します。
allowHuaweiAppGallery bool false Huawei AppGallery 経由のインストールを許可します。
allowOneStore bool false ONE Store(韓国)経由のインストールを許可します。
allowXiaomiGetApps bool false Xiaomi GetApps 経由のインストールを許可します。
allowOppoAppMarket bool false OPPO App Market 経由のインストールを許可します。
allowVivoAppStore bool false Vivo App Store 経由のインストールを許可します。
allowADB bool false ADB(Android Debug Bridge)経由のインストールを許可します。内部テスト目的でのみ有効化してください。
allowDetectionFailedboolfalseAndroid の installer package 照会そのものが失敗した場合でも起動を許可します。ADB のように空の値が返る状況とは別で、JNI 呼び出しやプラットフォーム API が最後まで実行できなかった場合です。リリースビルドでは通常オフにします。
allowUnknownSourcesboolfalse標準ストア一覧にも customAuthorizedPackages にもない installer package を許可します。地域ストア配布が必要な場合だけ、実機で確認してから使ってください。
Security Config > Install Source (Android Only) > Pro - Online > Check Installer With Server (Pro)boolfalsePro 専用です。ローカル検出後に /v1/install-source/verify へ installer package を送り、サーバー側 allowlist と監査ログを適用します。サーバーにまだルールがない場合は opt-in 動作として許可されます。
customAuthorizedPackages List<string> — 追加で許可するインストーラーのパッケージ名(例: com.yourcompany.launcher)。
reportViolationToCallback bool true 許可されていないインストール元が検知された場合、サーバーにレポートを送信します。
logRawInstallerPackage bool true 検出された元の installer package name をログに出します。カスタムストアのパッケージ名を探す QA 段階では便利ですが、リリースログに出してよい情報か確認してから残してください。

Steam Anti-Piracy (PC Only) の設定

Steam に配布される PC ビルドで Steam の実行の経路、App ID、権限の状態、リリースの設定を確認します。Standard はローカルの検証であり、Steam サーバーを通じたより強い所有権の検証は Pro のサーバー Steam Attestation で提供します。

必ず入力するもの(3 つ): Activate、Expected Steam App Id(0 のままだとデスクトップビルドが失敗します)、SDK Folder(Steamworks SDK フォルダー。ビルドサーバーでは環境変数 OZERO_STEAMWORKS_SDK)。
任意: Required DLC App Ids は、特定の DLC がないとゲームを遊べない場合にだけ入力します。
上級(ほとんどの場合は空のまま): Validate Steam Api Dll Hash と Expected Steam Api Dll Sha256 Hashes はすべてのプリセットでオフで、オフの間はハッシュ一覧は使われません。ハッシュを入力しなくても、ビルド時にコピーされた steam_api のハッシュが署名付きのビルド整合性情報に自動で含まれるため Build Integrity が差し替えを検出し、Require Valve Signed Steam Api(Standard・Strict プリセットでオン)が Windows・macOS で Valve の署名を確認します。その他の項目はプリセットの値のままで構いません。Security Config のこのセクション上部の案内ボックスにも同じ内容が表示され、項目にマウスを合わせると、値を変えたときに何が起きるかを確認できます。

Steamworks SDK フォルダーとライブラリの自動コピー

Project Settings > OZero Security > Steam Anti-Piracy (PC Only) > SDK Folder(または Check Setup の Steam 設定欄)で Steamworks SDK フォルダー(sdk フォルダーまたはその親フォルダー)を選んでください。ビルド時に OZero が対象プラットフォーム用の Steam API ライブラリをビルド出力へ自動でコピーするため、手動でコピーする必要はありません。

プラットフォーム SDK フォルダー内のファイル コピー先
Windows x64redistributable_bin/win64/steam_api64.dllsteam_api64.dll (実行ファイルの隣), <Game>_Data/Plugins/x86_64/
Windows x86redistributable_bin/steam_api.dllsteam_api.dll (実行ファイルの隣), <Game>_Data/Plugins/x86/
Linux x64redistributable_bin/linux64/libsteam_api.solibsteam_api.so (実行ファイルの隣), <Game>_Data/Plugins/x86_64/
macOSredistributable_bin/osx/libsteam_api.dylib<Game>.app/Contents/MacOS/libsteam_api.dylib

ビルド開始前に OZero がライブラリのファイル形式・アーキテクチャと対応する Steamworks バージョン(SteamApps v008–v009, SteamUtils v009–v010, SteamUser v022–v023)を検査し、一致しない場合はビルドが止まります。コピーは整合性 manifest の作成前に行われるため、Steam ライブラリも整合性検査の対象になります。macOS ビルドに署名するとき、libsteam_api.dylib の Valve 署名はそのまま保持されます(macOS の署名)。

他の PC と CI: 選んだフォルダーはその PC の Editor 設定にだけ保存され、プロジェクトファイルには残りません。他の PC や CI では、フォルダーを選び直すか、環境変数 OZERO_STEAMWORKS_SDK に SDK フォルダーのパスを設定してください。どちらもない場合、ビルドは案内メッセージとともに失敗します。

デスクトップ専用: Steam Anti-Piracy は Windows、macOS、Linux のプレイヤーでのみ動作します。オンのまま Android、iOS、WebGL をビルドしても、ビルドは警告を残して続行され、そのアプリでは Steam 検査が実行されず、Steam ライブラリも含まれません。このとき Check Setup には Info 項目 Steam Anti-Piracy is skipped for this build target が表示されます。

Steamworks.NET などのラッパーと併用する場合: ラッパープラグインがビルド出力に入れた steam_api ライブラリが選択した SDK のものと異なる場合、OZero は SDK のライブラリに置き換え、ビルドログに警告を残します。ラッパーのビルドに使われたのと同じ Steamworks SDK バージョンを SDK Folder に指定してください。

フィールド Type デフォルト 説明
Activate Steam Anti-PiracycheckboxOffSteam Anti-Piracy の活性化のチェックボックスです。Steam App ID と配布の方式がプロジェクトごとに異なるためデフォルト値は Off です。まず観察/QA モードで状態を確認した後、リリースビルドのポリシーを強化してください。
expectedSteamAppIdint0プロジェクトの Steam App ID です。開発の確認用 AppID 480 を使用した場合、リリースの前に必ず実際の App ID に変えてください。
requireSteamLaunchbooltrueゲームが実行ファイルの直接実行ではなく Steam を通じて開始されたか確認します。開発中の直接実行のテストとリリースポリシーを区分してください。直接起動されて Steam に再起動を要求した場合、このインスタンスは静かに終了し、Steam が起動したインスタンスが実行を引き継ぎます。
requireSteamApiInitbooltrueSteam API の初期化の成功可否を確認します。ローカルの開発の実行では Steamworks の設定によって失敗することがあるため、最終的な判定は実際の Steam 配布の経路で確認してください。
requireSubscribedCurrentAppbooltrue現在の Steam アカウントがアプリを所有するか使用の権限を持っているか確認します。この項目はローカルの検証であり、サーバー側の所有権の検証は Pro で実行します。
requiredDlcAppIdsList<int>—必須 DLC の Steam App ID のリストです(最大 10 個。超えるとビルドが失敗します)。リストの DLC を 1 つでも所有していないアカウントは、本編未購入と同じレベルの認証失敗(required_dlc_missing)として扱います。インストールの有無ではなく所有(Steam BIsSubscribedApp)が基準です。Steamworks パートナー(開発元)アカウントは自社 DLC を所有していると報告される場合があるため、未所有のテストは DLC を持たない一般アカウントで行ってください。コンテンツを解放する任意 DLC はこのリストに入れず、QueryDlcOwnership で確認してください。
blockSteamAppIdTxtInReleasebooltruesteam_appid.txt は、Steam を使わずにローカル起動テストを行うための開発用ファイルです。リリースビルドに残っていると Steam 経由でない起動を許してしまう可能性があるため、OZero は違反として扱います。配布前にプロジェクトルートとビルド出力物から削除してください。
validateSteamApiDllHashboolfalse任意・上級。既定はオフ(すべてのプリセット)。 オンにすると Steam API ファイルのハッシュを expectedSteamApiDllSha256Hashes の一覧と比較し、一覧にあるファイルだけを許可します。一覧が空だとビルドが失敗し、Steamworks SDK を更新するたびに一覧も更新する必要があります。ほとんどのゲームはオフのままで構いません。
allowFamilySharing / allowFreeWeekend / allowTimedTrialbooltrueSteam の家族の共有、無料の週末、時間制限の体験の権限の状態を許可するか制御します。 注意: 現在の SDK リリースビルドでは、このポリシー検査は適用されません。値を設定したままでもエラーにはなりません。
requireSteamBuildIdNonZeroboolfalseSteam が Build ID を 0 として返す、または Build ID を取得できない場合に違反として扱います。Steam depot/build の配布フローで Build ID が正しく取得できることを確認してから有効にしてください。
expectedSteamApiDllSha256HashesList<string>—任意・上級。 validateSteamApiDllHash がオンのときだけ使う Steam API ファイルの許可 SHA-256 一覧で、オフ(既定値)の間は使われません。オンにした場合は、配布する Steamworks SDK のバージョンとプラットフォームごとのハッシュを入力し、SDK を更新するたびに一覧も更新してください。
requireValveSignedSteamApibooltrueSteam API の再配布ファイルが Valve のプラットフォーム上の身元と一致するか確認します。Windows はコード署名者、macOS は Valve Team ID を確認します。Linux など署名を確認できないプラットフォームでは警告を記録して通過しますが、その場合もビルド整合性情報に含まれる steam_api のハッシュで Build Integrity が差し替えを検出します。SHA-256 一覧でさらに固定する場合は、上級項目の validateSteamApiDllHash を使えます。
detectKnownSteamEmulatorsbooltrue実行ファイルの周辺で、Goldberg、CreamAPI、SmartSteamEmu、ColdClientLoader などの Steam エミュレーターが残しやすいファイルやフォルダーを探します。見つかった場合は、通常の Steam 起動ではない可能性があるものとして扱います。
requireSteamEnvironmentConsistencybooltrueリリースビルドで、Steam が有効な個人 SteamID と 0 以外の Build ID を返しているか確認します。Steam クライアント/ライブラリパスの事前確認は警告ログに残し、SteamID または Build ID が不正な場合は違反として扱います。
observeSteamAuthTicketHeuristicbooltrueローカル Steam 認証チケットのサイズと基本的な形式だけを参考信号として確認します。チケットの内容はログに残さず、この検査だけでゲームをブロックすることもありません。
detectionActionOZeroPCStoreDetectionActionCallbackSteam 検証に失敗したとき、SDK がローカルでどこまで処理するかを決めます。Observe はログと診断だけを残し、Callback はゲーム側コールバックを呼び出し、Block は違反をブロックポリシーとして扱います。実際にアプリを終了するかは Global Threat Response 設定に従います。
reportViolationToCallbackbooltrueCallback モードで Steam 検証に失敗したとき、通常の OZero セキュリティコールバックへ渡すかを決めます。ログだけ確認し、ゲーム側コールバックを止めたい QA ビルドでのみ無効にしてください。
forceSteamAntiPiracyObserveOnlyboolfalseSteam 検証失敗を一時的にログと診断記録だけに留める観察モードで扱います。特殊な Steam 起動環境をテストするときだけ使用し、リリース前には必ず無効にしてください。
Security Config > Steam Anti-Piracy (PC Only) > Pro - Online > Check Steam DRM With Server (Pro)boolfalsePro 専用です。サーバー根拠を使った Steam DRM 検証を有効にします。ローカル Steamworks 状態だけでなく、Steam 所有権をサーバー側の証拠で確認したい場合に使用します。
Security Config > Steam Anti-Piracy (PC Only) > Pro - Online > Steam Drm Verification Mode (Pro)OZeroPCStoreDrmVerificationModeOZero ManagedSteam DRM 検証の担当を選択します。OZeroManaged では SDK が OZero /v1/steam/attest を直接呼び出し、activation cache を管理し、optional OZero TMP dialog package を import した後にユーザー向け状態を既定の Managed Verification UI に渡します。CustomerGameServer は、自社サーバーが OZA token と Steam ticket を受け取り、OZero server API を呼び出す構成です。
Security Config > Steam Anti-Piracy (PC Only) > Pro - Online > Steam Drm Network Policy (Pro)OZeroPCStoreDrmNetworkPolicyRequireOnlineRevalidation最新のサーバー再検証が必要な時点でネットワークまたはサーバーを利用できない場合は、オンライン必須状態として処理します。OZeroManaged と import 済みの内蔵 UI package を使う場合、再試行フローを自動表示します。
Standard Steam Anti-Piracy のリリースビルドでは、Unity が対応する対象で IL2CPP を使用し、Build Integrity を Standard または Strict プリセットで有効にしてください。manifest trust-anchor fingerprint が固定されていることを確認し、Steamworks SDK ファイルを差し替えるたびに Tools > OZero Security > Setup > PC Store > Scan Redistributable を再実行してください。unsupported accessor、標準外の library path、verification-unavailable などの compatibility 診断は、単独の不正コピー証拠ではなく、まず QA シグナルとして扱います。

Steam 保護の執行レベル

Steam の違反がゲーム終了につながるのは、Detection Action が Callback または Block で、Response > Force Quit On Detection がオンのときです。この執行レベルはビルド時に boot メタデータへ封印され、終了はネイティブコードが直接実行します。ビルド出力の封印値がセキュリティ設定と異なる場合はビルドの preflight が失敗するため、再ビルドしてください。

Observe・Off の場合、Force Quit On Detection がオフの場合、forceSteamAntiPiracyObserveOnly がオンの場合、requireSteamApiInit がオフの場合、または Low プリセットの場合、違反は記録のみでゲームは終了しません。このような構成も許可されますが、Check Setup の Steam enforcement 項目に警告が表示され、ビルド時にもコンソールへ警告が出ます。終了が起きる構成では、同じ項目に「terminates on detection」と表示されます。

オンラインアドオンで Check Steam DRM With Server によりサーバーが Steam の所有を判定する構成では、ネイティブの終了ではなくサーバー判定の流れに従い、ローカルの Steam 違反は観察として記録されます。

Steam Activation / DRM が OZeroManaged を使う場合、保護対象の初回起動は OZero サーバー経由で有効な activation token をオンライン取得します。その後は、有効な cache token とオフライン猶予が残っていればオフライン実行を許可できます。トークン期限切れ、猶予終了、または再検証が必要な時点でユーザーがオフラインの場合、OZeroSecurity_BuiltInDialog_TMP.unitypackage を import した既定の Managed Verification UI がオンライン必須通知、Retry ボタン、retry timeout、ブロック状態を自動処理します。

OZero サーバー管理の Steam DRM

Security Config > Steam Anti-Piracy (PC Only) > Pro - Online > Check Steam DRM With Server をオンにし、Steam Drm Verification Mode を OZeroManaged に設定し、OZeroSecurity_BuiltInDialog_TMP.unitypackage を import してから Security Config > Pro - License & Online Services > Online Verification UI > Ui Policy は内蔵ダイアログのままにします。SDK が Steam auth ticket を OZero サーバーへ送信し、activation token cache を管理し、オンライン必須、再試行、timeout、警告、ブロック状態を既定 UI で表示します。内蔵 UI をそのまま使う場合、callback や retry コードは不要です。Pro アクティベーション自体が拒否された場合(例: Product Name が未登録)、Steam のメッセージに Pro activation was not granted … Cause: <アクティベーションのエラーコード> と原因が表示されます。まずそのアクティベーションエラーを解決してください(ライセンス問題の解決を参照)。

顧客ゲームサーバーでの Steam 検証

Security Config > Steam Anti-Piracy (PC Only) > Pro - Online > Check Steam DRM With Server をオンにし、Steam Drm Verification Mode を CustomerGameServer に設定します。自社サーバーが audience、256-bit hex challenge、session ID を発行し、ローカル検証後にクライアントが RequestGameServerAttestation(...) を呼び出して callback の OZA token、同じ binding 値、Steam Auth Ticket を送信します。サーバーは /v1/validate と /v1/steam/attest を呼び出し、両方の server API key はサーバー側だけに保管します。

デバイスバインディング設定

最初に信頼した端末の識別情報を保存し、以降の起動時に同じ端末かどうかを比較します。同じアカウントや保護されたセーブデータが別の端末へ移されたかを確認するために使います。

運用での使い方

Pro では Device Binding を運用ツールとして使えます。サーバーがライセンスごとの端末フィンガープリントを記録するため、繰り返しリスクが出る端末をブロックし、安易なライセンス共有を減らし、正当な端末変更はライセンス全体を止めずにサポートできます。

繰り返しリスクが出る端末をブロック

SpeedHack、Injection、Install Source、Build Integrity などのセキュリティイベントを確認した後に使用してください。ブロックされた端末は、次回の有効化、端末登録、端末検証、ポリシー確認で DEVICE_BLOCKED を受け取ります。

正当な端末変更をサポート

実際のプレイヤーが端末を買い替えた、OS を再インストールした、ハードウェアを交換した、または通常の環境変化で端末情報が変わった場合に Reset Token を使います。トークンは 5 分間のみ有効で 1 回だけ使用でき、正確なライセンスと端末に紐づきます。

ゲームからバインディングを解除する

プレイヤーが正当に端末を変更した場合、ゲームから RequestReset で保存済みの指紋を消去できます。プレイヤービルドでは OZeroDeviceBindingDetector.SetResetAuthorizer で登録した認可コールバックに問い合わせ、コールバックが true を返したときだけ解除します。解除後は同じセッションで現在の端末をすぐに再登録するため、再起動は不要です。

using OZeroSDK.Security;

// Register once at startup.
OZeroDeviceBindingDetector.SetResetAuthorizer(request =>
{
    // Approve only after your own check succeeds, for example a recent
    // account re-authentication or a support code your server verified.
    return MyAccountService.HasVerifiedResetFor(request.Reason);
});

// Later, from your account recovery or support screen:
bool cleared = OZeroDeviceBindingDetector.Instance?.RequestReset("ticket-1234") ?? false;
すべての要求を承認しないでください。常に true を返すコールバックは、プロセス内の任意のコード(注入されたコードを含む)にバインディングの消去を許してしまいます。アカウントの再認証やサーバーが確認したサポートコードなど、実際の確認を経た後にだけ true を返してください。Demo_DeviceBinding と Demo_OZeroSecurity のサンプルは、デモのためにすべての要求を承認します。そのコールバックをゲームにそのまま移さないでください。

プレイヤービルドでは、認可コールバックも有効なサーバー Reset Token もない場合、解除を拒否してエラーログを残します。エディターでは常に解除されます。RequestReset と認可コールバックは呼び出したスレッドで同期的に実行されます。ClearStoredFingerprint(token) も引き続き動作します。Pro ライセンスとサーバー設定(サーバー URL、ライセンスキー)がある場合、空でないトークンはバックグラウンドでサーバー Reset Token として検証されるため、解除は呼び出しが戻った後に行われます。結果が必要な場合は、メインスレッドで ClearStoredFingerprintAsync(token) を await してください(下の手順)。それ以外の場合は認可コールバックが判断し、トークンは request.AuthorizationToken で渡されます。

Standard ゲームのサポート対応ガイド

Standard には OZero サーバーがないため、ポータルの Reset Token は使えません。代わりに、ゲームのサポート確認手順を認可コールバック(SetResetAuthorizer)に直接つないでください。次のいずれかの方法を選び、どの方法でも上の警告のとおり、確認が通った後にだけコールバックで true を返してください。

A. ゲーム独自のサーバー(アカウントシステム)がある場合 — 推奨

  1. サポート担当がバックオフィスでプレイヤーのアカウントに 1 回限りのサポートコードを発行します。
  2. プレイヤーがゲーム画面でコードを入力します。
  3. ゲームが自社サーバーでコードを先に非同期で検証します。
  4. 通過したらゲームが RequestReset を呼び、コールバックは直前の検証が通ったかどうかだけを確認します。

プレイヤーの再ログイン(プラットフォームの再認証)で解除を許可する方法も同じ構造です。認可コールバックは同期的に実行されるため、非同期の検証を先に終えてから RequestReset を呼んでください。

bool _supportCodeVerified;

void Start()
{
    // The authorizer runs synchronously: it only reports whether the check just passed.
    OZeroDeviceBindingDetector.SetResetAuthorizer(_ => _supportCodeVerified);
}

async void OnSubmitSupportCode(string code)
{
    // Verify the one-time code issued by your support team on your own backend.
    _supportCodeVerified = await MyBackend.VerifyResetCodeAsync(accountId, code);
    try
    {
        bool cleared = OZeroDeviceBindingDetector.Instance.RequestReset("cs-support");
        ShowResetResult(cleared);
    }
    finally
    {
        _supportCodeVerified = false;
    }
}

B. サーバーのないオフラインゲーム — 署名コード方式

  1. ゲームが要求コードを表示します。例えば、1 回限りの乱数とゲーム独自のセーブ・プレイヤー ID を短くエンコードした値です。
  2. サポート担当が、開発元だけが持つ秘密鍵で署名した応答コードを返します。
  3. ゲームは組み込みの公開鍵で応答を検証し、署名が有効なときだけコールバックが解除を許可します。同じ応答を再利用できないよう、使った乱数は破棄してください。
ゲームに秘密値を埋め込む HMAC 方式は、ビルドから秘密値を抽出されるおそれがあるため推奨しません。Ed25519 や ECDSA などの公開鍵署名を使ってください。署名ツールと鍵の管理は開発元の責任です。要求コードに GetCurrentFingerprintHash() を含めないでください。デバッグ用のヘルパーなので、リリースコードで表示したり送信したりしないでください。
// Pseudocode. Game: build a request code that the player sends to support.
nonce        = RandomBytes(8)          // keep until the reset is done, then discard
requestCode  = ShortEncode(nonce + yourSaveOrPlayerId)

// Support tool on your side. The private key never ships with the game.
responseCode = Sign(studioPrivateKey, requestCode)          // Ed25519 or ECDSA

// Game: verify with the public key built into the game, then reset.
OZeroDeviceBindingDetector.SetResetAuthorizer(_ => _signedCodeVerified)
_signedCodeVerified = Verify(embeddedPublicKey, requestCode, responseCode)
OZeroDeviceBindingDetector.Instance.RequestReset("cs-offline")
_signedCodeVerified = false
Discard(nonce)

C. アプリデータの削除または再インストール

バインディングの記録はアプリのローカルストレージ(PlayerPrefs)にあります。プレイヤーがアプリデータを削除するかアプリを再インストールすると、次回起動時に新しい端末として登録されます。ローカルのセーブも消える可能性があるため、サーバーやクラウドのセーブがあるゲームでのみサポートの回答として使ってください。

D. 問い合わせを減らす

hardwareChangeTolerance を 1 以上にすると(Standard プリセットは 1、Strict は 0)、OS のアップデートやプライバシー設定の変更で識別値が 1 つ変わってもブロックせず、端末を再登録します。

Pro: ポータルの Reset Token と ClearStoredFingerprintAsync(token) を使ってください。下の Reset Token サポート手順 を参照してください。

Reset Token サポート手順(Pro)

  1. 端末リセットが必要な理由とプレイヤーアカウントを、通常のサポート手順で先に確認します。
  2. Customer Portal → Device Binding で対象端末を選び、Reset Token を発行します。
  3. トークンは認証済みのサポートチャネルでのみ渡してください。公開チャット、スクリーンショット、長く残るチケットに残さないでください。
  4. ゲームやサポート UI は、メインスレッドで await OZeroDeviceBindingDetector.Instance.ClearStoredFingerprintAsync(token.Trim()) にトークンを渡し、戻り値の bool を確認してください。ClearStoredFingerprint(token.Trim()) も動作しますが、サーバー検査がバックグラウンドで行われるため、解除は呼び出しが戻った後に行われます。
  5. SDK がトークンを受け入れると、同じセッションで現在の端末をすぐに再登録します。再起動は不要です。
Device Binding を、実在ユーザーを 100% 証明する機能や永続的なハードウェア身元保証として説明しないでください。OS 初期化、プライバシー設定変更、ハードウェア交換後にプラットフォーム識別子が変わる場合があります。ライブゲームでは、共有や悪用のコストを上げる運用レイヤーとして説明し、Build Integrity、Injection、SpeedHack、Install Source、サーバー検証と一緒に使ってください。
フィールド Type デフォルト 説明
Activate Device Binding bool true Device Binding 検査を有効にします。有効にすると、SDK は起動時にローカル端末フィンガープリントを作成し、保存済みの値と比較します。 保存された指紋の項目があるのに復号できない場合(改ざん)は、Device Binding 違反(StorageTampered)として扱います。アプリデータを消去した場合のように項目がなければ、新たに登録します。
hardwareChangeTolerance int (0–3) 1 端末フィンガープリントを構成する項目がいくつ変わっても同じ端末とみなすかを決めます。0 は厳格、3 は大きなハードウェア/OS 変更にも広く対応します。既定値 1 は小さな OS またはファームウェア変更を吸収するための値です。
storageKey string "ozero_dfp" SDK が暗号化されたローカル端末フィンガープリントを保存するときに使う PlayerPrefs キーです。ゲーム側で同じキーをすでに使っている場合だけ変更してください。
Security Config > Device Binding > Pro - Online > Verify Device With Server (Pro) bool false Pro 専用です。初回使用時に /v1/device/register で端末フィンガープリントを登録し、以降の起動では /v1/device/verify でサーバー記録と比較します。ネットワークやサーバー障害だけではゲームを止めませんが、サーバーが DEVICE_BLOCKED、FINGERPRINT_MISMATCH のような明確な拒否を返した場合は Device Binding 違反として扱います。

Speed & Time Hack 設定

Unity 時刻、ネイティブ基準時計、バックグラウンドタイマー、Web/Pro サーバー時刻を比較し、ゲーム速度を速く/遅くする操作や端末時計の変更を検出します。WebGL ではネイティブの時計比較を使えません。起動ログにその旨が表示され、ブラウザーの時計改ざん(Date.now / performance.now)は Injection & Hooking の WebGL ランタイム検査が代わりに検出します。

フィールド Type デフォルト 説明
Activate Speed & Time Hack bool true Speed & Time Hack 検査を有効にします。有効にすると、SDK は実行中の時刻進行比率と端末時計の変更を監視します。
autoStart bool true ゲーム実行時に自動的に検出を開始します。無効にする場合は、OZeroSpeedHackDetector.StartDetection() で手動で開始する必要があります。
checkInterval float 1.0 s Unity 時刻と基準タイマーを比較する周期です。短くすると反応は速くなりますが、CPU 負荷と誤検知の可能性が上がります。
requiredDetections int 3 違反として扱う前に、異常シグナルが連続で何回必要かを決めます。不安定な端末で誤検知を減らしたい場合は値を上げてください。
ratioTolerance float 0.15 Unity 時刻とネイティブ基準時刻の差を、この比率までは正常として扱います。まず既定値で始め、実プレイで誤検知が出る場合だけ調整してください。
maxAllowedRatio float 4.0 時刻進行比率がこの値を超えると、強いスピードハックシグナルとして扱います。通常のゲームでは既定値を維持してください。
detectSlowHack bool false 時間を速くする操作だけでなく、遅くする操作も検出します。既定値は false です。スローモーション、カットシーン、意図した速度変更を実際に確認してから有効にしてください。
enableTimeScaleDetection bool true Time.timeScale が未承認のコードやメモリ編集で変更されたかを確認します。意図的な速度変更には OZeroTime.timeScale を使ってください。
hackDetectMultiplier float 1.3 時刻進行が maxAllowedRatio より大きく跳ねたとき、より強い疑いシグナルとして数える基準です。通常は既定値を維持してください。
enableThreadTimerCheck bool true バックグラウンドスレッドタイマーを追加の基準時計として使います。メインスレッドだけを操作するツールの検出に役立ちます。
useWebTimeValidation bool true HTTPS 時刻応答の Date ヘッダーまたは Pro サーバー時刻で端末時計の操作をクロスチェックします。既定値は true です。
webSyncInterval float 15 s 時刻の異常を監視している間に Web/サーバー時刻と再比較する周期です。短くしすぎるとネットワーク要求が増えます。
webSyncIdleInterval float 60 s 最近時刻の異常がないときの Web 時刻比較周期です。ローカルの時刻異常や Web 時刻確認の失敗の後 5 分間は webSyncInterval を使います。0 なら常に webSyncInterval を使います。Strict プリセットは 15 秒です。
webRatioTolerance float 0.15 端末時刻と Web/サーバー時刻の差を、この比率までは正常として扱います。地域ごとのネットワーク遅延を考慮して実機で確認してください。
timeOffsetTolerance float 60 s 実行中にデバイスの時計がこの秒数を超えて巻き戻されるか、Web/サーバー時刻とのずれが最初の測定からこの分だけ変化すると、時間操作とみなします。起動時点ですでにずれていたデバイスの時計は操作とみなしません。判定の基準は実行中のプロセス単位のため、時計を変更するとアプリが再起動されるモバイル(例: iOS の設定アプリ)や -batchmode のヘッドレスプレイヤーでは、ローカルの巻き戻し判定は動作しません。時間に基づく報酬はサーバー時刻(OZeroTime 署名時刻)を基準に処理してください。
focusIgnoreTime float 4 s アプリがフォーカスを取り戻した直後に無視する時間(秒)。OS がアプリを一時停止したときに発生する誤検知を防ぎます。
loadingGraceTime float 6 s アプリ起動やシーン読み込みの直後、この時間は検出結果を無視します。重いロード区間での誤検知を減らします。
lagSpikeIgnore float 0.5 s フレーム時間がこの値を超えたサンプルは遅延として破棄します。実際のラグを時刻操作と誤認しないための設定です。
buildFailIfTimeScaleTamperedbooltrue保護対象コードが承認済みポリシー外で Time.timeScale を直接変更しているように見える場合、ビルド/検証段階で失敗させます。
timeScaleTamperExemptionsList<string>—Time.timeScale を直接変更してよいスクリプト/メソッド名パターンです。一時停止、バレットタイム、カットシーンなど、確認済みのコードだけを最小限登録してください。
webTimeUrlsstring[]—Web/サーバー時刻確認に使う HTTPS アドレス一覧です。1 つのアドレスが遮断されても検査が止まらないよう、自分で管理する、または信頼できるアドレスを 2 つ以上入れることを推奨します。 Standard と Strict のプリセットは、サードパーティのホスト https://www.apple.com/ と https://www.bing.com/ を設定します(OZero のサーバーではありません)。
minSuccessfulEndpointsint21 回の検査で、最低いくつのアドレスが有効な Date ヘッダーを返せば時刻を信頼するかを決めます。登録したアドレス数より大きい値にしないでください。
maxConsecutiveFailuresint6Web/サーバー時刻確認がこの回数だけ連続で失敗すると、onWebTimeUnavailable ポリシーを実行します。一時的なネットワーク障害をすぐ違反にしないための余裕値です。
onWebTimeUnavailableWebTimeUnavailablePolicyWarnOnlyWeb/サーバー時刻を何度も確認できない場合の処理を決めます。WarnOnly は警告だけ残して継続します。Strict は繰り返し失敗を疑わしい状況として扱い、SpeedHack コールバックを発生させます。Silent はログも残さないため、特殊テスト以外では使わないでください。
webSyncJitterPercentfloat20%Web/サーバー時刻確認がすべての端末で同時に重ならないよう、設定した周期の前後に呼び出し時刻を少し分散します。例: 20% なら 15 秒周期はおよそ 12〜18 秒の間で実行されます。
sustainedLagThresholdfloat0.15直近フレーム平均がこの値より遅い場合、SDK はまず実際のラグとして扱い、その間の時刻検査結果をすぐ違反確定にはしません。既定の 0.15 秒は平均約 6〜7 FPS です。
sustainedLagGraceDurationfloat3 sラグと判断した後、厳密な時刻判定を一時的に保留する時間です。ラグが続く間はこの保留時間が延長され、ランタイムでは最大 10 秒までに制限されます。
overloadStrictMultiplierint3onWebTimeUnavailable が Strict のとき、失敗が明確なサーバー拒否ではなく単なるタイムアウトに見える場合、何回分多く待つかを決める倍率です。既定の 3 は maxConsecutiveFailures の 3 倍まで待ってからコールバックを発生させるという意味です。
Security Config > Speed & Time Hack > Pro - Online > Enable Remote Speed Hack Config (Pro)booltruePro サーバーから Speed & Time Hack の設定を取得します。新規設定の既定値は true で、セキュリティプリセットはライセンスのティアが Pro のときだけ有効にし、Standard では無効にします。ポータルで値を指定した項目だけがローカル値を上書きし、しきい値だけでなく detectSlowHack・enableTimeScaleDetection・enableThreadTimerCheck・enableSignedServerTime などの検知オン/オフも含まれます。ポータルで空のままの項目はローカル値を維持します。無効にした場合やサーバーに接続できない場合はローカル設定のみ使います。
remoteSpeedHackConfigIntervalfloat300 sPro サーバーから Speed & Time Hack のリモート設定を再取得する周期です。0 はアプリ起動時に 1 回だけ取得し、正の値では定期的に新しいポリシーを確認します。
remoteSpeedHackConfigJitterPercentfloat20%Pro リモート設定を多くの端末が同時に要求しないよう、設定更新の時刻を少し分散します。
Security Config > Speed & Time Hack > Pro - Online > Enable Signed Server Time (Pro)boolfalsePro アクティベーションが使えるとき、署名付き /v1/time 応答を優先信頼時刻として使います。サーバーキーと時刻エンドポイントを設定し、テストしてから有効にしてください。
Web 時刻検証: Speed & Time Hack の Web 時刻検証(useWebTimeValidation)をオンにすると、SDK は webTimeUrls のアドレスに HTTPS HEAD リクエストを送り、時刻比較のために Date ヘッダーだけを読みます。Standard と Strict のプリセットは、サードパーティのホスト https://www.apple.com/ と https://www.bing.com/ を設定します。これらは OZero のサーバーではなく、OZero はリクエストに個人データを含めません。ゲームが他のホストに接続してはならない場合は、自社で運用するアドレスに置き換えるか、Web 時刻検証をオフにしてください。

Time.timeScale ではなく OZeroTime.timeScale を使用する

Speed & Time Hack 保護モジュールが有効な状態では、プロジェクトコードから Unity 標準の Time.timeScale を直接変更しないでください。OZero を経由せず直接変更すると、OZero detector は外部チートツールによる疑わしいランタイム時間操作として扱い、設定された応答ポリシーを実行する可能性があります。

例外ポリシー (TimeScaleTamperExemptions)

OZeroSecurityConfig.TimeScaleTamperExemptions は、直接 Time.timeScale へアクセスする必要があるスクリプトを登録する例外リストです。このリストは最小限にしてください。

構造上、直接 Time.timeScale にアクセスせざるを得ない検証済みの外部プラグインや legacy adapter script にのみ限定して割り当ててください。

それ以外のすべてのゲームロジックでは、例外なく OZeroTime.timeScale を優先してください。一時停止、スローモーション、カットシーン速度制御、倍速再生など、ゲーム内で意図的に速度を変更する場合は必ず OZeroTime.timeScale を使用してください。

using OZeroSDK.Security;

// Correct: the detector knows this is an intentional game-side change.
OZeroTime.timeScale = 0.5f;

// Avoid: this bypasses OZero's expected time-scale tracking.
Time.timeScale = 0.5f;
リリース前に Tools > OZero Security > Diagnostics > Check Time.timeScale Usage を実行し、可能なすべての直接変更コードを OZeroTime.timeScale に置き換えてください。

長時間ロード中の意図しない Watchdog 終了を防ぐ

OZero のネイティブ Watchdog は、Unity のメインスレッドが動き続けているかを定期的な heartbeat で確認します。リリースビルドの heartbeat 期限はすべてのプラットフォームで約 10 秒です(起動時の猶予の後)。期限を超えると Watchdog はまずメインスレッドが何をしているかを見ます。スレッドがブロックされ CPU を使っていない状態(長い同期ロード、ログのフラッシュ、ディスク I/O、仮想マシンによる一時停止)はストールとして記録のみ行い、ゲームが動き続けているのに heartbeat だけが来ない場合は改ざんとみなして設定された対応ポリシーに従って終了します。5 分以上停止したプロセスは応答なしとして終了します。

大きなシーンのロード、同期的なアセット解凍、シェーダー warmup、Addressables の準備など、メインスレッドを数秒以上意図的にブロックする正当な処理でも、この状況は発生する可能性があります。

このような信頼できるロード境界は OZeroWatchdog.BeginLoadingGrace(maxGraceMs) で囲んでください。ロード開始時に grace が始まり、scope が dispose されるか End() が呼ばれた瞬間に終了するため、正確なロード時間を事前に知る必要はありません。

using OZeroSDK.Security;
using UnityEngine.SceneManagement;

public void LoadLargeScene()
{
    using (OZeroWatchdog.BeginLoadingGrace(60000))
    {
        SceneManager.LoadScene("Battle", LoadSceneMode.Single);
        // Grace ends as soon as the using scope exits.
    }
}

public void WarmUpLargeAssets()
{
    OZeroWatchdog.RunWithLoadingGrace(() =>
    {
        BuildLargeRuntimeCache();
    }, 60000);
}
注意: Loading Grace の誤用禁止

この機能は、長いロード処理中にアプリがシステムによって強制終了されるのを防ぐための一時的な猶予です。セキュリティ回避やアプリを常時動かし続ける目的には使用できません。

許容時間を超える重いロード処理がある場合は、処理を小さな単位に分けるか、Unity の Coroutine / async ロードを使って画面とメインスレッドが止まったままにならないようにしてください。

物理ハック検出器

移動するプレイヤーオブジェクトごとに、このコンポーネントを付ける方式です。
OZeroSecurityConfig.PhysicsHack は全体のオン/オフ、Pro のリモート設定の取得、テレメトリの送信を設定します。速度制限、距離許容値、壁抜け検査、加速度検査は、それぞれの OZeroPhysicsHackDetector コンポーネントで設定します。プレイヤープレハブに追加し、キャラクターや車両の実際の移動ルールに合わせて値を調整したうえで、スポーン後に Initialize(playerId) を呼び出してください。
フィールド Type デフォルト 説明
physicsHack.useGlobalPhysicsHackbooltrueすべての Physics Hack コンポーネントをまとめてオン/オフするスイッチです。物理移動チェックを意図的にすべて止めたい場合だけオフにしてください。
Security Config > Pro - License & Online Services > Telemetry > Enable Remote Physics Config (Pro)booltruePro でアプリ起動時に全体の PhysicsHack 設定を取得します。新規設定の既定値は true で、セキュリティプリセットはライセンスのティアが Pro のときだけ有効にし、Standard では無効にします。ポータルで指定した項目(useGlobalPhysicsHack、telemetryThrottlePerMinute)だけがローカル値を上書きし、テレメトリーはサーバーから無効化のみ可能で有効化はできません。無効時やサーバー接続に失敗した場合はローカル設定を使います。キャラクターごとの移動しきい値は別の設定です。コードからは読み取り専用の EnableRemotePhysicsConfig で確認できます。
Security Config > Pro - License & Online Services > Telemetry > Enable Server Telemetry (Pro)booltruePro 専用で、既定で有効です。プロジェクトが無効化しない限り、一般セキュリティイベントと詳細な PhysicsHack telemetry を送信します。無効化すると新しい telemetry 送信を停止し、サーバーポリシーはローカルで無効化された送信を有効化できず、無効化のみ行えます。
Security Config > Pro - License & Online Services > Telemetry > Telemetry Throttle Per Minute (Pro)int30このクライアントが 1 分間に送信できる PhysicsHack telemetry 数を制限します。基準値の設定ミスでサーバーへイベントが大量送信されることを防ぎます。
フィールド Type デフォルト 説明
maxAllowedSpeed float 15 u/s このオブジェクトが通常到達できる最大移動速度です(Unity units/second)。キャラクターや車両がゲーム内で正当に出せる最速値に合わせて設定してください。
distanceTolerance float 2.0 u maxAllowedSpeed から計算した移動可能距離に追加して許可する距離です。ネットワーク位置補正、物理計算の丸め、コントローラーの小さな揺れを吸収するために使います。
obstacleLayer LayerMask — 壁や固い障害物として扱うレイヤーです。OZero は前回の安全な位置から現在位置までの経路を調べ、途中でこのレイヤーに当たると壁抜けとして扱えます。
checkInterval float 0.05 s このコンポーネントが位置、壁抜け、加速度異常を確認する周期です。値を下げると反応は速くなりますが、CPU 使用量が増える場合があります。
maxDeltaTimeCap float 0.1 s 距離計算に使うフレーム時間の最大値です。長い 1 フレームだけで許可移動距離が大きくなりすぎることを防ぎます。
violationThresholdint2コールバックを発生させる前に、異常チェックが何回続く必要があるかを指定します。正常チェックが出るとカウンターが下がるため、小さな物理の揺れ 1 回だけでは違反になりません。
castRadiusfloat0壁抜け検査に使う半径です。0 の場合は CharacterController または CapsuleCollider から自動推定し、見つからなければ線の検査に切り替わります。
enableAccelerationCheckbooltrueRigidbody の速度が急に大きく変わっていないかを確認します。kinematic オブジェクト、サーバー権威の移動、カスタム移動など、物理以外の方法で速度が変わることが正常な場合は、オフにすることを検討してください。
maxAllowedAccelerationfloat60検査の間に許可する最大速度変化量です。ダッシュ、ノックバック、ジャンプ台、車両など、瞬間的に大きく加速する正常移動がある場合は、その動きに合わせて上げてください。
enableLogbooltrue調整中にこのコンポーネントのデバッグログを表示します。ただし obstacle layer が空など重要な設定ミスは、この値がオフでも警告されます。

Injection Detector 設定

実行中のゲーム内部に入り込むプログラムを検知します。注入されたネイティブモジュール、実行可能なプライベートメモリ、インラインフック、リモートスレッド型の注入、高リスクのプロセスハンドル、WebGL ランタイム改ざんが対象です。正規のオーバーレイやキャプチャツールも同じ経路でゲームに入るため、検知器はすべてのモジュールをファイルハッシュと署名者で識別し、モジュールごとに判断できるようにします。

既定の設定から始めてください。
正規のオーバーレイ、録画ソフト、パートナー SDK、自分のゲームに同梱したモジュールが検知された場合だけ許可してください。先に Failure Diagnostics か Pro ポータルでモジュール名、ファイルハッシュ、署名者を確認してください。よく見かけるという理由だけで許可しないでください。チートツールもありふれています。
フィールド Type デフォルト 説明
Activate Injection & HookingcheckboxOnConfig Dashboard の Injection & Hooking オン/オフ項目です。内部的には useInjection に対応します。プレイヤービルドではネイティブ Injection 検査を実行し、開発ビルドでは原因確認のために緩やかな診断フローで動作します。エディター Play Mode では Editor Play Mode Protection が Test のときだけ検査します。
injectionWhitelistEntriesOZeroInjectionWhitelistEntry[]emptyすべてのティアで使えるローカル信頼モジュールリストです。各項目は、モジュールファイルの SHA-256 hash と任意の signer fingerprint で特定のファイル 1 つを許可します。ゲームと一緒に配布する、または QA、診断ファイル、Pro telemetry、OZero サポート案内で確認したモジュールだけ登録してください。
Security Config > Injection & Hooking > Pro - Online > Enable Server Whitelist (Pro)boolfalsePro で署名付きのモジュール許可・拒否リストを取得します。enableServerWhitelist 一つで取得を切り替え、許可リストと拒否リストの有効期限はそれぞれ管理します。許可したモジュールはサイレント処理し、明示的に拒否したモジュールにはブロック方針を適用します。検証済みリストだけをキャッシュし、オフラインでは有効期限内の判定のみ使います。既定値は false です。
Security Config > Injection & Hooking > Pro - Online > Enable Injection Scoped Exact (Pro)boolfalse観測したモジュールを、リスト全体を取得する代わりにハッシュ単位でサーバーに照会します。まだ提供されていません: OZero サーバーでこの照会機能が有効になっていないため、有効にしても効果はなく、SDK は通常のサーバーホワイトリストを使い続けます。無効のままにしてください。
Security Config > Injection & Hooking > Pro - Online > Enable Injection Bloom Advisory (Pro)boolfalse署名付きのグローバルモジュールインデックスで照会の優先順位を決めます(参考のみ)。まだ提供されていません: グローバルインデックスのルートキーが公開されていないため、enableInjectionScopedExact と一緒に有効にすると root_unconfigured でビルドが失敗します。無効のままにしてください。
serverWhitelistRefreshIntervalfloat0 s実行中にサーバーリストを定期取得する間隔です。0 では定期取得だけを停止し、起動時の取得と期限切れ前の自動更新は継続します。
requireSignerForNativeWhitelistboolfalseWindows PE と Apple Mach-O の whitelist 項目に、ファイル hash だけでなく signer fingerprint も要求します。より強い方式ですが、正確な signer 値を収集できる場合だけ有効にしてください。Android/Linux の共有ライブラリは通常 hash-only で扱います。
Security Config > Injection & Hooking > Pro - Online > Enable Remote Injection Config (Pro)booltruePro サーバーから Injection 設定を取得します。新規設定の既定値は true で、セキュリティプリセットはライセンスのティアが Pro のときだけ有効にし、Standard では無効にします。サーバーで指定した項目だけを上書きし、無効時はローカル設定のみ使います。サーバーホワイトリストの取得は enableServerWhitelist で別途設定します。
remoteInjectionConfigIntervalfloat300 sPro のリモート Injection 設定を再確認する周期です。0 の場合はアプリ起動時に 1 回だけ取得します。
enableWindowsModuleIdentityScanbooltrue起動後に現れたすべてのモジュールをファイルハッシュで、Windows/macOS では署名者の指紋でも識別します(フィールド名は旧名のまま Windows ですが全ネイティブ対象に適用)。iOS/macOS はアプリバンドル内のイメージをゲームのコードとみなし、Android/Linux は共有ライブラリをハッシュで識別します。モジュールの識別方法を参照してください。 macOS では、アプリと異なる署名者で署名されたバンドル内のイメージをインジェクション候補とみなします。
enableWindowsSystemModuleScanbooltrueWindows の System32、SysWOW64、WinSxS からゲームにロードされたモジュールを検査します。有効にすると、システムフォルダー内にあるという理由だけでモジュールやフック先を信頼しなくなります。Low: false、Standard/Strict: true。モジュールの識別には enableWindowsModuleIdentityScan も有効にしてください。インラインフックの検査は別のオプションで設定します。
scanIntervalSecondsfloat2 sInjection 検査を実行する基本周期です。値を下げると検出は速くなりますが、ランタイム負荷が増える場合があります。実際の適用値は安全な範囲に制限されます。
windowsModuleIdentityScanIntervalSecondsfloat5 s比較的重いネイティブモジュール識別検査の別周期です。モジュール列挙、hash 計算、signer 確認が対象端末で重い場合は、この値を上げてください。
scanJitterPercentfloat20%周期検査が毎回まったく同じ秒に走らないよう、設定した周期の前後で実行時刻を少し分散します。
enableExecutablePrivateMemoryScanbooltrue通常のモジュールとして読み込まれていない実行可能なプライベートメモリを検知します。シェルコード型のペイロードを捕らえますが、実行可能領域だけでは証拠を累積するのみで、単独ではゲームを終了しません。Mono スクリプティングバックエンドのビルドでは、Mono JIT がまさにこの種のメモリを作るため、すべてのプラットフォームで自動的に無効になります。
enableInlineHookScanboolfalse重要なネイティブ API エントリーポイントにパッチの痕跡がないか確認します。強いシグナルですが、overlay やセキュリティソフトも API を hook することがあるため、Strict 性質のビルドで互換性テスト後に有効化することを推奨します。
enableThreadStartAddressScanbooltrueネイティブ thread が信頼モジュール外の疑わしいメモリから開始していないか確認します。対応プラットフォームで remote-thread 型の注入を検出する助けになります。
enableExternalProcessHandleScanbooltrueデバッガーやメモリエディターのような外部プロセスが、ゲームプロセスに危険な handle を持っていないか確認します。主に Windows で使用されます。
detectionConfidenceThresholdint70強い Injection シグナルを即時に違反として扱う最小信頼度です。それより低いシグナルは連続・ウィンドウ判定で引き続き扱います。60〜100 に制限され、60 未満にするとプロセス内のあらゆる JIT エンジン(WebView、Lua、Mono)が違反のように見えます。
enableWebRuntimeTamperScan (WebGL)booltrueWebGL 専用のブラウザランタイム検査です。WebGL では Native C++ モジュールスキャンを使えないため、ブラウザ側の改ざんシグナルを集める補助的なクライアント証拠として理解してください。
webRuntimeScanIntervalSeconds (WebGL)float1.5 sWebGL ランタイム検査の基本周期です。ブラウザを過度に頻繁に検査しないよう、実際の適用値は 0.5〜30 秒に制限されます。
webRuntimeScanJitterPercent (WebGL)float20%WebGL ランタイム検査が毎回同じ瞬間に実行されないよう、設定した周期の前後で実行時刻を少し分散します。
WebGL probesboolstrueWebGL ビルドで DevTools、clock hook、network hook、WebAssembly hook、storage hook、crypto API hook 検査を個別にオン/オフするスイッチです。

見慣れないシステムモジュールが見つかっても、すぐにゲームを終了することはありません。まず確認対象として記録し、繰り返し検出されたことやファイルに署名がないことだけを理由にブロックしません。既存の許可ルールは維持され、ハッシュで明示的に拒否したモジュールにはブロック方針が適用されます。このオプションは Unity の Injection 設定で変更できます。Pro ポータルからのリモート変更には対応していません。他のプラットフォームには影響しません。

検知器がモジュールを識別する方法

検知器は数秒ごとにゲームプロセスに読み込まれた全モジュールを走査し、起動時の一覧と比較します。新しいモジュールはファイルハッシュで、Windows・macOS では署名証明書の指紋でも識別します。規則はモジュール自体だけを見てインストールフォルダー名は見ないため、正規のプログラムがインストールパスのせいで誤検知されることはありません。

プラットフォーム ゲーム自身のコードとみなす基準
Windowsゲーム自身の native モジュールは、フォルダーの場所ではなく署名済みのビルド整合性ハッシュ一覧で確認します。enableWindowsSystemModuleScan=false の場合、System32・SysWOW64・WinSxS のモジュールは識別検査の対象外です。有効にすると、ゲーム起動時からロードされていたシステムモジュールも検査します。不明なシステムモジュールはまず確認対象として記録し、ハッシュで明示的に拒否したモジュールにはブロック方針を適用します。既存のハッシュ・署名者の許可ルールと、検証済みベンダーのサイレント処理は維持されます。ゲームフォルダーにある署名一覧外の native ファイルは、起動時に Build Integrity 違反として扱います。
iOS / macOSアプリ自身の .app バンドルに属するイメージと Apple プラットフォームイメージです。ビルド時に生成物は不要です。iOS 14.0 以上が必要で、それ未満では Editor の preflight が失敗します。 ただし macOS では、アプリと同じ署名者(GameAssembly.dylib・UnityPlayer.dylib の署名)で署名されたバンドル内のイメージだけをゲームコードとみなします。ad-hoc・未署名、または別の署名者のイメージは、バンドル内にあってもインジェクション候補(bundle_signer_mismatch)として扱います。Valve 署名の libsteam_api.dylib は例外です。アプリ自体が ad-hoc 署名の場合は比較しません。
Android / Linux起動時の共有ライブラリのうち実行時と同じ規則を通過したもの、システム・エンジンのランタイムライブラリ、Steam オーバーレイ、そしてアプリ自身のライブラリです。Linux ではビルドが署名したインベントリで(フォルダーの位置は見ません)、Android では OS だけが書けるインストール済みパッケージディレクトリでアプリ自身のライブラリを識別します。Android のシステム WebView 提供アプリもプラットフォーム構成要素として扱います。どのファイルにも属さない実行可能メモリも同じ走査で報告されますが累積判定のみで、単独では終了しません。Linux ホストレイヤーと Proton は上の Build Integrity ポリシー(既定 Monitor)に従います。

チェックは検知ファミリーごとに検知、走査済み正常、まだ時期でないの 3 つのいずれかで答えます。実際のサンプルだけがカウンターを動かし、実行されなかったチェックは以前の検知を消さず、まったく実行できなかったチェックは正常ではなくスキャナーの健全性問題として報告されます。

確定検知後の動作。Force Quit On Detection がオン(Standard・Strict プリセットの既定値)の場合、確定した注入モジュールはコールバック猶予時間の後にゲームを終了します。OZeroSecurityReceiver やコールバックでログを残すだけでも同じで、Windows ではネイティブのモジュール監視が直接終了します。インジェクションをゲーム側のコードだけで扱う場合は Force Quit On Detection をオフ(Low プリセット)にして Receiver で対応してください。

Pro ビルド。Pro ビルドに署名のないモジュールが注入されると、ライセンスサーバーが次のオンライン確認(約 4 分ごと)を拒否します。この拒否は Build Integrity の失敗として扱われ、Force Quit On Detection やコールバックに関係なく必ずゲームを終了します。正当なモジュールであればポータルで許可してください。

Pro: ポータルから検出モジュールを許可 / ブロック

enableServerWhitelist を有効にすると、Pro ビルドはプロジェクトのポータル判定と OZero の全体判定をまとめた署名付きリストを取得します。起動時と設定した間隔で取得し、許可・拒否リストが期限切れになる前にも自動更新します。

判定 ゲームの動作
Allowそのモジュール(ハッシュ+署名者が一致)がネイティブの信頼リストに載り、プロジェクトの全端末で脅威として扱われなくなります。
Blockこのモジュールが読み込まれたゲームは繰り返し検知を待たずに即時終了します。チートツールと確定した場合のみ使います。
Watchゲームには届きません。記録だけが蓄積され、後でより多くの根拠をもとに決められます。

スキャナー利用不可 (abort code 0x15)

ネイティブスキャナー自体が動作できない場合(設定の適用失敗、繰り返されるネイティブスキャンエラー、managed/native の契約不一致)、SDK は ModulationType.InjectionScannerUnavailable(値 10、abort code 0x15、message key injection_scanner_unavailable)を報告し、ForceQuitOnDetection が無効でもゲームを終了します。攻撃の検知ではなく、静かに壊れたスキャナーがゲームを無防備にするのを防ぐための動作です。プレイヤーには OZ-SEC-15 のようなサポートコードを表示し、ログには abort code を残してください。

PlayerPrefs 暗号化

保護が必要な新しい key は、Unity の PlayerPrefs ではなく OZeroSafePlayerPrefs に保存してください。よく使う Get/Set、HasKey、Delete、Save 形式はなじみのある名前で提供されますが、暗号化されたデータは既存の plain PlayerPrefs データとは互換性がありません。

using OZeroSDK.Security;

// Save a value
OZeroSafePlayerPrefs.SetInt("score", 4200);
OZeroSafePlayerPrefs.SetFloat("volume", 0.8f);
OZeroSafePlayerPrefs.SetString("username", "Hero");

// Read a value
int    score    = OZeroSafePlayerPrefs.GetInt("score", 0);
float  volume   = OZeroSafePlayerPrefs.GetFloat("volume", 1.0f);
string username = OZeroSafePlayerPrefs.GetString("username", "");

セーブファイルの暗号化

セーブファイルを暗号化するには、File.ReadAllText / File.WriteAllText の代わりに OZeroSV_File を使用してください。ファイルは書き込み時に自動的に暗号化され、読み込み時に復号されます。ロード時に改ざんの有無も検査します。

using OZeroSDK.Security;

string path = Application.persistentDataPath + "/save.json";

// Write encrypted file
OZeroSV_File.WriteAllText(path, jsonString);

// Read and decrypt file
string json = OZeroSV_File.ReadAllText(path);
重要: リリース後には developerSecret を変更しないでください。developerSecret は OZeroSafePlayerPrefs と OZeroSV_File データの暗号化キーを作る基準値です。リリース後にこの値を変更すると、既存のバージョンで保存した保護データを新しいビルドで読み取れません。OZeroSV_File はキー変更を検出して null を返し、OZeroSV_File.OnKeyMismatch イベントを発生させます(セキュリティ違反としては扱いません)。OZeroSafePlayerPrefs は既定値を返します。ユーザーデータを守るには、ゲーム側で移行または初期化の処理が必要です。

4 インゲーム変数の保護(Secure Types)

Secure Types は、通常の C# 変数型を暗号化された型に置き換えます。値が Native C++ ヒープに保存されるため、メモリスキャナーやメモリエディターではメモリをスキャンしても見つけることができません。型の名前を変更するだけで、残りのコードはそのまま動作します。

Unity Inspector showing OZeroSV_Int and OZeroSV_Float fields

サンプルコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using OZeroSDK.Security;

public class PlayerStats : MonoBehaviour
{
    [SerializeField] OZeroSV_Int Gold = 5000;
    [SerializeField] OZeroSV_Float Speed = 3.5f;
    [SerializeField] OZeroSV_Int HP = 1000;
}

サポートタイプ

既存 OZero 適用後
intOZeroSV_Int
longOZeroSV_Int64
uintOZeroSV_UInt
ulongOZeroSV_UInt64
shortOZeroSV_Short
ushortOZeroSV_UShort
byteOZeroSV_Byte
floatOZeroSV_Float
doubleOZeroSV_Double
decimalOZeroSV_Decimal
boolOZeroSV_Bool
stringOZeroSV_String
Vector2OZeroSV_Vector2
Vector3OZeroSV_Vector3
byte[]OZeroSV_Buffer
Secure Types は OZeroSDK.Security 名前空間を使用します。該当タイプを宣言するスクリプトに using ディレクティブを追加してください。

7 セキュリティイベント処理(選択)

基本的に OZero は脅威を検知すると、設定された対応ポリシーに従ってアプリを終了するかログのみを残します。直接警告画面を表示したり、独自のサーバーログを送信したり、終了直前に保存処理をしなければならない場合はコールバックを登録できます。コールバックは OZeroSecurityEvent を通じて変調タイプ、中断コード、メッセージキー、詳細メッセージ、終了予定の可否を一緒に伝達します。

using UnityEngine;
using OZeroSDK.Security;

public class SecurityHandler : MonoBehaviour
{
    void OnEnable()
    {
        // RegisterUserCallback runs on the user chain only.
        // The built-in default handler runs independently and cannot be silenced.
        OZeroSecurityManager.Instance.RegisterUserCallback(OnThreatDetected);
    }

    void OnDisable()
    {
        OZeroSecurityManager.Instance.UnregisterUserCallback(OnThreatDetected);
    }

    void OnThreatDetected(OZeroSecurityEvent evt)
    {
        // evt contains Type, AbortCode, AbortCodeHex, MessageKey, Message, and WillAbort.
        Debug.LogWarning(
            $"OZero threat: {evt.Type} {evt.AbortCodeHex} {evt.Message}");

        switch (evt.Type)
        {
            case ModulationType.SpeedHack:
                // e.g. kick the player, show warning, report to server
                break;

            case ModulationType.BuildIntegrity:
                // evt.WillAbort is usually true for fatal build integrity violations.
                break;

            case ModulationType.Injection:
                break;
        }

        if (evt.WillAbort)
        {
            // Last chance to flush your own analytics or save state.
        }
    }
}

OZeroSecurityEvent、ModulationType、OZeroAbortCode の全体リストは API レファレンスに文書化されています。

evt.WillAbort が true であれば現在の対応ポリシー上、コールバック以降にアプリが終了されます。この時は独自の analytics flush や保存処理のみを短く実行してください。
検知イベントの伝達フロー

脅威が検知されると、OZero はまず SDK の基本の対応ポリシーを適用し、プロジェクトで登録したコールバックとインスペクターのイベントにも同じセキュリティイベントを伝達します。直接警告画面を表示したりサーバーログを残したい場合はコールバックを登録してください。アプリの終了の可否は Config Dashboard の Response 設定と evt.WillAbort 値で確認できます。

ポータルポリシーコールバック

Customer Portal のポリシーは段階的に運用できます。Observe は証拠のみを記録し、Callback はサーバー発行の policy action をゲームへ配信し、Device Block は以降のサーバー検証で対象デバイスをブロックします。より強いデバイスブロックを使う前に、ゲーム側で警告表示、マッチメイキング制限、再ログイン要求、サポート案内を処理したい場合は Callback を使用してください。

using UnityEngine;
using OZeroSDK.Security;

public class PolicyActionHandler : MonoBehaviour
{
    void OnEnable()
    {
        OZeroSecurityManager.Instance.RegisterUserPolicyActionCallback(OnPolicyAction);
    }

    void OnDisable()
    {
        OZeroSecurityManager.Instance.UnregisterUserPolicyActionCallback(OnPolicyAction);
    }

    void OnPolicyAction(OZeroPolicyActionEvent evt)
    {
        Debug.LogWarning(
            $"Policy callback: {evt.Module}, score={evt.Score}, reason={evt.Reason}");

        if (evt.Score >= 80)
        {
            // Show your own UI, limit sensitive actions, or ask the player to reconnect.
        }
    }
}

次のステップ

これで OZero の核心の保護機能が実行中です。API レファレンスですべてのクラス、メソッド、設定オプションを詳しく確認してみてください。

トラブルシューティングリファレンス

Use this section when an OZero dialog appears, a security log is reported, or the app closes for a security reason. Start with the code shown on screen or in the log, then follow the first checks below.

Support Codes

Support codes are short labels shown in OZero dialogs and logs. When a player sends this code to support, the development or QA team can quickly identify which broad area to check. OZ-SEC-* means a security event was reported, and OZ-MV-* means an online or managed verification state needs attention.

Code Category What to check
OZ-SEC-01Memory protectionCheck whether protected values were changed by an unsupported path, a test tool, or an incorrect Secure Types integration.
OZ-SEC-02Injection or hookCheck whether an overlay, debugger, modding tool, or other external program was attached. Add exceptions only after QA confirms the program is trusted.
OZ-SEC-0ABuild integrity / Environment tamperThe notice label tells which one. Build integrity: check whether the build, manifest, signing information, native variant, or packaged files changed after the release build was prepared. Environment tamper: a debugger, a cheat or reverse-engineering tool process, a VM or emulator, or root/jailbreak was detected; check what was running on the device.
OZ-SEC-0CSpeed or time changeCheck speedhack tools, device clock changes, direct Time.timeScale writes, and legitimate slow-motion or pause flows.
OZ-SEC-0EDevice or install policyCheck the install source, store package identity, emulator/root/jailbreak policy, and device-binding support process.
OZ-SEC-0FPhysics checkCheck whether movement limits, collision layers, dash, knockback, or vehicle movement are tuned for the actual game rules.
OZ-SEC-10Runtime environmentCheck whether the app is running in a supported device, browser, emulator, debugger, or platform test environment.
OZ-SEC-13Steam verificationCheck Steam launch state, AppID, ownership verification, required Steamworks files, and network connection.
OZ-SEC-15インジェクションスキャナー利用不可攻撃ではありません。ネイティブのインジェクションスキャナーが動作できない状態です(設定未適用、繰り返されるスキャン失敗、managed/native の契約不一致)。SDK とネイティブバイナリが同じパッケージのものか確認し、ゲームを再インストールしても続く場合はお問い合わせください。
OZ-SEC-1FUnknown categoryCollect the platform, SDK package version, native ABI, Player log, ozero_abort.txt, and exact reproduction steps.
OZ-MV-LOCALManaged verificationCheck license activation, server/network access, registered app identity, platform signing information, and the currently applied variant manifest.

Abort Codes

Abort codes are stable categories used in logs, callbacks, and OZ-SEC-* support codes. They tell the development team which protection area responded without exposing detailed evidence to the player.

Code Category Meaning
0x01Memory protectionProtected memory value changed unexpectedly.
0x02Injection or hookUnexpected module, hook, or runtime injection signal detected.
0x0ABuild integrity / Environment tamperBuild integrity validation failed, or a build integrity runtime-environment check (debugger, cheat or reverse-engineering tool process, VM or emulator, root/jailbreak) detected a finding.
0x0CSpeed or time changeSuspicious execution speed, time scale, system clock, or trusted-time anomaly detected.
0x0EDevice or install policyDevice binding or install-source policy rejected the current environment.
0x0FPhysics checkAbnormal physics behavior exceeded the configured policy.
0x10Runtime environmentUnsupported or unsafe runtime environment detected.
0x13Steam verificationSteam ownership or ticket validation failed.
0x15インジェクションスキャナー利用不可インジェクションスキャナー自体が動作できませんでした。SDK は無防備で実行し続ける代わりに fail-close で終了します。
0x1FUnknown categoryA security event did not match a more specific public category.
0x0BADB007起動確認Boot-ACK タイムアウト: managed の OZero ブートストラップが時間内に起動完了を通知しませんでした。
0x0BADB008起動確認ロードアンカーのタイムアウト: OZero ネイティブライブラリはロードされましたが、90 秒以内に OZero ブートストラップが開始されませんでした。ビルドの OZero 起動エントリが削除または編集された可能性があります。

For API fields and callback examples, see OZeroAbortCode & Event Messages.

解決手順

Step Action Expected evidence
1Record the support code shown on screen or in the log, plus the platform.The screenshot or ticket should include the code, OS, Unity version, SDK package version, and whether the build is Development or Release.
2Check ozero_abort.txt and the Player log first.These files can still help when the app closes before a popup appears.
3If the issue is reproducible in QA, enable Enable Failure Diagnostics, reproduce once, then disable it again.The latest ozero_*_failure.log helps identify which protection area responded. Use this file only for QA or support investigation.
4Run Window > OZero Security > Check Setup before changing policies.Preflight can catch missing required packages, manifest/signing mismatch, platform settings, ProGuard/R8 settings, native plugins, and obvious license setup issues.
5For Pro or managed verification cases, compare portal registration with the actual build information.Confirm package/app ID, platform signing information, SDK package, native ABI, active variant manifest, license tier, server connection, and any downgraded or limited state.
6After the fix, rerun the matching platform QA scenario.Capture survival timing, Managed UI visibility, simulated or real attack result, popup countdown, and final logs before closing the ticket.