Condividi tramite


Virtualizzazione risorse

La funzione primaria della TBS consiste nel condividere in modo efficiente alcune risorse TPM limitate: chiavi, autorizzazione e sessioni di trasporto.

Quando viene creata un'istanza di una di queste risorse, la TBS crea un'istanza virtuale della risorsa e restituisce un handle a questa istanza virtuale nel flusso di comando dei risultati anziché l'istanza di handle effettiva restituita dal TPM. TBS gestisce un mapping tra l'handle virtuale e l'handle effettivo internamente. Se il TPM esce dallo spazio per contenere più risorse di un determinato tipo, le istanze esistenti della risorsa vengono salvate e rimosse in modo selettivo fino a quando il TPM può contenere la nuova risorsa. Quando le risorse precedenti sono necessarie di nuovo, TBS carica i contesti salvati (salvataggio ed eliminazione di altre risorse, se necessario) prima di inviare il comando.

Tutte le virtualizzazione in TBS vengono eseguite per conto di un contesto specifico. Ogni contesto è consentito solo per accedere alle risorse virtuali create in modo specifico per suo conto, nonché le risorse fisiche nel TPM che corrisponde a tali risorse virtuali. Per impostazione predefinita, il numero totale di tutte le risorse virtualizzate è limitato a 500. Questo numero può essere modificato creando o modificando un valore del Registro di sistema DWORD denominato MaxResources in HKEY_LOCAL_MACHINE\Software\Microsoft\Tpm. L'utilizzo delle risorse TBS in tempo reale può essere osservato usando lo strumento Monitor prestazioni per tenere traccia del numero di risorse TBS. Questa restrizione è diventata obsoleta con Windows 8 e Windows Server 2012.

Le risorse TPM limitate non virtualizzate da TBS (ad esempio contatori e archivio NV) devono essere condivise in modo cooperativo tra gli stack software.

Nota

Questa virtualizzazione di handle causa l'esito negativo dei comandi che includono handle delle chiavi nel calcolo dei parametri di autorizzazione HMAC. Di conseguenza, molti comandi deprecati in TPM versione 1.2 non possono essere usati dal software dell'applicazione nell'ambiente TBS.

 

Limiti delle risorse

Il TPM consente ai chiamanti di eseguire query sulle relative funzionalità per determinare la quantità di spazio disponibile per determinati tipi di risorse. Alcuni di questi limiti di risorse, ad esempio la quantità di spazio disponibile per chiavi, sessioni di autorizzazione e sessioni di trasporto, vengono estesi in modo efficace da TBS tramite la virtualizzazione. Le limitazioni TBS, controllate dall'impostazione del Registro di sistema MaxResources , sono in genere molto più grandi delle limitazioni effettive dell'hardware TPM sottostante. Non viene fornito alcun meccanismo per eseguire query sulle limitazioni TBS separatamente dai limiti hardware TPM. Questa limitazione TBS è diventata obsoleta con Windows 8 e Windows Server 2012.

Chiavi

TbS virtualizza gli handle delle chiavi in modo che le chiavi possano essere scaricate in modo trasparente dal TPM quando non vengono usate e caricate nuovamente nel TPM quando sono necessarie. Quando viene creata una chiave, TBS associa un handle virtuale alla chiave caricata. Lo stesso handle virtuale viene usato per la durata della risorsa. Gli handle delle chiavi virtuali sono validi solo nel contesto che li ha creati e le risorse associate non vengono mantenute oltre la vita del contesto.

  • Creazione di chiavi con TPM_LoadKey2

    Se una chiave viene creata usando il TPM_LoadKey2, TPM2_CreatePrimary, TPM2_Load o TPM2_LoadExternal comando, tbS sostituisce l'handle nel flusso di byte restituito con un handle di chiave virtuale da scegliere. Di conseguenza, la TBS garantisce che ogni handle virtuale sia univoco. Se TBS rileva una collisione (un evento estremamente improbabile), TBS scarica la chiave dal TPM e informa il software chiamante. Il software può quindi inviare nuovamente l'operazione. Questo processo può essere ripetuto fino a quando il TBS ottiene un handle di chiave univoco.

  • Cancella chiavi

    TBS invalida l'handle della chiave virtuale quando riceve un TPM_FlushSpecific o TPM2_FlushContext messaggio per tale handle virtuale dal contesto client. Se la chiave è fisicamente presente nel TPM quando viene ricevuto il messaggio di scaricamento, tbS scarica la chiave dal TPM in quel momento.

  • Rimozione temporanea delle chiavi

    Quando si rimuove una chiave dal TPM per rendere disponibile un nuovo elemento, TBS esegue un comando TPM_SaveContext o TPM2_ContextSave sulla chiave prima di evitare l'eliminazione.

  • Ripristino delle chiavi

    Quando un comando che fa riferimento a una chiave caricata viene inviato alla TBS, garantisce che la chiave sia fisicamente presente nel TPM. Se la chiave non è presente, TBS lo ripristina con una chiamata a TPM_LoadContext o TPM2_ContextLoad. Se non è possibile ripristinare una chiave nel TPM, la TBS restituisce TPM_E_INVALID_KEYHANDLE come risultato TPM.

