Bewährte Methoden für die Installation von Massively Multiplayer Online Games

In diesem Artikel wird die Erstellung einer Vertrauenskette für die MmOG-Clientinstallation (Massively Multiplayer Online Games) und benutzerdefinierte Spieleupdatesysteme beschrieben, die gut mit Windows und dem Sicherheitsmodell von Windows Vista und Windows 7 funktionieren. Der Ansatz wurde entwickelt, um das Patchen von MMOG-Titeln zu ermöglichen, während Standardbenutzerkonten unterstützt werden, die eingeschränkten Zugriff auf die Festplatte und die Systemregistrierung haben.

Warum MMOG-Clients unterschiedliche Anforderungen an traditionelle gekaufte Spiele haben

Die ständig verbundene und sich entwickelnde Natur von MMOGs macht es eine grundlegende Anforderung, regelmäßige Updates von Clientcode und Inhalten bereitzustellen, um Sicherheitsrisiken zu beheben und die Spielerfahrung zu erweitern. Mit dem Potenzial für fast tägliche Updates erfordert das MMOG-Szenario eine sorgfältige Verwaltung, um eine benutzerfreundliche Erfahrung zu gewährleisten. Dies unterscheidet sich von dem herkömmlichen Einzelhandelskaufmodell, bei dem eine kleine Anzahl von Patches in der Nähe des Lieferdatums des Produkts bereitgestellt werden kann. Die mit dem Betriebssystem bereitgestellte eingeschränkte Benutzer-Patching-Technologie von Windows Installer ist für die Verarbeitung kleiner Anwendungspatches und nicht für die große Menge und hohe Häufigkeit vorgesehen, die von MMOGs benötigt wird. Daher ist es häufig notwendig, dass benutzerdefinierte Patching-Systeme entwickelt werden, um die Bedürfnisse von MMOGs zu erfüllen, einschließlich aller speziellen Anforderungen, die speziell auf das zu entwickelnde MMOG zugeschnitten sind.

Da so viele Computer mit dem Internet verbunden sind, haben Windows Vista und Windows 7 strengere Sicherheitsbeschränkungen und Sicherheitsvorkehrungen für Benutzer, die den Zugriff einschränken, den Anwendungen auf verschiedene Bereiche der Festplatte haben. Im Gegensatz zu Windows XP sind diese Einschränkungen für den Standardmodus für Benutzerkonten aktiviert. Diese Einschränkungen müssen beim Entwerfen des Layouts eines Spiels, einer ausführbaren Datei und von Daten und dem zugehörigen Patching-System berücksichtigt werden. Weitere Informationen zu den vom Betriebssystem bereitgestellten Sicherheitsmaßnahmen finden Sie unter Benutzerkontensteuerung für Spieleentwickler.

Übersicht über eine Vertrauenskette

Der in diesem Whitepaper vorgestellte benutzerdefinierte Updateansatz basiert darauf, dass eine vertrauenswürdige Ladeprogrammanwendung im geschützten Ordner „Programme” installiert ist, während die ausführbaren Dateien und Daten der Spiele in einem freigegebenen Bereich für alle Benutzer zugänglich bleiben. Eine Vertrauenskette beginnt mit dem Ladeprogramm, das Gültigkeitsprüfungen für die Binärdateien und Daten des Spiels vor dem Start durchführt.

Vertrauenskette beginnt mit einem vertrauenswürdigen Ladeprogramm

Das vertrauenswürdige Ladeprogramm muss über genügend Logik verfügen, um sicherzustellen, dass die ausführbare Datei des Spiels und andere Binärdateien vor dem Starten des Spiels nicht manipuliert wurden. Das Ladeprogramm kann auch die Spieldaten so oft wie nötig überprüfen, aber die Größe der Spieldaten ist in der Regel zu groß, damit sie jedes Mal in einem einzigen Durchlauf überprüft werden kann. Ein alternativer Ansatz besteht darin, ein Sampling-Muster zu verwenden, das sicherstellt, dass die Überprüfung des gesamten Datasets über einen längeren Zeitraum erfolgt. Die Ladeprogrammanwendung kann eine Spiel-Patching-Engine enthalten, die eine vertrauenswürdige Methode bietet, indem Updates in das installierte Spiel integriert werden.

Was wird auf dem Server überprüft, warum sollte ich mich sorgen, wenn mein Client gehackt wird?

