大規模なマルチプレイヤー オンライン ゲームのインストール実践ガイド
ゲーム ディベロッパー グループ、ソフトウェア開発エンジニア
ソフトウェア デザイン エンジニア、Jason Sandlin 共著
2007 年 2 月
このドキュメントでは、MMOG クライアント インストールとカスタム ゲーム更新システムを対象にした信頼チェーン設計の作成について説明します。この信頼チェーン設計は、Windows オペレーティング システムと新しい Windows Vista セキュリティ モデルで適切に機能します。この手法は、ハードディスクとシステム レジストリへのアクセスが制限されている標準のユーザー アカウントに対して、MMOG タイトルへの修正プログラムの適用をサポートするように設計されています。
MMOG クライアントの要件が従来の市販ゲームと異なる理由
MMOG は、常時接続され、絶えず拡張される性質があるため、クライアント コードとコンテンツの定期更新プログラムを提供し、セキュリティ上の脆弱性を修正してゲームプレイの満足度を向上させることが基本要件となります。MMOG では、ほぼ毎日更新プログラムが提供される可能性があるため、ユーザー環境における使いやすさ損なわないように慎重な管理が必要です。これは、製品の発売日直後に少数の修正プログラムが必要に応じて提供される従来の市販モデルとは異なります。オペレーティング システムでサポートされている Windows インストーラーの制限付きユーザー修正プログラム適用テクノロジは、少数のアプリケーション修正プログラムを処理することを目的として設計されており、MMOG で必要となる多数の頻繁な修正プログラム用には設計されていません。多くの場合は、MMOG の要求に対応するために、カスタムの修正プログラム適用システムの開発が必要になります。これには、開発中の MMOG 固有の要件も含まれます。
インターネットに接続された PC の普及を受けて、Windows Vista を使用したコンピューティング環境のセキュリティを強化するために、オペレーティング システム側では、ユーザーに対するより厳しいセキュリティ制約と安全対策を通じて、ハードディスクのさまざまな領域に対するアプリケーション コードのアクセス権を制限しています。Windows XP とは異なり、これらの制限は、ユーザー アカウントの既定モードで有効になっています。これらの制約事項は、ゲームの実行可能ファイルとデータ、および関連する修正プログラム適用システムの配置場所を決定する際に考慮に入れる必要があります。オペレーティング システム側で用意されているセキュリティ対策の詳細については、「ゲーム開発者向けのユーザー アカウント制御」を参照してください。
信頼チェーン手法の概要
このホワイトペーパーで紹介するカスタム更新の手法を使用するためには、保護された Program Files フォルダーに信頼できるローダー アプリケーションをインストールする一方で、ゲームの実行可能ファイルとデータをすべてのユーザーがアクセスできる共有領域に配置する必要があります。信頼チェーンの起点となるのは、ゲームのバイナリ ファイルとデータを起動前に検証するローダーです。
この信頼できるローダーには、ゲームの実行可能ファイルと他のバイナリ ファイルが改ざんされていないことをゲームの起動前に確認するための十分なロジックが組み込まれている必要があります。このローダーは、ゲーム データも必要な頻度で確認する場合がありますが、通常は、ゲーム データのサイズが大きすぎて、単一パスで毎回確認することはできません。代替の方法として、サンプリング パターンを使用することで、データ セット全体の確認を長時間かけて徐々に実行できます。ローダー アプリケーションには、ゲーム修正プログラム適用エンジンを含めることができます。このエンジンは、更新プログラムをインストール済みゲームと統合することによって、信頼できる方法を実現します。
サーバー上ですべてのデータが検証されてもクライアントがハッキングされる危険性
クライアントのセキュリティが侵害されていないという確証はないため、一般に MMOG サーバーはクライアントから受信されたすべてのデータを検証します。この処理によって、ゲーム空間内のセキュリティが侵害されたゲーム クライアントや不正行為を行っているゲーム クライアントを特定できますが、サーバーは、ゲーム クライアントが遭遇する可能性のあるすべての問題を簡単に特定することはできません。重要なことは、ユーザーのクライアントを攻撃の起点として悪用しようとするハッカーに対する防御を強化することです。攻撃対象としては、サービス、他のユーザー、さらにはクライアント コンピューター自体が考えられます。コード署名とデータ検証の技法を活用することで、セキュリティが侵害されたクライアントを実行する前に検出しやすくなります。修正プログラム適用メカニズムは、標準の読み取り専用アクセス許可によって保護されていない Program Files の実行可能ファイルと DLL バイナリ ファイルにアクセスする必要があるため、これらのファイルを実行前に検証することは、システム全体のセキュリティを保護するために重要です。
このモデルでは、悪意のある管理者ユーザーが存在するケース (この場合はローダー自体のセキュリティが侵害された場合) に対処することは想定しておらず、標準のユーザーが改ざんされたコードを誤って実行することの防止に重点を置いています。従来のサーバー/クライアント型の検証技法は、悪意のあるクライアント システム管理者に対して唯一可能な抑制策です。
信頼できるローダー アプリケーションの作成
参考情報
次のホワイト ペーパーを参照して、ソフトウェアによる信頼を実現する基盤テクノロジについての詳細情報を確認してください。
次のセクションでは、ローダー アプリケーションを作成し、インストールのディスク レイアウトと信頼チェックの検証をサポートするために使用する API について説明します。
信頼されたローダーと修正プログラム適用ツールのインストール
信頼されたローダーと基本バージョンの修正プログラム適用ユーティリティは、従来のインストールと同じように、ハード ディスク上の保護された Program Files フォルダーの下にインストールする必要があります。ローダー アプリケーションのインストールと修正プログラム適用には管理者権限が必要なため、ローダーの更新頻度を最小限に抑えて、エンド ユーザーが頻繁に管理者権限を取得する必要をなくすことが重要です。ただし、Windows インストーラーの制限付きユーザー修正プログラム適用機能を使用すれば、管理者権限を取得することなくローダーの修正プログラムを適用できます。
「Windows XP および Windows Vista でのゲーム ソフトウェアの修正プログラムの適用」を参照してください。
ゲームの実行可能ファイル、DLL、およびデータのインストール
標準ユーザーが管理者特権を取得することなくゲームの更新プログラムを適用できるようにするには、すべてのユーザーが書き込み可能なハード ディスク領域にゲームの実行可能ファイル、DLL、およびデータをインストールする必要があります。オペレーティング システムでは、既定のインストール場所として使用できる "すべてのユーザーのアプリケーション データ" というフォルダーが用意されています。https://msdn2.microsoft.com/en-us/library/bb762181.aspx API を CSIDL_COMMON_APPDATA キーと共に使用して、この領域のファイル パスを特定する必要があります。このキーによって返される場所のパスはユーザーが設定可能なので、このパスを推定することは避けてください。
ゲーム タイトルを更新するために、全ユーザーへの書き込みアクセスの許可を有効にするには、インストールでこのフォルダーのアクセス許可を変更または管理する必要があります。適切なアクセス許可があれば、ローダー プログラムのゲーム更新機能によって、特別な特権を必要とすることなく、任意のユーザー アカウントからゲームの修正プログラムを簡単に適用できます (標準ユーザーによってゲームが起動される場合を含む)。
アクセス制御リストの変更コード
Windows XP の場合は、アクセス制御リスト (ACL) を変更するためのコードを手動で実行する必要があります。次のサンプル関数では、この処理を実行する方法を示しています。
HRESULT ChangeACLtoAllowUserRW( WCHAR* strDir )
{
EXPLICIT_ACCESS explicitaccess;
PACL NewAcl = NULL;
DWORD dwError;
BuildExplicitAccessWithName( &explicitaccess, L"BUILTIN\\Users",
GENERIC_ALL, GRANT_ACCESS,
SUB_CONTAINERS_AND_OBJECTS_INHERIT );
dwError = SetEntriesInAcl( 1, &explicitaccess, NULL, &NewAcl );
if( dwError == ERROR_SUCCESS)
{
dwError = SetNamedSecurityInfo( strDir, SE_FILE_OBJECT,
DACL_SECURITY_INFORMATION,
NULL, NULL, NewAcl, NULL );
if( dwError == ERROR_SUCCESS)
{
if( NewAcl != NULL ) AccFree( NewAcl );
return S_OK;
}
}
if( NewAcl != NULL ) AccFree( NewAcl );
return E_FAIL;
}
このサンプル コードは Windows Vista にも対応していますが、代わりに Windows Vista に付属している icacls というコマンド ライン ユーティリティを使用して ACLS ファイルを編集することもできます。
このツールの実行時には詳細なヘルプ情報を表示できます。次にこのツールの使用例を示します。
icacls "C:\Users\All Users\Game" /grant Rex:(D,WDAC)
この使用例では、Rex というユーザーに、ハードディスクの All Users 領域に配置されたゲーム フォルダーに対する削除と書き込みの DAC アクセス許可が与えられます。
経験を積んだユーザー向けのインストール
経験を積んだユーザーがインストールする場合は、ゲームのインストール パスを手動で指定する場合もあります。選択できるディレクトリを Program Files フォルダー外のディレクトリに制限して、そのディレクトリがハードディスクの完全に共有可能な領域に配置されるようにする必要があります。ゲームのローダーと修正プログラム適用ツールの exe ファイルは、セキュリティを高めるために、セキュリティで保護された Program Files フォルダー下に常にインストールする必要があるため、ユーザーが選択するパスは、ゲームの exe ファイルとデータのみにする必要があります。
ローダーの信頼確認
Windows は、署名済みコードの有効性を確認するための WinVerifyTrust API をサポートしており、この API はオペレーティング システム内の暗号化サービスを使用します。この API の詳細については、関連する MSDN ページを参照してください (https://msdn2.microsoft.com/en-us/library/aa388208.aspx)。
次のリンク先のサンプルでは、この API を使用して、プログラムの実行可能ファイルが有効な証明書で署名されているかどうかを確認する方法を説明しています。
https://msdn2.microsoft.com/en-us/library/aa382384.aspx
署名付きのゲーム実行可能ファイルが、ローダー内から実行しても問題ないものとして信頼できることを確認するには、通常の検証処理を実行するだけで十分です。
- 値
WINTRUST_ACTION_GENERIC_VERIFY_V2 - 意味
Authenticode ポリシー プロバイダーを使用してファイルまたはオブジェクトを確認します。
この関数は、信頼プロバイダーが指定された操作を処理するために必要な情報を含んだ、入力構造体引数を受け取ります。一般に、上記のサンプル ケースのように、この構造体には、信頼プロバイダーが評価する必要のあるオブジェクトを識別するための情報が含まれています。
この構造体の形式は、操作識別子によって異なります。WinTrust プロバイダーのサンプル構造体については、https://msdn2.microsoft.com/en-us/library/aa388205.aspx の Web サイトを参照してください。
信頼プロバイダーによって、オブジェクトが指定された操作に対して信頼できることが確認された場合は、戻り値は 0 になります。戻り値が 0 以外の場合は、そのオブジェクトは信頼できないと見なす必要があります。
データ検証
コード署名メカニズムがサポートしているのは、実行可能ファイル、DLL、Windows インストーラー パッケージ (.msi ファイル)、キャビネット (.cab) ファイルなど、いくつかの特定タイプのファイルの署名のみです。WinVerifyTrust API は、大きなデータ ファイル (.cab ファイルなど) の改ざんの有無を確認するために使用しないでください。これは、大きいファイルの検証時には、パフォーマンスと安定性が低下するためです。プログラムの実行可能ファイルは一般に小さいため、WinTrust プロバイダーを使用して完全な信頼チェックを適用してもパフォーマンスに影響はありませんが、ゲームのデータ ファイルは数ギガバイトのサイズに及ぶことがよくあります。ローダーでゲーム データを確認する方法の 1 つには、データセットのごく一部をゲームの実行時にテストすることです。この方法では、確認テストの負荷がゲームのプレイ時間全体にわたって分散されるため、長い待ち時間が発生することなく、ユーザーはテストを意識せずにゲームをプレイできます。このためには、データを慎重に編成することが必要になる場合があります。一部の MMOG は、データベースの手法で、長期に渡るゲーム アセットの管理、保守、および正確性の検証を支援しています。
セキュリティの観点からは、信頼されたローダーによる基本的なデータ検証機能を使用している場合でも、クライアント コードはデータ ファイルを信頼しないように設計する必要があります。ヘッダー チェックやハッシュなどの従来の整合性チェック手法を採用する必要があります。"ファズ テスト" などの技法を使用したり、Visual Studio 2005 の /analyze スイッチなどの自動静的コード解析ツールを活用したりして、クライアントの入出力コードのセキュリティを強化する必要もあります (このスイッチは Visual Studio Team System、および Windows SDK に付属しているフリー コンパイラで使用できます)。
詳細については、「ゲーム開発でのベスト セキュリティ プラクティス」を参照してください。