Condividi tramite


Procedure consigliate per l'installazione di giochi online multiplayer massively

Questo articolo descrive la creazione di una catena di progettazione di trust per l'installazione client MMOG (Massively Multiplayer Online Games) e sistemi di aggiornamento di giochi personalizzati che funzionano bene con Windows e il modello di sicurezza di Windows Vista e Windows 7. L'approccio è progettato per abilitare l'applicazione di patch ai titoli MMOG, supportando account utente standard, con accesso limitato al disco rigido e al registro di sistema.

Perché i clienti MMOG hanno requisiti diversi per i giochi tradizionali acquistati al dettaglio

La natura costantemente connessa e in continua evoluzione degli MMOG lo rende un requisito fondamentale per fornire aggiornamenti regolari del codice client e contenuto per correggere le vulnerabilità di sicurezza ed estendere l'esperienza di gioco. Con il potenziale per gli aggiornamenti quasi giornalieri, lo scenario MMOG richiede un'attenta gestione per garantire un'esperienza intuitiva. Ciò differisce dal tradizionale modello di acquisto al dettaglio, in cui un numero ridotto di patch può essere fornito vicino alla data di spedizione al dettaglio del prodotto. La tecnologia di applicazione di patch utente limitata di Windows Installer fornita con il sistema operativo è progettata per gestire piccoli numeri di patch dell'applicazione e non la grande quantità e la frequenza elevata necessarie per gli MMOG. È quindi spesso necessario sviluppare sistemi di applicazione di patch personalizzati per soddisfare le esigenze di MMOG, inclusi eventuali requisiti speciali specifici per il particolare MMOG in fase di sviluppo.

Poiché molti computer sono connessi a Internet, Windows Vista e Windows 7 hanno restrizioni di sicurezza più severe e misure di sicurezza per gli utenti, che limitano l'accesso alle applicazioni a varie aree del disco rigido. A differenza di Windows XP, queste restrizioni sono abilitate per la modalità predefinita per gli account utente. Queste restrizioni devono essere prese in considerazione quando si progetta il layout di un gioco, di un file eseguibile e di dati e del sistema di applicazione di patch associato. Per altre informazioni sulle misure di sicurezza fornite dal sistema operativo, vedi Controllo dell'account utente per sviluppatori di giochi.

Panoramica di un approccio chain of trust

L'approccio di aggiornamento personalizzato presentato in questo white paper si basa sulla presenza di un'applicazione loader attendibile installata nella cartella programmi protetta mantenendo i file eseguibili e i dati dei giochi in un'area condivisa accessibile dall'utente. Una catena di attendibilità inizia con il caricatore che esegue controlli di validità sui file binari e sui dati del gioco prima dell'avvio.

catena di attendibilità inizia con un caricatore affidabile

Il caricatore attendibile deve avere una logica sufficiente per poter verificare che il file eseguibile del gioco e altri file binari non siano stati manomessi prima di avviare il gioco. Il caricatore può anche verificare i dati del gioco con la frequenza necessaria, ma le dimensioni dei dati del gioco sono in genere troppo grandi per consentirgli di essere controllate ogni volta in un singolo passaggio. Un approccio alternativo consiste nell'usare un modello di campionamento che garantisce che la verifica dell'intero set di dati venga eseguita in un lungo periodo di tempo. L'applicazione del caricatore può contenere un motore di applicazione di patch del gioco, che fornisce un metodo attendibile per integrare gli aggiornamenti con il gioco installato.

Tutto è convalidato sul server, perché dovrei preoccuparti se il mio client viene violato?

