Problemi di sicurezza per oggetti e viste di sezione
I driver che creano sezioni e visualizzazioni che non devono essere condivise con la modalità utente devono usare il protocollo seguente quando usano sezioni e visualizzazioni:
Il driver deve usare un handle del kernel quando apre un handle all'oggetto sezione. I driver possono assicurarsi che un handle sia un handle del kernel creandolo nel processo di sistema o specificando l'attributo OBJ_KERNEL_HANDLE per l'handle. Per altre informazioni, vedere Handle di oggetti.
La visualizzazione deve essere mappata solo da un thread di sistema. In caso contrario, la visualizzazione è accessibile dal processo di cui viene creato il contesto. Un driver può assicurarsi che la visualizzazione sia mappata dal processo di sistema usando un thread di lavoro di sistema per eseguire l'operazione di mapping. Per altre informazioni, vedere Thread di lavoro di sistema e contesto del thread del driver.
I driver che condividono una visualizzazione con un processo in modalità utente devono usare il protocollo seguente quando usano sezioni e visualizzazioni:
Il driver, non il processo in modalità utente, deve creare l'oggetto sezione ed eseguire il mapping delle visualizzazioni.
Come accennato in precedenza, il driver deve usare un handle del kernel quando apre un handle all'oggetto sezione. I driver possono assicurarsi che un handle sia un handle del kernel creandolo nel processo di sistema o specificando l'attributo OBJ_KERNEL_HANDLE per l'handle. Per altre informazioni, vedere Handle di oggetti.
La vista viene mappata nel contesto del thread del processo che condivide la vista. Un driver di livello più alto può garantire che la visualizzazione sia mappata nel contesto del processo corrente eseguendo l'operazione di mapping in una routine dispatch, ad esempio DispatchDeviceControl. Le routine dispatch dei driver di livello inferiore vengono eseguite in un contesto di thread arbitrario e pertanto non possono eseguire il mapping sicuro di una visualizzazione in una routine dispatch. Per altre informazioni, vedere Contesto thread driver.
Tutti gli accessi alla memoria alla visualizzazione all'interno del driver devono essere protetti provando-ad eccezione dei blocchi. Un'applicazione in modalità utente dannosa potrebbe annullare il mapping della visualizzazione o modificare lo stato di protezione della visualizzazione. Uno dei due causerebbe un arresto anomalo del sistema, a meno che non sia protetto da un blocco try-except . Per altre informazioni, vedere Gestione delle eccezioni.
Il driver deve anche convalidare il contenuto della visualizzazione in base alle esigenze. Il writer di driver non può presupporre che solo un componente in modalità utente attendibile possa accedere alla visualizzazione.
Un driver che deve condividere un oggetto sezione con un'applicazione in modalità utente (che deve essere in grado di creare visualizzazioni proprie) deve usare il protocollo seguente:
Il driver, non il processo in modalità utente, deve creare l'oggetto sezione. I driver non devono mai usare un handle passato dalla modalità utente.
Prima di passare l'handle alla modalità utente, il driver deve chiamare ObReferenceObjectByHandle per ottenere un riferimento all'oggetto sezione. Ciò impedisce a un'applicazione dannosa di eliminare l'oggetto sezione chiudendo l'handle. Il riferimento all'oggetto deve essere archiviato nell'estensione del dispositivo del driver.
Dopo che il driver non usa più l'oggetto sezione, deve chiamare ObDereferenceObject per rilasciare il riferimento all'oggetto.
Nei sistemi che eseguono Microsoft Windows Server 2003 con Service Pack 1 (SP1) e versioni successive, solo i driver in modalità kernel possono aprire \Device\PhysicalMemory. Tuttavia, i driver possono decidere di concedere un handle a un'applicazione utente. Per evitare problemi di sicurezza, è necessario concedere l'accesso a \Device\PhysicalMemory solo alle applicazioni utente attendibili del driver.