Condividi tramite


Gestione della rappresentazione client in driver UMDF 1.x

Avviso

UMDF 2 è la versione più recente di UMDF e sostituisce UMDF 1. Tutti i nuovi driver UMDF devono essere scritti usando UMDF 2. Nessuna nuova funzionalità viene aggiunta a UMDF 1 ed è disponibile un supporto limitato per UMDF 1 nelle versioni più recenti di Windows 10. I driver di Windows universali devono usare UMDF 2.

Gli esempi di UMDF 1 archiviati sono disponibili nell'Windows 11, versione 22H2 - Aggiornamento degli esempi di driver di maggio 2022.

Per altre informazioni, vedere Introduzione con 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 IWDFIoRequest::Impersonate per specificare il livello di rappresentazione richiesto e una funzione di callback IImpersonateCallback::OnImpersonate .

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

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

UMDF non consente alla funzione di callback onImpersonate 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.

Nota Nelle versioni 1.0 fino a 1.7 di UMDF, IWDFIoRequest::Impersonate concede il livello di rappresentazione più alto consentito dall'applicazione client e dal file INF, anche se il livello di rappresentazione richiesto dal driver è inferiore. Nelle versioni 1.9 e successive di UMDF il metodo Impersonate 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 con tipo WdfRequestCreate, il driver potrebbe inoltrare la richiesta di I/O nello stack di driver a un driver in modalità kernel. I driver in modalità kernel non hanno la funzionalità di rappresentazione fornita da IWDFIoRequest::Impersonate ai driver basati su 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 IWDFIoRequest::Send 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 .

Il driver non deve chiamare IWDFIoRequest::Impersonate 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 OnImpersonate 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.