È impossibile considerare attendibile che il client non sia stato compromesso; pertanto è comune per i server MMOG convalidare tutti i dati ricevuti dal client. Anche se questa elaborazione può identificare i client di gioco compromessi o ingannati all'interno dell'universo del gioco, il server non può identificare facilmente tutti i problemi a cui il client del gioco può essere esposto. È importante rafforzare la protezione dagli hacker che desiderano usare il tuo client come piattaforma per gli attacchi sul tuo servizio, altri utenti o anche semplicemente come vettore per attaccare i computer client stessi. L'applicazione di tecniche di firma del codice e verifica dei dati può aiutare a rilevare i client compromessi prima di essere eseguiti. Poiché il meccanismo di applicazione di patch richiede l'esposizione di file binari eseguibili e DLL che non sono protetti dalle autorizzazioni standard di sola lettura per i file di programma, convalidare questi file prima di avviarli è importante per la sicurezza complessiva del sistema.

Questo modello non tenta di gestire lo scenario dell'utente amministratore dannoso in cui il caricatore stesso potrebbe diventare compromesso, ma si concentra sulla protezione degli utenti standard dall'esecuzione accidentale di codice manomesso. Le tecniche tradizionali di convalida client-server sono l'unica possibile mitigazione per gli amministratori di sistema client malintenzionati.

Costruzione dell'applicazione loader attendibile

Lettura in background

I lettori devono acquisire familiarità con la documentazione seguente, che fornisce informazioni dettagliate sulla tecnologia di base per garantire la procedura consigliata per l'attendibilità basata su software.

Firma del codice

Firma Authenticode per sviluppatori di giochi

SignTool

SignTool su MSDN

La sezione seguente descrive in dettaglio le API che devono essere usate per costruire l'applicazione del caricatore, che supportano il layout del disco per l'installazione e la verifica del controllo dell'attendibilità.

Installazione del caricatore attendibile e del patcher

Il caricatore attendibile e la versione di base dell'utilità patcher devono essere installati nella cartella Programmi protetti sull'HDD esattamente come nelle installazioni tradizionali. L'installazione e l'applicazione di patch dell'applicazione del caricatore richiedono diritti di amministratore, pertanto è importante ridurre al minimo la frequenza di aggiornamento per il caricatore per garantire che gli utenti finali non debbano elevare spesso i privilegi, anche se l'applicazione di patch utente limitate di Windows Installer potrebbe essere usata per evitare l'elevazione dei privilegi per le patch del caricatore.

Vedi l'articolo Patching Game Software in Windows XP, Windows Vista e Windows 7.

Installazione dei file eseguibili, delle DLL e dei dati del gioco

Per facilitare gli aggiornamenti degli utenti standard del gioco senza privilegi amministrativi, i giochi eseguibili, le DLL e i dati devono essere installati in un'area del disco rigido accessibile per tutti gli utenti. Il sistema operativo fornisce un'area "All Users Application Data" che può essere usata come percorso predefinito per l'installazione. SHGetFolderPath deve essere usato con la chiave CSIDL_COMMON_APPDATA per determinare il percorso del file per questa area. È importante che non vengano effettuate ipotesi sul percorso a cui restituisce questa chiave, perché può essere configurabile dall'utente.

L'installazione deve modificare o gestire le autorizzazioni per la cartella per ottenere l'accesso all-user-shared-write necessario per aggiornare il titolo. Con le autorizzazioni corrette, la funzionalità di aggiornamento del gioco del programma di caricamento può facilmente applicare patch al gioco senza la necessità di privilegi speciali da qualsiasi account utente, inclusi i tempi di avvio da parte degli utenti standard.

Controllo di accesso codice di modifica dell'elenco

Per Windows XP, è necessario eseguire il codice per modificare manualmente l'elenco di controllo di accesso (ACL), di seguito è riportato un esempio di funzione che illustra come eseguire questa operazione:

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

Questo esempio di codice funzionerà anche per Windows Vista e Windows 7; Tuttavia, forniscono anche l'utilità della riga di comando icacls per modificare gli ACL di file che è possibile scegliere di usare.

Lo strumento fornisce una guida dettagliata quando viene eseguita, tuttavia, un esempio di utilizzo per lo strumento è:

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

Questo utilizzo consentirà all'utente Rex Delete and Write DAC autorizzazioni per la cartella del gioco archiviata nelle aree Tutti gli utenti del disco rigido.

