アセットバンドルは、ゲームまたはアプリケーションと一緒に配布するか、ゲームまたはアプリケーションによってリモートサーバーからダウンロードするかを選択できます。後者の場合、アセットバンドルをダウンロードするときは、アセットバンドルのデータ破損や悪意のある攻撃者による攻撃を防ぐために予防措置を取ることが重要です。ユーザーデバイスで不可解なクラッシュが発生する一般的な原因は、ダウンロードしたアセットバンドルのデータ破損にあります。このような状況では、診断と解決に多大な労力と時間を要する場合があります。アセットバンドルには実行可能なコードは含まれていませんが、シリアル化されたデータを変更すると、攻撃者がゲームコードや Unity ランタイムの脆弱性を悪用することが可能になります。
インターネットからアセットバンドルをダウンロードしてキャッシュするために UnityWebRequestAssetBundle を使用できます。この API を使用する際には、URL が同じマシン上で実行されるローカルウェブサーバーを参照する場合を除き、URL に HTTPS プロトコルを使用する必要があります。HTTP プロトコルは安全ではなく、悪意のある中間者攻撃に対して脆弱です。
Unity は、アセットバンドルをダウンロードするときに、チェックサムを使用してアセットバンドルが破損または変更されていないかどうかを判断するためのツールを提供します。32 ビットのチェックサムが、アセットバンドルのビルドプロセス中に生成され、.manifest ファイルに記録され、BuildPipeline.GetCRCForAssetBundle によって公開されます。CRC チェックを使用すると、アセットバンドルのデータがビルド後に破損したり改ざんされたりしていないことを確認できます。この CRC は、UnityWebRequestAssetBundle.GetAssetBundle を通じてアセットバンドルをダウンロードするときに提供し、無効なアセットバンドルコンテンツがキャッシュに含まれないようにする必要があります。詳細については、アセットバンドルの圧縮とキャッシュ を参照してください。
アセットバンドルを自分でダウンロードまたは配布し、ビルトインの AssetBundle Cache を使用しない場合は、取得したコンテンツを使用する前に整合性チェックを実行する必要があります。これを行う 1 つの方法は、AssetBundle Load API の任意のパラメーターを使用して、期待される CRC 値を渡すことです。提供した場合、ロードシステムはアセットバンドルの非圧縮コンテンツのチェックサムをロード前に計算します。アセットバンドルの CRC が提供された CRC と一致しない場合、アセットバンドルはロードされません。LZ4 で圧縮されたアセットバンドルの場合、ファイルを RAM に完全に解凍しなければならないため、コストがかかります。LZMA で圧縮されたアセットバンドルの場合、そもそもロード時にコンテンツを完全に解凍しなければならないため、CRC チェックの実行はそれほど大きな追加コストではありません。総合的に考えて、ロードのたびに整合性チェックを繰り返すのではなく、ファイルを取得してデバイスに保存するときに整合性チェックを 1 回実行することで CRC 計算のコストを回避するのが現実的かもしれません。
注意アセットバンドル圧縮を使用している場合は、他の一般的なハッシュアルゴリズム (md5 など) を使用してアセットバンドルファイルを検証しないでください。これは、アセットバンドルのコンテンツが変更されていなくても、Unity が再圧縮する場合があるためです。つまり、ファイルのコンテンツが実際は有効である場合に、ファイルのコンテンツのハッシュが変化する可能性があります。対照的に、アセットバンドルの CRC 値はその非圧縮コンテンツから計算され、バンドルが再圧縮されても変化しません。
ノート: Unity ビルドが計算して .manifest 内に保存するアセットバンドルハッシュは、アセットバンドルの完全なファイルコンテンツのハッシュではありません。アセットバンドルのバージョン値として使用することはできますが、ファイル破損の検出には適していません。
他のプレイヤーに配信するコンテンツ (User Generated Content、ユーザー生成コンテンツ) をユーザーがアップロードすることを許可している場合、不適切または悪意のあるコンテンツがないか、このデータを確認するのは開発者の責任です。ユーザーにアセットバンドルのバイナリファイルのビルドとアップロードを許可することは推奨しません。望ましいのは、ユーザーにソースアセットをアップロードしてもらい、開発者がユーザーのためにアセットバンドルのバイナリファイルをビルドすることです。これにより、悪意のあるコンテンツや不適切なコンテンツを手動および自動でフィルタリングすることが容易になります。また、Unity のバージョンが上がっても、必要に応じてアセットバンドルをリビルドすることができます。