Condividi tramite


Gestione dell'impersonificazione del client nei driver UMDF

Questo argomento descrive come un driver di User-Mode Driver Framework (UMDF) accede alle risorse protette, a partire da UMDF versione 2.

I driver UMDF vengono in genere eseguiti con l'account LocalService e non possono accedere a file o risorse che richiedono credenziali utente, ad esempio file protetti o altre risorse protette. Un driver UMDF opera in genere su comandi e dati che passano tra un'applicazione client e un dispositivo. Pertanto, la maggior parte dei driver UMDF non accede alle risorse protette.

Tuttavia, alcuni driver potrebbero richiedere l'accesso a una risorsa protetta. Ad esempio, un driver UMDF potrebbe caricare il firmware in un dispositivo da un file fornito da un'applicazione client. Il file potrebbe avere un elenco di controllo di accesso (ACL) che impedisce agli utenti non autorizzati di modificare il file e assumere il controllo del dispositivo. Sfortunatamente, questo ACL impedisce anche al driver UMDF di accedere al file.

Il framework fornisce una funzionalità di impersonificazione che consente ai driver di impersonare il client del driver e ottenere i diritti di accesso del client alle risorse protette.

Abilitazione dell'impersonificazione

Sia il pacchetto di installazione del driver UMDF che l'applicazione client devono abilitare la funzionalità di rappresentazione del framework, come indicato di seguito:

  • Il file INF del pacchetto di installazione del driver UMDF deve includere la direttiva UmdfImpersonationLevel e impostare il livello massimo di rappresentazione consentito. La rappresentazione è abilitata solo se il file INF include la direttiva UmdfImpersonationLevel. Per ulteriori informazioni sull'impostazione del livello di rappresentazione, vedere Specificare le direttive WDF nei file INF.

  • L'applicazione client deve impostare il livello di impersonificazione consentito per ogni file handle. L'applicazione usa le impostazioni QoS (Quality of Service) nella funzione CreateFile di Microsoft Win32 per impostare il livello di rappresentazione consentito. Per altre informazioni su queste impostazioni, vedere il parametro dwFlagsAndAttributes di CreateFile nella documentazione di Windows SDK.

Gestione dell'impersonificazione per una richiesta di I/O

Il driver UMDF e il framework gestiscono l'impersonificazione per una richiesta di I/O nella seguente sequenza:

  1. Il driver chiama il metodo WdfRequestImpersonate per specificare il livello di rappresentazione richiesto e una funzione di callback EvtRequestImpersonate.

  2. Il framework controlla il livello di impersonificazione richiesto. Se il livello richiesto è maggiore del livello consentito dal pacchetto di installazione del driver UMDF e dall'applicazione client, la richiesta di rappresentazione ha esito negativo. In caso contrario, il framework rappresenta il client e chiama immediatamente la funzione di callback EvtRequestImpersonate.

Il EvtRequestImpersonate funzione di callback deve eseguire solo le operazioni che richiedono il livello di rappresentazione richiesto, ad esempio l'apertura di un file protetto.

Il framework non consente a un driver di utilizzare la funzione di callback EvtRequestImpersonate per chiamare nessuno dei metodi degli oggetti del framework. Ciò garantisce che il driver non esponga il livello di impersonificazione ad altre funzioni di callback del driver o ad altri driver.

Come procedura consigliata, il driver non deve abilitare l'annullamento di una richiesta di I/O prima di chiamare WdfRequestImpersonate per tale richiesta.

Il metodo WdfRequestImpersonate concede solo il livello di rappresentazione richiesto dal driver.

Passaggio delle credenziali nello stack di driver

Quando il driver riceve una richiesta di I/O WdfRequestTypeCreate-typed, il driver potrebbe inoltrare la richiesta di I/O lungo lo stack di driver a un driver della modalità kernel. I driver in modalità kernel non hanno la funzionalità di rappresentazione che WdfRequestImpersonate fornisce ai driver UMDF.

Pertanto, se si vuole che un driver in modalità kernel riceva le credenziali utente del client (anziché le credenziali del processo host del driver ), il driver deve impostare il flag di WDF_REQUEST_SEND_OPTION_IMPERSONATE_CLIENT quando chiama WdfRequestSend per inviare la richiesta di creazione alla destinazione di I/O. Il metodo Send restituisce un codice di errore se il tentativo di impersonificazione non riesce, a meno che il driver non imposti anche il flag WDF_REQUEST_SEND_OPTION_IMPERSONATION_IGNORE_FAILURE.

Nell'esempio seguente viene illustrato come un driver UMDF possa usare il flag WDF_REQUEST_SEND_OPTION_IMPERSONATE_CLIENT per inviare una richiesta di creazione di file a una destinazione di I/O. Il file INF del driver deve includere anche la direttiva UmdfImpersonationLevel come descritto in precedenza.

WDFIOTARGET iotarget;
WDF_REQUEST_SEND_OPTIONS options;
NTSTATUS status;
WDF_REQUEST_PARAMETERS params;
ULONG sendFlags;  
 
WDF_REQUEST_PARAMETERS_INIT(&params);
WdfRequestGetParameters(Request, &params);
   
sendFlags = WDF_REQUEST_SEND_OPTION_SYNCHRONOUS;
if (params.Type == WdfRequestTypeCreate) {
    sendFlags |= WDF_REQUEST_SEND_OPTION_IMPERSONATE_CLIENT;
}
   
WDF_REQUEST_SEND_OPTIONS_INIT(&options, sendFlags);
if (WdfRequestSend(Request,
                   iotarget,
                   &options
                   ) == FALSE) {
    status = WdfRequestGetStatus(Request);
}

Il driver non deve chiamare WdfRequestImpersonate prima di inviare la richiesta alla destinazione di I/O.

Se anche i driver di livello inferiore inoltrano la richiesta, il livello di rappresentazione del client si sposta verso il basso dello stack di driver.

Riduzione delle minacce alla sicurezza

Per ridurre la probabilità di un attacco di elevazione dei privilegi, è necessario:

  • Provare a evitare di usare l'imitazione.

    Ad esempio, per evitare di usare la rappresentazione per aprire un file che il driver deve usare, l'applicazione client può aprire il file e usare le operazioni di I/O per inviare il contenuto del file al driver.

  • Usare il livello di impersonificazione più basso che il driver richiede.

    Imposta il livello di impersonificazione nel file INF del driver il più basso possibile. Se il driver non richiede alcuna impersonificazione, non includere la direttiva UmdfImpersonationLevel nel file INF.

  • Ridurre al minimo le possibilità che un utente malintenzionato possa sfruttare il driver.

    La funzione di callback EvtRequestImpersonate dovrebbe includere una piccola sezione di codice che esegue solo l'operazione che richiede l'impersonificazione. Ad esempio, se il driver accede a un file protetto, richiede l'impersonificazione solo quando apre l'handle di file. Non richiede l'impersonificazione per leggere o scrivere del file.