大量多人遊戲在線遊戲的安裝最佳做法
本文說明為大量多人遊戲在線遊戲 (MMOG) 用戶端安裝和自定義遊戲更新系統建立信任設計鏈結,這些系統適用於 Windows 以及 Windows Vista 和 Windows 7 的安全性模型。 這種方法旨在啟用 MMOG 標題的修補,同時支援標準使用者帳戶,這些用戶帳戶具有硬碟和系統登錄的限制存取權。
為什麼 MMOG 客戶對傳統零售購買的遊戲有不同的需求
MMOG 不斷連線和不斷演進的本質,是提供用戶端程式代碼和內容的定期更新,以修正安全性弱點並擴充遊戲體驗的基本需求。 由於幾乎每日更新的可能性,MMOG 案例需要謹慎的管理,以確保用戶易用的體驗。 這與傳統的零售購買模型不同,其中少數修補程式可能提供接近產品的零售船舶日期。 操作系統所提供的 Windows Installer 有限使用者修補技術是設計來處理少量的應用程式修補程式,而不是 MMOG 所需的大量和高頻率。 因此,需要開發自定義修補系統來解決 MMOG 的需求,包括開發中特定 MMOG 特有的任何特殊需求。
由於許多計算機都連線到因特網,所以 Windows Vista 和 Windows 7 對使用者具有更嚴格的安全性限制和保護,因此會限制應用程式必須存取硬碟的各個區域。 與 Windows XP 不同,這些限制會針對使用者帳戶的預設模式啟用。 設計遊戲配置、可執行檔和數據及其相關聯的修補系統時,必須考慮這些限制。 如需操作系統所提供之安全性措施的詳細資訊,請參閱 遊戲開發人員的用戶帳戶控制。
信任鏈結概觀
本白皮書中顯示的自定義更新方法是以將可信任的載入器應用程式安裝到受保護的 Program Files 資料夾為基礎,同時將遊戲可執行檔和數據保留在共用的所有使用者可存取區域中。 信任鏈結會從載入器開始,在啟動前對遊戲二進位檔和數據執行有效性檢查。
值得信任的載入器必須有足夠的邏輯,才能驗證遊戲的可執行檔和其他二進位檔在啟動遊戲之前尚未遭到竄改。 載入器可能也會視需要定期驗證遊戲數據,不過,遊戲數據的大小通常太大,所以每次在單一階段時都會加以檢查。 替代方法是使用取樣模式,以確保整個數據集的驗證會在一段較長的時間內進行。 載入器應用程式可能包含遊戲修補引擎,藉由整合更新與已安裝的遊戲,以提供值得信任的方法。
伺服器上會驗證所有項目,為什麼我應該擔心我的用戶端遭到駭客攻擊?
無法信任用戶端未遭入侵;因此,MMOG 伺服器通常會驗證從用戶端接收的所有數據。 雖然此處理可以識別遊戲宇宙中遭入侵或作弊的遊戲用戶端,但伺服器無法輕易識別遊戲用戶端可以公開的所有問題。 請務必加強駭客的保護,他們想要使用您的用戶端作為攻擊您服務、其他使用者,甚至只是攻擊客戶端計算機本身的媒介。 程式代碼簽署和數據驗證技術的套用有助於在用戶端執行之前偵測遭入侵的用戶端。 由於修補機制需要公開不受 Program Files 標準唯讀許可權保護的可執行檔和 DLL 二進位檔,因此在啟動這些檔案之前驗證這些檔案對於整體系統安全性而言很重要。
此模型不會嘗試處理載入器本身可能遭到入侵的惡意系統管理員使用者案例,但著重於保護標準使用者免於意外執行竄改的程序代碼。 傳統伺服器客戶端驗證技術確實是惡意客戶端系統管理員唯一可能的風險降低。
建構 Trust-Worthy Loader 應用程式
背景閱讀
讀者應該熟悉下列檔,其中提供基礎技術的詳細數據,以確保軟體型信任的最佳做法。
-
程式代碼簽署
-
SignTool
下一節詳述應該用來建構載入器應用程式的API,其支援磁碟配置來安裝和驗證信任檢查。
安裝受信任的載入器和修補程式
受信任的載入器和基底版本的修補程式公用程式應該安裝在 HDD 上的受保護 Program Files 資料夾下,就像傳統安裝一樣。 載入器應用程式的安裝和修補需要系統管理員許可權,因此請務必將載入器更新的頻率降到最低,以確保終端使用者不需要經常提高許可權,雖然 Windows Installer 有限的使用者修補可用來避免提升載入器修補程式。
請參閱在 Windows XP、Windows Vista 和 Windows 7 中修補遊戲軟體一文。
安裝遊戲可執行檔、DLL 和數據
為了方便沒有系統管理許可權的遊戲標準使用者更新,遊戲可執行檔、DLL 和數據必須安裝到可供所有使用者存取的硬碟區域。 操作系統提供「所有使用者應用程式數據」區域,可作為安裝的預設位置。 SHGetFolderPath 應該與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 7;不過,它們也會提供命令行公用程式 icacls 來編輯您可能會選擇改用的 ACLS 檔案。
不過,此工具會在執行時提供詳細的說明,工具的其中一個範例使用方式如下:
icacls "C:\Users\All Users\Game" /grant Rex:(D,WDAC)
此使用方式會將 Rex Delete 和 Write DAC 許可權授與儲存在硬碟之 [所有使用者] 區域中的遊戲資料夾。
進階用戶的安裝
針對進階使用者安裝案例,使用者可能想要手動指定遊戲安裝路徑。 目錄選取範圍應限制在程式檔外部的其中一個,以確保資料夾位於硬碟的真正可共用區域中。 用戶選取的路徑應該只用於遊戲 exes 和數據,因為遊戲 Loader 和 Patcher exes 應該一律安裝在安全 Program Files 資料夾下,以提升安全性。
載入器的信任驗證
Windows 提供 WinVerifyTrust 函式來檢查已簽署程式代碼的有效性,並且以操作系統中的密碼編譯服務為基礎。 函式已完整記載於 MSDN: WinVerifyTrust 函式。
如需使用 函式來判斷程式可執行檔是否使用有效憑證簽署的詳細資訊,請參閱 範例 C 程序:驗證 PE 檔案的簽章。
為了驗證已簽署的遊戲可執行檔是否值得在載入器內執行,一般驗證動作就已足夠:
-
價值
-
WINTRUST_ACTION_GENERIC_VERIFY_V2
-
意義
-
使用 Authenticode 原則提供者驗證檔案或物件。
函式會採用輸入結構自變數,其中包含信任提供者處理指定動作所需的資訊。 一般而言,如同上述範例案例,結構包含資訊,可識別信任提供者必須評估的物件。
結構的格式是動作標識元特有的。 如需 WinTrust 提供者範例結構的詳細資訊,請參閱 WINTRUST_DATA Structure。
如果信任提供者驗證主體是否信任指定的動作,則傳回值為零。 除了零之外,沒有其他值應該視為成功的傳回。
資料驗證
程式代碼簽署機制僅支持簽署一些特定類型的檔案,包括可執行檔、DLL、Windows Installer 套件(.msi檔案),以及封包(.cab) 檔案。 WinVerifyTrust API 不應該用來驗證大型數據檔(例如.cab檔案)尚未遭到竄改,因為驗證非常大的檔案時效能和穩定性有一些問題。 程式可執行檔通常夠小,以便使用 WinTrust 提供者進行完全信任檢查,但遊戲的數據檔通常屬於許多 GB 大小的領域。 載入器為驗證遊戲數據所採取的方法應該是一個範例,其中一小部分的數據集範例會在遊戲運行時間進行測試。 這種方法會將驗證測試的成本分散到遊戲體驗的生命週期中,而且可以提供順暢的用戶體驗,而不需要長時間等候。 若要達成此目的,可能需要仔細組織數據。 某些 MMOG 採用資料庫方法來協助管理、維護和驗證遊戲資產經過一段時間的正確性。
從安全性的觀點來看,用戶端程式代碼應該設計成不信任數據檔,即使對受信任的載入器使用某種基本數據驗證也一樣。 應該採用標頭檢查、哈希和其他傳統完整性檢查。 若要強化用戶端的 I/O 程式代碼,也應該使用模糊測試等技術,以及利用自動靜態程式代碼分析工具,例如 Visual Studio 2005 和 Visual Studio 2008 中的 /analyze 參數(可在 Visual Studio Team System 中取得,以及隨附於 Windows SDK 的免費編譯程式)。
如需軟體安全性的詳細資訊,請參閱 遊戲開發中的最佳做法。