Es ist unmöglich zu vertrauen, dass der Client nicht kompromittiert wurde; Daher ist es üblich, dass MMOG-Server alle vom Client empfangenen Daten überprüfen. Während diese Verarbeitung kompromittierte oder betrügende Spielclients innerhalb des Spieluniversums erkennen kann, kann der Server nicht einfach alle Probleme identifizieren, denen der Spielclient ausgesetzt werden kann. Es ist wichtig, den Schutz vor Hackern zu stärken, die Ihren Client als Plattform für Angriffe auf Ihren Dienst, andere Benutzer oder sogar als Vektor für den Angriff auf die Clientcomputer selbst verwenden möchten. Die Anwendung von Codesignatur- und Datenüberprüfungstechniken kann dazu beitragen, kompromittierte Clients zu erkennen, bevor sie ausgeführt werden. Da der Patching-Mechanismus ausführbare und DLL-Binärdateien verfügbar macht, die nicht durch die standardmäßigen schreibgeschützten Berechtigungen für Programmdateien geschützt sind, ist die Überprüfung dieser Dateien vor dem Starten wichtig für die allgemeine Systemsicherheit.

Dieses Modell versucht nicht, sich mit dem Szenario eines böswilligen Administratorbenutzers zu befassen, in dem das Ladeprogramm selbst kompromittiert werden könnte, sondern konzentriert sich auf den Schutz von Standardbenutzern vor versehentlichem Ausführen von manipuliertem Code. Herkömmliche Server-Client-Validierungstechniken sind wirklich die einzige mögliche Gegenmaßnahme für böswillige Clientsystemadministratoren.

Aufbau der Trust-Worthy Loader-Anwendung

Hintergrundlesevorgang

Leser sollten sich mit der folgenden Dokumentation vertraut machen, die Details zur Grundlagentechnologie enthält, um bewährte Methoden für softwarebasiertes Vertrauen zu gewährleisten.

Code Signing

Authenticode-Signierung für Spieleentwickler

SignTool

SignTool auf MSDN

Im folgenden Abschnitt werden die APIs beschrieben, die zum Erstellen der Ladeanwendung verwendet werden sollen, die das Disc-Layout für die Installation und Überprüfung der Vertrauensüberprüfung unterstützt.

Installation von Trusted Loader und Patcher

Das vertrauenswürdige Ladeprogramm und die Basisversion des Patcher-Programms sollten wie bei herkömmlichen Installationen unter dem geschützten Ordner „Programme” auf dem FESTPLATTENLAUFWERK installiert werden. Für die Installation und das Patchen der Ladeprogrammanwendung sind Administratorrechte erforderlich. Daher ist es wichtig, die Häufigkeit der Updates für den Ladevorgang so gering wie möglich zu halten, um sicherzustellen, dass die Endbenutzer nicht oft die Berechtigungsstufe erhöhen müssen, auch wenn das Patchen durch den Windows Installer mit eingeschränkten Benutzerrechten verwendet werden kann, um die Berechtigungsstufe für Ladepatches zu vermeiden.

Lesen Sie den Artikel Patching Game Software in Windows XP, Windows Vista und Windows 7.

Installation der ausführbaren Spieldateien, DLLs und Daten

Um Standardbenutzer-Updates des Spiels ohne administrative Rechte zu ermöglichen, müssen die ausführbare Datei, die DLLs und die Daten des Spiels in einem Bereich der Festplatte installiert werden, der für alle Benutzer zugänglich ist. Das Betriebssystem stellt einen Bereich „”Alle Benutzeranwendungsdaten” bereit, der als Standardspeicherort für die Installation verwendet werden kann. SHGetFolderPath sollte mit dem CSIDL_COMMON_APPDATA Schlüssel verwendet werden, um den Dateipfad für diesen Bereich zu bestimmen. Es ist wichtig, dass keine Annahmen über den Pfad getroffen werden, zu dem dieser Schlüssel zurückgegeben wird, da er vom Benutzer konfigurierbar sein kann.

Bei der Installation müssen die Ordnerberechtigungen geändert oder verwaltet werden, um den für die Aktualisierung des Titels erforderlichen Schreibzugriff für alle Benutzer mit Freigabe zu erhalten. Mit den richtigen Berechtigungen kann die Spielaktualisierungsfunktion des Ladeprogramms das Spiel problemlos patchen, ohne dass besondere Berechtigungen für ein Benutzerkonto erforderlich sind, auch wenn es von einem Standardbenutzer gestartet wird.

Änderungscode für Zugriffssteuerungslisten

Für Windows XP müssen Sie Code ausführen, um die Zugriffssteuerungsliste (Access Control List, ACL) manuell zu ändern. Hier ist eine Beispielfunktion, die dies veranschaulicht:

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;
}

Dieses Codebeispiel funktioniert auch für Windows Vista und Windows 7. Sie stellen jedoch auch das Befehlszeilenprogramm icacls zum Bearbeiten von Datei-ACLS bereit, die Sie stattdessen verwenden können.

Das Tool bietet jedoch eine detaillierte Hilfe bei der Ausführung, eine Beispielverwendung für das Tool ist:

icacls "C:\Users\All Users\Game" /grant Rex:(D,WDAC)

Diese Verwendung gewährt dem Benutzer Rex Delete- and Write DAC-Berechtigungen für den Spielordner, der in den Bereichen „Alle Benutzer” der Festplatte gespeichert ist.

