Unity プラットフォーム保護: 開発者向け修正ガイド
概要
Unity 2017.1 以降 でビルドされた Android、Windows、macOS 向けのすべてのゲームとアプリケーションに影響する重大なセキュリティの脆弱性が確認されました。この脆弱性により、ローカルアクセス権を持つ悪意のある攻撃者が、アプリケーションのコンテキスト内で任意のコードを実行できる場合があり、データ漏洩や特権昇格につながる可能性があります。
この脆弱性は、Unity アプリケーションで任意のコードをロードして実行することを可能にするコマンドライン引数に起因します。この脆弱性の影響は、ホストプラットフォームによって異なります。脆弱性がターゲットプラットフォームにどのように影響するかを理解するには、プラットフォーム別テクニカルノート を参照してください。
重要: プロジェクトが 2017 から現在のパッチ適用済みリリースまでのいずれかの Unity バージョンでビルドされている場合は、影響を受ける可能性があります。影響を受けるプロジェクトがあるすべての開発者が、対処する必要があります。
修正のオプション
Unity 2017.1 以降 でビルドされた Android、Windows、macOS、Linux 用のゲームとアプリケーションに影響するセキュリティの脆弱性が確認されています。脆弱性が悪用された形跡はなく、ユーザーや顧客への影響も今までありません。この脆弱性は、Unity アプリケーションでネイティブとマネージドの拡張をロードして実行することを可能にするコマンドライン引数に起因します。脆弱性がターゲットプラットフォームにどのように影響する可能性があるかを理解するには、プラットフォーム別テクニカルノート を参照してください。
重要: プロジェクトが 2017 から現在までのパッチ適用済みリリースのいずれかの Unity バージョンでビルドされている場合は、影響を受ける可能性があります。影響を受けるプロジェクトがあるすべての開発者が、対処する必要があります。
1.パッチ適用済みの Unity エディターを使用してリビルドする (推奨)
影響を受ける各 Unity エディターバージョンのパッチ適用済みリリースをダウンロードできます。パッチ適用済みの Unity エディターをダウンロードし、その後にアプリケーションをリビルドすることができます。
パッチを適用した Unity エディターバージョンを使用してアプリケーションをリビルドする手順は以下の通りです。
- アプリケーションのビルドに使用した Unity バージョン (例: Unity 6.1、Unity 2022.2 など) に一致する Unity エディターの最新リリースを ダウンロード します。
- Unity Hub
- Unity ダウンロードアーカイブ
- 更新したエディターで プロジェクトを開きます。
- アプリケーションを リビルド し、再テスト します。
- 配信チャンネルに 再度公開 します。
2.ビルド済みアプリケーションにパッチを適用する
ソースからリビルドすることができない (またはアプリのリビルド中に修正プログラムを展開する) 場合は、Unity アプリケーションパッチャー を使用して既存の Android、Windows、または macOS ビルドを更新します。
Unity アプリケーションパッチャーの使用方法は以下の通りです。
- Unity アプリケーションパッチャーをダウンロードします:ツールを入手
- ライセンス契約、利用ガイド、詳細なオプションを確認します。詳細については、パッチャーのドキュメントを参照してください。
- 既存のビルドに対して パッチャーツールを実行 します (Windows または macOS 向けビルドへのパッチ適用にはインターネット接続が必要)。
- パッチ適用後に アプリケーションをテスト し、機能することを確認します。
- 配信チャンネルに 再度公開 します。
Unity アプリケーションパッチャーがさまざまなプラットフォームに対してどのように機能するかを理解するには、プラットフォーム別テクニカルノートを参照してください。
注意:
- パッチャーは、一部の改ざん防止またはチート対策ソリューションによって保護されているビルドとは互換性がありません。
- パッチ適用後は、必ずアプリケーションの完全性と機能を検証してください。
- Unity アプリケーションパッチャーツール自体は Unity 6.0 で開発されており、このツールを実行するには、対応する Windows または macOS のシステム要件 が適用されます。
プラットフォーム別テクニカルノート
以下のセクションでは、セキュリティの脆弱性が Android/Windows/macOS アプリケーションにどのように影響するか、Unity アプリケーションパッチャーが各プラットフォームでどのように動作するかについて説明します。
コマンドライン | 影響を受ける正式リリースバージョン | 説明 |
---|---|---|
-xrsdk-pre-init-library | Android、Windows、Mac、Linux: Unity 2019.1+ | 内部 Data/boot.config ファイルからロードされることを意図した引数で、Unity 起動時にネイティブライブラリをロードします。コマンドライン引数として使われることを意図したものではありません。 |
-dataFolder | Windows: Unity 2022.2+ Mac:Unity 2023.2+ Linux:Unity 2022.3+ | データフォルダーを再配置して、1 個の実行ファイルを複数のデータフォルダー間で共有することを可能にします。 |
-overrideMonoSearchPath | Android 32 ビット (Mono)、Windows (Mono)、Mac (Mono)、Linux (Mono): Unity 2017+ | Mono がアセンブリをロードするときに検索する追加のフォルダーを指定します。IL2CPP が使用されている場合、この引数には何の効果もありません。 |
-monoProfiler | Windows (Mono): Unity 2018.3+ | 外部ライブラリから取得できる Mono ランタイムのプロファイラーを初期化および構成するために使用されます。IL2CPP が使用されている場合、この引数には何の効果もありません。 |
コマンドライン | 影響を受ける正式リリースバージョン | 説明 |
---|---|---|
-xrsdk-pre-init-library | ||
影響を受ける正式リリースバージョン Android、Windows、Mac、Linux: Unity 2019.1+ | ||
説明 内部 Data/boot.config ファイルからロードされることを意図した引数で、Unity 起動時にネイティブライブラリをロードします。コマンドライン引数として使われることを意図したものではありません。 |
コマンドライン | 影響を受ける正式リリースバージョン | 説明 |
---|---|---|
-dataFolder | ||
影響を受ける正式リリースバージョン Windows: Unity 2022.2+ Mac:Unity 2023.2+ Linux:Unity 2022.3+ | ||
説明 データフォルダーを再配置して、1 個の実行ファイルを複数のデータフォルダー間で共有することを可能にします。 |
コマンドライン | 影響を受ける正式リリースバージョン | 説明 |
---|---|---|
-overrideMonoSearchPath | ||
影響を受ける正式リリースバージョン Android 32 ビット (Mono)、Windows (Mono)、Mac (Mono)、Linux (Mono): Unity 2017+ | ||
説明 Mono がアセンブリをロードするときに検索する追加のフォルダーを指定します。IL2CPP が使用されている場合、この引数には何の効果もありません。 |
コマンドライン | 影響を受ける正式リリースバージョン | 説明 |
---|---|---|
-monoProfiler | ||
影響を受ける正式リリースバージョン Windows (Mono): Unity 2018.3+ | ||
説明 外部ライブラリから取得できる Mono ランタイムのプロファイラーを初期化および構成するために使用されます。IL2CPP が使用されている場合、この引数には何の効果もありません。 |
リリースストリームの一部のベータおよびパッチリリースが影響を受ける可能性があります。正式リリース以外のリリースで公開した場合は、影響を受けるバージョンの完全なリスト を参照してください。
注意: Google、Meta、Microsoft では、プラットフォームのセキュリティをさらに強化するために、OSレベルの対策も導入しています。それでも、Unity アプリケーションを完全に安全にするためには、パッチを適用するかリビルドする必要があります。
Android
注意: 脆弱性が悪用された証拠はなく、ユーザーやお客様に対する影響も発生していません。
Android では、その Unity アプリケーションが Unity 2019.1 以降を使ってビルドされた ものである場合は、特別な権限や設定に関係なく 対処する必要があります。
さらに、アプリが Unity 2017 以降でビルドされているか、Mono ランタイム (32 ビットのみ) を使用している場合は、脆弱である可能性があります。最終リリース以外のリリースで公開した場合は、影響を受けるバージョンの完全なリスト を参照してください。
- Android では、一般にアプリケーションは互いに分離されており、通常は脆弱性や誤った設定を悪用しなければアプリ間でコードのインジェクションはできません。
- この脆弱性が原因で、特別に細工されたインテントと
xrsdk-pre-init-library
コマンドライン引数またはoverrideMonoSearchPath
(mono でビルドされた 32 ビットアプリの場合) を使用して、デバイス上の他のアプリケーションが Unity アプリケーションを起動し、悪意のあるネイティブライブラリを挿入できる可能性があります。 - Android アプリケーションは、
datafolder
またはmonoProfiler
コマンドライン引数に対して 脆弱ではありません。
Android での破壊的変更
Android でこの脆弱性に対処することに関連した破壊的変更はありません。
Android 用 Unity アプリケーションパッチャー
Android では、Unity アプリケーションパッチャーは、APK または AAB を解凍し、脆弱なコードパスをブロックするために libunity.so
と boot.config
をローカルで変更してから、APK または AAB の再パッケージと再署名を行います。
Unity アプリケーションパッチャーは、libunity.so
と boot.config
の両方でxrsdk-pre-init-library
文字列を8rsdk-pre-init-library
に変更し、脆弱性のあるコードパスをブロックします。これにより、コマンドライン引数 (または Android の intent extra) として使用できなくなります (理由は引数の解析方法による)。boot.config
設定としては引き続き機能するため、boot.config
ファイル内でのすべての使用に対してもパッチが適用されます。
また、Unity アプリケーションパッチャーは、libunity.so
内の overrideMonoSearchPath
文字列の先頭文字を無効な Unicode 文字 0xC0
に置き換えることによって、32 ビットビルドの overrideMonoSearchPath
引数を Mono で無効にします。
Windows
注意: 脆弱性が悪用された証拠はなく、ユーザーやお客様に対する影響も発生していません。
Windows のようなデスクトッププラットフォームでは、実行中のプロセスにコードを挿入するさまざまな方法があります。ただし、それらの方法は通常、システムの特権レベルとセキュリティ境界によって制限されています。ほとんどの場合、自分で開始したプロセスにのみコードを挿入することができ、それを行っても、自分のプロセスがすでに持っている機能以上の追加機能は許可されません。
ただし、この状況では、Unity アプリケーションが カスタム URL スキーマハンドラーとして登録された場合、特権昇格に対して 脆弱である可能性があります。この登録は、自分のアプリケーションによって (ディープリンクやブラウザーからの起動をサポートするなどのために)、または他のアプリケーション (サードパーティのゲームランチャーやストアフロントなど) によって実行される可能性があります。
サードパーティのアプリケーションによって自分のアプリケーションがスキーマハンドラーとして登録されることを防ぐ方法はなく、それを検出する方法もないため、Unity では、予防策として Windows のすべての Unity アプリケーションにパッチを適用すること を推奨します。
- 登録された URL スキームを使用すると、より低い整合性レベル (サンドボックス化されたプロセスや権限の低いプロセスなど) でコードを実行している攻撃者が、Unity のこの脆弱性を悪用してアプリケーションを起動し、DLL を挿入して、攻撃者が用意したコードをアプリケーションに通常よりも高い権限で実行させることができます。
- インジェクションは、前述した脆弱なコマンドライン引数のいずれかを介して発生する可能性があります。
Windows での破壊的変更
- アプリケーションで
データフォルダー
を再配置するために-datafolder
コマンドライン引数を使用している場合、代わりにカスタムデータフォルダーを 2 番目の引数として UnityMain 関数に渡す必要があります。int UnityMain(HINSTANCE hInst, LPCWSTR customDataFolder, LPWSTR szCmdLine, int nCmdShow)
- アプリケーションで、XR プロバイダーの切り替えのために
xrsdk-pre-init-library
をコマンドライン引数として使用する場合は、OpenXR を使用するか、個別のビルドを用意することを推奨します。 overrideMonoSearchPath
は削除されます。個別のアプリケーションをビルドするか、すべてのスクリプトを同じビルドに入れることを推奨します。
Windows 用 Unity アプリケーションパッチャー
Windows 向けビルドの場合、Unity アプリケーションパッチャーツールは、Unity のバージョンに適したパッチ適用済みの UnityPlayer.dll
(または、Unity 2017.1 でビルドされたアプリケーションの場合は .exe
) をダウンロードし、ビルド済みアプリケーションの脆弱なファイルの代わりとして置き換えます。
注意: Unity アプリケーションパッチャーによって、Unity のサーバーからパッチ適用済みのバイナリが取得されるため、受け取る前にテストと検証が行われていることが確実になります。
UnityPlayer.dll
は、脆弱性のあるコマンドラインパラメーターをスキップするように修正されました。
xrsdk-pre-init-library
は、boot.config
設定として引き続き機能します。
重要: アプリケーションで データフォルダー
(Unity 2022.2 で導入) を再配置するために -datafolder
コマンドライン引数を使用している場合、"Windows での破壊的変更" セクションに示されている新しいパターンを採用する必要があります。
macOS
注意: 脆弱性が悪用された証拠はなく、ユーザーやお客様に対する影響も発生していません。
macOS では、カメラやユーザーのドキュメントフォルダーへのアクセスなど、多くの権限がアプリケーションごとに管理されています。権限の不正使用を防ぐため、macOS には Hardened Runtime 機能を含む複数のメカニズムが実装されています。Hardened Runtime を使用してビルドされたアプリケーションでは、署名されていない、または異なる署名を持つコードをロードすることがデフォルトでブロックされます。Hardened Runtime を使用することは、公証および Mac App Store での配布の要件です。
ただし、アプリケーションが Unity 2017.1 以降 (Mono スクリプティングバックエンドを使用) または Unity 2019.1 以降 (任意のスクリプティングバックエンドを使用) でビルドされている場合、Hardened Runtime を使用してビルドされている場合、およびコードインジェクション保護を弱める 特定のランタイム例外 が有効になっている場合、対処する必要があります。アプリケーションを脆弱にする例外は以下の通りです。
- ライブラリ検証の無効化 (
com.apple.security.cs.disable-library-validation
) — 署名されていない、または異なる署名を持つプラグインやフレームワークをロードすることが可能になります。これにより、xrsdk-pre-init-library
またはdatafolder
引数の使用時に、悪意のあるネイティブの.dylib
ファイルがロードされる可能性があります。 - JIT コンパイルされたコードの実行を許可する (
com.apple.security.cs.allow-jit
) —datafolder
またはoverrideMonoSearchPath
引数が悪用されると、悪意のあるマネージコードの実行が可能になる場合があります。この例外を許可することは、Mono スクリプトバックエンドのすべての使用の条件であることに注意してください。 - 署名されていない実行可能メモリを許可する (
com.apple.security.cs.allow-unsigned-executable-memory
) — 同様に、datafolder
引数が悪用された場合、悪意のあるマネージドコードの実行が可能になることがあります。
Hardened Runtime は通常、一般的なコードインジェクション方法をブロックし、そのような攻撃からアプリケーションを保護します。影響される Unity アプリケーションで上記のいずれかの例外が有効になっている場合、攻撃者は xrsdk-pre-init-library,datafolder
、または overrideMonoSearchPath
コマンドライン引数を介してコードを挿入できる可能性があります。
これにより、攻撃者がプロセス内に悪意のある .dylib
またはマネージアセンブリを挿入できる可能性があります。アプリケーション自体にない権限へのアクセスを許可することはできません。
macOS での破壊的変更
- アプリケーションで
データフォルダー
を再配置するために-datafolder
コマンドライン引数を使用する場合、代わりにシンボリックリンクを使用することを推奨します。 overrideMonoSearchPath
は削除されます。個別のアプリケーションをビルドするか、すべてのスクリプトを同じビルドに入れることを推奨します。
macOS 用 Unity アプリケーションパッチャー
macOS プロジェクトの場合、Unity アプリケーションパッチャーツールは、Unity のバージョンに適したパッチ適用済みの UnityPlayer.dylib
をダウンロードし、ビルドされたアプリケーションの脆弱なファイルと置き換えます。boot.config
変数 xrsdk-pre-init-library
が 8rsdk-pre-init-library
に変更されました。これにより、コマンドライン引数として使用できなくなります (理由は引数の解析方法による)。これは引き続き boot.config
設定として機能するため、boot.config
内で使用されている場合にもパッチを適用します。
重要: アプリケーションで データフォルダー
(macOS 用 Unity 2023.2 で導入) を再配置するために -datafolder
コマンドライン引数を使用している場合、"macOS での破壊的変更" セクションで説明されている新しいパターンを採用する必要があります。
パッチャーは、アドホック署名を使用して .app に再署名し、ローカルに実行できるようにします。アプリケーションが以前に開発者 ID 証明書で署名され、Apple による公証を得ている場合、パッチプロセスによってその公証は無効化されます。ソフトウェア配布に関する Apple の推奨事項 に従ってアプリケーションをリリースしてください。
Linux
注意: 脆弱性が悪用された証拠はなく、ユーザーやお客様に対する影響も発生していません。
Linux では、Unity の脆弱なコマンドライン引数は LD_PRELOAD
メカニズムと同様に機能します。Linux の標準的なセキュリティモデルのもとでは、これらの引数は権限の境界を超えることはなく、したがって、LD_PRELOAD
で可能なことに比べて追加のリスクをもたらすことはありません。
AppArmor、Bubblewrap、Firejail、SELinux などの環境では、制限されたプロセスがその制限を超えて Unity アプリケーションを起動できる場合、すでに任意のコード実行が可能であり、この脆弱性によってさらにリスクが増加することはありません。特定の SELinux または AppArmor の設定では、一般的なインジェクション方法 (LD_PRELOAD
、ptrace
) はブロックされる可能性がありますが、任意の引数を使用して Unity を起動することは可能です。この場合、脆弱な引数がポリシー制限を回避し、有効な攻撃経路となる可能性があります。
軽減策
リスクプロファイルが低いことから、Unity では Unity アプリケーションパッチャーの Linux バージョンはリリースして いません。必要に応じて、特にアクセス制御ポリシーが厳格な環境では、脆弱なコードパスを取り除くために、パッチ適用済みの Unity エディターを使用して Linux アプリケーションをリビルドしてください。
その他のプラットフォーム (iOS、コンソールなど)
iOS を含む他のすべての Unity 対応プラットフォームでは、この脆弱性が悪用可能であることを示す知見はありません。セキュリティを最大限に高めるために、Unity では、パッチを適用した最新の Unity エディターを使用してアプリケーションをリビルドすることを推奨します。
リソース
- パッチ適用済み Unity エディターをダウンロード
- Unity アプリケーションパッチャーをダウンロード
- Unity セキュリティアドバイザリー
- CVE の詳細
- Unity Support Services
アプリケーションを保護し、ユーザーを保護するために、対処する必要があります。ご質問やサポートについては、Unityサポート までご連絡ください。