TbS sostituisce ogni handle virtuale associato a una chiave in un flusso di comandi con l'handle fisico della chiave caricata nel TPM. Se un comando viene inviato con un handle virtuale non riconosciuto da TBS nel contesto del chiamante, tbS formatta un flusso di errore per il chiamante con TPM_E_INVALID_KEYHANDLE.

Sessioni di autorizzazione

Le sessioni di autorizzazione vengono create chiamando TPM_OIAP, TPM_OSAP o TPM_DSAP. In ogni caso, il flusso di byte restituito contiene l'handle TPM fisico della sessione di autorizzazione appena creata. TbS sostituisce questa operazione con un handle virtuale. Quando viene successivamente fatto riferimento alla sessione di autorizzazione, TBS sostituisce l'handle virtuale nel flusso di comandi con l'handle fisico della sessione di autorizzazione. TbS garantisce che la durata della sessione di autorizzazione virtuale corrisponda a quella della sessione di autorizzazione fisica. Se un client tenta di usare un handle virtuale scaduto, la TBS formatta un flusso di errori con errore TPM_INVALIDAUTHHANDLE.

Gli slot di sessione sono limitati e la TBS può esaurire gli slot esterni in cui salvare i contesti di sessione di autorizzazione. In questo caso, TBS sceglie una sessione di autorizzazione per invalidare in modo che il nuovo contesto possa essere salvato correttamente. Un'applicazione che tenta di usare il contesto precedente dovrà ricreare la sessione di autorizzazione.

TbS invalida la sessione di autorizzazione virtuale quando si verificano uno dei casi seguenti:

  • Il flag di utilizzo continuo associato alla sessione di autorizzazione nel flusso di comandi restituito dal TPM è FALSE.

  • Un comando che usa una sessione di autorizzazione ha esito negativo.

  • Viene eseguito un comando che invalida la sessione di autorizzazione associata al comando ,ad esempio TPM_CreateWrapKey.

  • Una chiave associata a una sessione OSAP o DSAP viene rimossa dal TPM con una chiamata a TPM_FlushSpecific o TPM2_FlushContext (senza considerare se questo comando ha avuto origine con TBS o con software di livello superiore).

    TbS riincronizzerà automaticamente le sessioni di autorizzazione dopo l'esecuzione riuscita di determinati comandi non deterministici per garantire che lo stato TBS rimanga coerente con lo stato TPM. I comandi interessati sono:

    • TPM_ORD_Delegate_Manage
    • TPM_ORD_Delegate_CreateOwnerDelegation
    • TPM_ORD_Delegate_LoadOwnerDelegation

In ognuno dei casi seguenti la sessione di autorizzazione nel TPM viene scaricata automaticamente dal TPM:

  • Creazione di sessioni di autorizzazione

    Gli handle di sessione di autorizzazione virtuale sono validi solo nel contesto che li ha creati e le risorse associate non vengono mantenute oltre la vita del contesto associato.

  • Cancellazione delle sessioni di autorizzazione

    TBS invalida la sessione di autorizzazione virtuale se riceve un comando TPM_FlushSpecific o TPM2_FlushContext per l'handle virtuale dal contesto client. Se la sessione di autorizzazione è fisicamente presente nel TPM quando viene ricevuto il comando di scaricamento, TBS scarica immediatamente la sessione fisica dal TPM.

  • Rimozione temporanea delle sessioni di autorizzazione

    Quando si rimuove una sessione di autorizzazione dal TPM per rendere disponibile una nuova entità, TBS esegue TPM_SaveContext o TPM2_ContextSave in tale sessione di autorizzazione.

  • Ripristino delle sessioni di autorizzazione

    Quando un comando TPM autorizzato viene inviato alla TBS, la TBS garantisce che tutte le sessioni di autorizzazione virtuali a cui fa riferimento nel comando siano fisicamente presenti nel TPM. Se una delle sessioni di autorizzazione non è presente, la TBS li ripristina con una chiamata a TPM_LoadContext o TPM2_ContextLoad. Se non è possibile ripristinare una sessione di autorizzazione nel TPM, la TBS restituisce TPM_E_INVALID_HANDLE come risultato TPM.

TbS sostituisce ogni handle virtuale associato a una sessione di autorizzazione in un flusso di comandi con l'handle fisico della sessione di autorizzazione caricata nel TPM.

Se un comando viene inviato con un handle virtuale non riconosciuto da TBS nel contesto del chiamante, tbS formatta un flusso di errori per il chiamante con l'errore TPM_E_INVALID_HANDLE.

Sessioni di trasporto

Nota

La gestione delle sessioni di trasporto come descritto qui è specifica per Windows Vista e Windows Server 2008.

 

Le sessioni di trasporto sono un meccanismo fornito dal TPM che consente a uno stack software di crittografare i dati in un comando mentre passa tra il software e il TPM. Ciò impedisce a un avversario di intercettare i dati man mano che passa il bus hardware.

Importante