Installazioni per utenti avanzati

Per scenari di installazione utente avanzati, un utente può voler specificare manualmente il percorso di installazione dei giochi. La selezione della directory deve essere limitata a uno all'esterno dei file di programma per garantire che la cartella si trova in un'area realmente condivisibile del disco rigido. Il percorso selezionato dall'utente deve essere usato solo per i giochi exe e i dati perché il caricatore e gli exe patcher del gioco devono essere sempre installati nella cartella programmi sicura per una maggiore sicurezza.

Verifica dell'attendibilità del caricatore

Windows fornisce la funzione WinVerifyTrust per verificare la validità del codice firmato ed è basata sui servizi di crittografia nel sistema operativo. La funzione è completamente documentata su MSDN: Funzione WinVerifyTrust .

Per altre informazioni sull'uso della funzione per determinare se un eseguibile del programma è firmato con un certificato valido, vedere Esempio di programma C: Verifica della firma di un file PE.

Ai fini della verifica dell'attendibilità dell'esecuzione del file eseguibile del gioco firmato dall'interno del caricatore, l'azione Verifica generica sarà sufficiente:

Valore

WINTRUST_ACTION_GENERIC_VERIFY_V2

Significato

Verificare un file o un oggetto usando il provider di criteri Authenticode.

La funzione accetta un argomento della struttura di input che contiene informazioni necessarie al provider di attendibilità per elaborare l'azione specificata. In genere, come nel caso di esempio precedente, la struttura include informazioni che identificano l'oggetto che il provider di attendibilità deve valutare.

Il formato della struttura è specifico dell'identificatore di azione. Per altri dettagli su una struttura di esempio per il provider WinTrust, vedere WINTRUST_DATA Structure.

Se il provider di attendibilità verifica che l'oggetto sia attendibile per l'azione specificata, il valore restituito è zero. Nessun altro valore oltre zero deve essere considerato un risultato positivo.

Convalida dei dati

Il meccanismo di progettazione condivisa supporta solo la firma di alcuni tipi specifici di file, inclusi file eseguibili, DLL, pacchetti di Windows Installer (file .msi) e file CAB (.cab). L'API WinVerifyTrust non deve essere usata per verificare che i file di dati di grandi dimensioni (ad esempio .cab file) non siano stati manomessi, perché esistono alcuni problemi con le prestazioni e la stabilità durante la convalida di file di grandi dimensioni. I file eseguibili del programma tendono a essere sufficientemente piccoli per un controllo di attendibilità totale che si verifica usando il provider WinTrust, ma i file di dati per i giochi sono spesso dell'area di autenticazione di molti gigabyte di dimensioni. L'approccio adottato dal caricatore per la verifica dei dati del gioco deve essere quello in cui viene testato un piccolo campione del set di dati nel tempo di esecuzione del gioco. Questo approccio distribuisce il costo dei test di verifica durante la vita dell'esperienza di gioco e può offrire un'esperienza utente senza tempi di attesa lunghi. A tale scopo, potrebbe essere necessaria un'attenta organizzazione dei dati. Alcuni MMOG usano un approccio al database per gestire, gestire e verificare la correttezza degli asset di gioco nel tempo.

Dal punto di vista della sicurezza, il codice client deve essere progettato per non considerare attendibili i file di dati anche se si usa un certo tipo di convalida dei dati di base con il caricatore attendibile. È consigliabile impiegare controlli di intestazione, hash e altri controlli di integrità tradizionali. Il lavoro per rafforzare il codice di I/O del client deve essere eseguito anche usando tecniche come i test fuzz e sfruttando strumenti di analisi statica automatica, ad esempio l'opzione /analyze in Visual Studio 2005 e Visual Studio 2008 (disponibile in Visual Studio Team System e il compilatore gratuito fornito con Windows SDK).

Per altre informazioni sulla sicurezza software, vedere Procedure di sicurezza consigliate per lo sviluppo di giochi.