Webplayer リリースチャネル
Webplayer のセキュリティサンドボックス

Web Player のトラストチェーンを使用する

このセクションでは強力にネーミングされたアセンブリを作成して使用して、Javascript と連携させ自身のカスタムバックエンドと連動する方法を、学びます。

信頼の連鎖は外部のインターネットアプリケーションを許可して、Unity Web Player から生成されたリクエストを信頼します。これは完全な機能を持った API を Unity Web Player でゲームを作成する Unity 開発者に提供したい場合は便利です。信頼の連鎖を使用するためにリクエストを受付するバックエンドのインターネットアプリケーションが必要であり、もっとも一般的な例は REST API を使用した Web アプリケーションです。インターネットアプリケーションをコールするためのマネージド C# アセンブリのコードを保有している必要があります。

キーペアの生成

信頼の連鎖を確立する最初のステップはアセンブリを署名するのに必要な暗号化されたキーペアを作成することです。この作業は Windows、OS X や Linux 上で SN ツールを使用して行います。

  1. 新しいキーペアを作成するにはコマンドラインを開き、次のとおりに入力します。

    sn -k myNewKey.snk

  2. myNewKey.snk を、自身が適切と考える名前で置き換えます。ファイル名は信頼の連鎖の観点では何でもかまいません。

  3. .SNK ファイルを保持します。このファイルが漏洩したり、悪意のある開発者であればアセンブリを解析する可能性があります。

アセンブリの署名

次に生成したキーペアを使用して自身のマネージド C# アセンブリ(バックエンドの呼び出しに使用するもの)を署名します。Windows、OS X や Linux に含まれる al ツールを使用する必要があります。

アセンブリの署名は簡単なプロセスです。

  1. コマンドラインターミナルを開き、マネージド C# アセンブリへと移動し、次のとおりに入力します。

    al /out:mySignedAssembly.dll myUnsignedAssembly.dll /keyfile:myNewSky.snk

  2. mySignedAssembly.dll は希望する自身の最終的なアセンブリ名です。

  3. myUnsignedAssembly.dll は自身の通常の、署名していないマネージド C# アセンブリです。

  4. myNewKey.snk は自身の暗号化されたキーペアファイルです。

  5. al が一回実行完了すると、自身の署名されたアセンブリは準備完了となります。Unity プロジェクト上にドロップして信頼の連鎖に使用します。

秘密事項のインジェクト

Unity Web Player には Unity ゲームが読み込まれた後にいつでも秘密事項をインジェクトできます。これは Javascript オブジェクトの UnityObject2 で公開されている Javascript の SendMessage により実現できます。

特定のゲームオブジェクトに特有の形式のメッセージを渡すとき信頼の連鎖は秘密事項をインジェクトしたいことを検知してメッセージをインターセプトします。このシステムを使用するのにゲームオブジェクトをリネームする必要はまったくありません。u と呼ばれる UnityObject2 インスタンスによる Javascript コールは。

 u.GetUnity().SendMessage("ChainOfTrust_SetValueASDF", ".", "name=mySecretDataName;value=mySecretValue;publickey=publicKeyTokenOfMyAssembly"); 


* 対象となるゲームオブジェクト名
* 実行するメソッド名
* String の引数
  • 信頼の連鎖によりメソッドの名前は完全に無視されます。ターゲットゲームオブジェクトの名前は ChainOfTrust _SetValue で始める必要があり、しかしながら ChainOfTrust_ SetValue の後に記述した文字列は安全に無視できます。

  • 文字列の引数の形式は非常に重要です。信頼の連鎖はセミコロンにより三段階に分かれています。確認される内容は。
    • 名前
    • 公開鍵 大文字小文字は重要です。これらのキーワードは小文字とすることが必須であり、その後続に等号記号 (=) が必須です。
  • 秘密事項には任意の name を適用できます。先の例では mySecretDataName を上記サンプル上で置き換えます。

  • value は共有鍵や信頼の連鎖に格納する他の秘密事項です。具体的にこの値に何を格納するかは固有のアプリケーションに特有です。先の例では mySecretDataValue を上記サンプル上で置き換えます。

  • publickey はマネージド C# アセンブリを署名した公開鍵のトークンです。sn ツールを使用して、署名したアセンブリ上で見つけることができます。

    sn -T mySignedAssembly.dll

公開鍵のトークンを前後に空白スペースなしに複製し、先の例では myPublicKeyToken を上記サンプル上で置き換えます。

  • バーチャルゲームオブジェクトの名前にランダムなデータを付加します。Web Player を使用するすべての人が最新の Web Player ランタイムを持っていることを保証する方法はないため、すべての Web Player が SendMessage コールをインターセプトするとはかぎりません。もし悪意のある開発者が Javascript をみて、バーチャルゲームオブジェクトと使用している関数をみると同じ名前でそのメソッドを実装した Unity ゲームオブジェクトを作成することができます。この特定のケースで悪意のある開発者のコードは最新でないバージョンの Web Player で動作して、共有の秘密事項をインターセプトして望まれないコールをバックエンドに対して実行するかもしれません。ゲームオブジェクトの名前をランダムにすることで誰かに信頼の連鎖を古いランタイムでインターセプトすることが難しくなります。

自身の秘密事項を受け取る

Unity Web Player に秘密事項をインジェクトした後は、暗号化署名された (“強い名前の”) マネージド C# アセンブリをマッチングふる公開鍵のトークンによってのみ受け取ることができます。

  • マネージド C# アセンブリは Security.GetChainOfTrustValue をコールして秘密事項を受け取る必要があります。GetChainOfTrustValue では、payload の name= 構文で、秘密事項の名前を渡す必要があります。

  • GetChainOfTrustValue は秘密事項の値をクリアテキストとして戻し、アセンブリの中でそれを使用することができます。

  • インジェクション payload において name=mySecret;value=superSecretData;publickey=A92181sn828O とすると、マネージド C# アセンブリの中で秘密事項を受け取るコードは。

    string myValue = Security.GetChainOfTrustValue(“mySecret”);

  • 秘密事項の値をセキュアにするために多くの苦労をしているため、秘密事項の値はマネージド C# アセンブリの外にあるなんらかの関数やコードに渡すべきではありません。

  • 署名されてないコードから Security.GetChainOfTrustValue をコールするための試行や署名されたアセンブリでシグニチャが秘密事項の指定された公開鍵とマッチングしないコードからの試行は、ログ上でエラーが記録されて、Security.GetChainOfTrustValue は空白の文字列を戻します。

  • SendMessage 関数は標準的な MonoBehaviour/SendMessage 関数と似通っている。3 つの名目の引数をとる。

Webplayer リリースチャネル
Webplayer のセキュリティサンドボックス