Solo i dati del payload vengono crittografati. I comandi eseguiti possono comunque essere identificati.

 

Purtroppo, questo meccanismo impedisce anche alla TBS di esaminare i dati del payload. Nella maggior parte dei casi non si tratta di un problema perché la TBS modifica solo i handle, non i dati del payload. Tuttavia, nel caso di TPM_LoadContext ad esempio, l'handle di risorse restituito è coperto dalla crittografia. Pertanto, il TBS impedisce di eseguire un'operazione di TPM_LoadContext coperta da una sessione di trasporto.

TbS blocca i comandi seguenti nella sessione di trasporto:

  • TPM_EstablishTransport
  • TPM_ExecuteTransport
  • TPM_Terminate_Handle
  • TPM_LoadKey
  • TPM_EvictKey
  • TPM_SaveKeyContext
  • TPM_LoadKeyContext
  • TPM_SaveAuthContext
  • TPM_LoadAuthContext
  • TPM_SaveContext
  • TPM_LoadContext
  • TPM_FlushSpecific

Quando uno di questi comandi è coperto da una sessione di trasporto, TBS restituisce TPM_E_EMBEDDED_COMMAND_UNSUPPORTED come risultato del TPM.

Gli handle di sessione di trasporto vengono virtualizzati in modo simile agli handle di chiave e agli handle di autorizzazione. Nel TPM sono disponibili un numero limitato di slot di contesto della sessione di trasporto salvati.

TBS invalida la sessione di trasporto virtuale se si verifica uno dei casi seguenti:

  • Il flag continue-use associato alla sessione di trasporto nel flusso di comandi restituito da TPM è FALSE.

    Come per le sessioni di autorizzazione precedenti, TBS reincronizzerà automaticamente le sessioni di trasporto dopo l'esecuzione corretta di determinati comandi non deterministici per garantire che lo stato TBS rimanga coerente con lo stato TPM. I comandi interessati sono:

    • TPM_ORD_Delegate_Manage
    • TPM_ORD_Delegate_CreateOwnerDelegation
    • TPM_ORD_Delegate_LoadOwnerDelegation

In ognuno di questi casi, la sessione di trasporto sul TPM verrà scaricata automaticamente dal TPM:

  • Creazione di sessioni di trasporto

    TBS crea un handle virtuale per ogni sessione di trasporto creata da un client. Gli handle di trasporto virtuale sono validi solo nel contesto che li ha creati e le risorse associate non vengono mantenute oltre la durata del contesto associato.

  • Cancellazione delle sessioni di trasporto

    TBS invalida la sessione di trasporto virtuale se riceve un comando TPM_FlushSpecific per l'handle virtuale dal contesto client. Se la sessione di trasporto è fisicamente presente nel TPM quando viene ricevuto il comando flush, TBS scarica immediatamente la sessione fisica dal TPM.

  • Rimozione temporanea delle sessioni di trasporto

    Quando si rimuove una sessione di trasporto dal TPM per liberare spazio per una nuova entità, il TBS viene eseguito TPM_SaveContext in tale sessione di trasporto.

  • Ripristino delle sessioni di trasporto

    Quando un comando TPM_ExecuteTransport viene inviato ai TBS, il TBS garantisce che la sessione di trasporto a cui si fa riferimento nel comando sia fisicamente presente nel TPM. Se la sessione di trasporto non è presente, TBS lo ripristina con una chiamata a TPM_LoadContext.

TBS sostituisce l'handle virtuale associato alla sessione di trasporto in un flusso di comandi con l'handle fisico della sessione di trasporto caricata nel TPM. Se un comando viene inviato con un handle virtuale non riconosciuto dai TBS nel contesto del chiamante, tbS formatta un flusso di errore per il chiamante usando TPM_E_INVALID_HANDLE.

Sessioni di trasporto esclusive

Le sessioni di trasporto con wrapping esclusivo sono un modo per il software di primo livello per determinare se qualsiasi altro software ha eseguito l'accesso al TPM durante una catena di comandi. Non impediscono ad altri software di accedere al TPM, ma danno al creatore della sessione di trasporto un mezzo per determinare che si è verificato un altro accesso. Il TBS non esegue alcuna operazione specifica per ostacolare sessioni di trasporto esclusive, ma è in qualche modo incompatibile con loro. TbS tenta di duplicare il comportamento naturale del TPM essendo trasparente, in modo che non favorisca i comandi dai contesti che stabiliscono una sessione di trasporto esclusiva. Ad esempio, se il client B invia un comando quando il client A si trova in una sessione di trasporto esclusiva, invaliderà la sessione di trasporto esclusiva del client A.

I comandi avviati da TBS possono terminare anche la sessione di trasporto esclusiva. Ciò si verifica quando il client A si trova in una sessione di trasporto esclusiva e un comando eseguito dal client A chiama una risorsa che non è fisicamente presente nel TPM. Questa situazione attiva il gestore di virtualizzazione TBS per eseguire un comando TPM_LoadContext per fornire tale risorsa, che termina la sessione di trasporto esclusiva del client A.