Installationen für fortgeschrittene Benutzer

Für fortgeschrittene Benutzerinstallationsszenarien kann ein Benutzer den Installationspfad für Spiele manuell angeben. Die Verzeichnisauswahl sollte auf eine außerhalb der Programmdateien beschränkt werden, um sicherzustellen, dass sich der Ordner in einem wirklich frei zugänglichen Bereich der Festplatte befindet. Der vom Benutzer ausgewählte Pfad sollte nur für die Spiele exes und Daten verwendet werden, da die Spiel-Loader und -Patcher exes immer unter dem Ordner „Sichere Programme” installiert werden sollten, um eine bessere Sicherheit zu gewährleisten.

Überprüfung der Vertrauenseinstellung des Ladegeräts

Windows stellt die WinVerifyTrust-Funktion bereit, um die Gültigkeit des signierten Codes zu überprüfen und basiert auf den kryptografischen Diensten im Betriebssystem. Die Funktion ist vollständig auf MSDN dokumentiert: WinVerifyTrust-Function.

Weitere Informationen zur Verwendung der Funktion zum Bestimmen, ob eine ausführbare Programmdatei mit einem gültigen Zertifikat signiert ist, finden Sie unter Beispiel C-Programm: Überprüfen der Signatur einer PE-Datei.

Um zu überprüfen, ob die signierte ausführbare Datei des Spiels vertrauenswürdig ist und vom Loader ausgeführt werden kann, reicht die Aktion Generic Verify aus:

Wert

WINTRUST_ACTION_GENERIC_VERIFY_V2

Bedeutung

Überprüfen Sie eine Datei oder ein Objekt mithilfe des Authenticode-Richtlinienanbieters.

Die Funktion verwendet ein Eingabestrukturargument, das Informationen enthält, die der Vertrauensanbieter zum Verarbeiten der angegebenen Aktion benötigt. In der Regel enthält die Struktur, wie im vorherigen Beispielfall, Informationen, die das Objekt identifiziert, das der Vertrauensanbieter auswerten muss.

Das Format der Struktur ist spezifisch für den Aktionsbezeichner. Weitere Informationen zu einer Beispielstruktur für den WinTrust-Anbieter finden Sie unter WINTRUST_DATA-Struktur.

Wenn der Vertrauensanbieter überprüft, ob der Betreff für die angegebene Aktion vertrauenswürdig ist, ist der Rückgabewert null. Kein anderer Wert außer Null sollte als erfolgreiche Rückgabe betrachtet werden.

Datenprüfung

Der Codesigning-Mechanismus unterstützt nur das Signieren einiger bestimmter Dateitypen, einschließlich ausführbarer Dateien, DLLs, Windows Installer-Pakete (.msi Dateien) und CAB-Dateien (.cab). Die WinVerifyTrust-API sollte nicht verwendet werden, um zu überprüfen, ob große Datendateien (z. B. .cab Dateien) nicht manipuliert wurden, da beim Überprüfen sehr großer Dateien einige Probleme mit Leistung und Stabilität auftreten. Ausführbare Programmdateien sind in der Regel klein genug, um eine voll vertrauenswürdige Prüfung mithilfe des WinTrust-Anbieters durchzuführen, aber Datendateien für Spiele sind oft der Bereich von vielen Gigabyte groß. Der Ansatz, den der Lader für die Überprüfung der Spieldaten wählt, sollte darin bestehen, dass eine kleine Auswahl des Datensatzes während der Laufzeit des Spiels getestet wird. Dieser Ansatz verteilt die Kosten für Überprüfungstests über die Lebensdauer der Spielerfahrung und kann eine nahtlose Benutzererfahrung ohne lange Wartezeiten bieten. Um dies zu erreichen, ist möglicherweise eine sorgfältige Organisation der Daten erforderlich. Einige MMOGs verwenden einen Datenbankansatz, um die Korrektheit von Spielressourcen im Laufe der Zeit zu verwalten, zu verwalten und zu überprüfen.

Aus Sicherheitsgründen sollte der Clientcode so konzipiert sein, dass Datendateien nicht als vertrauenswürdig eingestuft werden, auch wenn eine Art grundlegende Datenüberprüfung mit dem vertrauenswürdigen Ladeprogramm verwendet wird. Headerüberprüfungen, Hashes und andere herkömmliche Integritätsprüfung sollten verwendet werden. Die Arbeit, um den E/A-Code des Clients zu härten, sollte auch mithilfe von Techniken wie fuzz-Tests sowie mit den Vorteilen der automatischen Analysetools für statischen Code wie der Switch /analyze in Visual Studio 2005 und Visual Studio 2008 (verfügbar in Visual Studio Team System und dem kostenlosen Compiler, der im Windows SDK enthalten ist) durchgeführt werden.

Weitere Informationen zur Softwaresicherheit finden Sie unter Bewährte Sicherheitsmethoden bei der Spieleentwicklung.