Condividi tramite


Gestione della rappresentazione client nei driver UMDF

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

I driver UMDF vengono in genere eseguiti nell'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 da un'applicazione client a 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 di prendere il controllo del dispositivo. Sfortunatamente, questo ACL impedisce anche al driver UMDF di accedere al file.

Il framework offre una funzionalità di rappresentazione che consente ai driver di rappresentare il client del driver e ottenere i diritti di accesso del client alle risorse protette.

Abilitazione della rappresentazione

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 altre informazioni sull'impostazione del livello di rappresentazione, vedere Specifica delle direttive WDF nei file INF.

  • L'applicazione client deve impostare il livello di rappresentazione consentito per ogni handle di file. L'applicazione usa le impostazioni di qualità del servizio (QoS) 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 della rappresentazione per una richiesta di I/O

Il driver e il framework UMDF gestiscono la rappresentazione per una richiesta di I/O nella sequenza seguente:

  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 rappresentazione 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 .

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

Il framework non consente alla funzione di callback EvtRequestImpersonate di un driver di chiamare uno dei metodi dell'oggetto del framework. Ciò garantisce che il driver non espone il livello di rappresentazione 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 allo stack di driver in modalità kernel. I driver in modalità kernel non hanno la funzionalità di rappresentazione fornita da WdfRequestImpersonate ai driver UMDF.

Pertanto, se si vuole che un driver in modalità kernel riceva le credenziali utente del client (invece le credenziali del processo host 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 I/O. Il metodo Send restituisce un codice di errore se il tentativo di rappresentazione ha esito negativo, a meno che il driver non imposta anche il flag di WDF_REQUEST_SEND_OPTION_IMPERSONATION_IGNORE_FAILURE .

Nell'esempio seguente viene illustrato come un driver UMDF potrebbe 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 i driver di livello inferiore inoltrano anche la richiesta, il livello di rappresentazione del client viaggia verso il basso dello stack di driver.

Riduzione delle minacce alla sicurezza

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

  • Provare a evitare di usare la rappresentazione.

    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 rappresentazione più basso richiesto dal driver.

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

  • Ridurre al minimo le opportunità per un utente malintenzionato di sfruttare il driver.

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