2015-01-23 11 views
7

Sto cercando di programmare con la funzione Intel Software Guard Extensions (SGX) di recente. L'idea di SGX è creare un'enclave in cui il codice sensibile alla sicurezza sia caricato ed eseguito. Soprattutto l'accesso alla memoria (e molte altre restrizioni) a quell'enclave viene applicato dall'hardware.Che cosa implica disabilitare syscall in Intel SGX

Nel suo manual, ho trovato che l'istruzione syscall è illegale all'interno di un'enclave (vedere la Tabella 3-1), insieme a molte altre istruzioni potrebbe modificare il livello di privilegi. Mi chiedo cosa implichi questo. Poiché il servizio del kernel come open, socket termina con l'aumento delle chiamate di sistema, significa che vietare l'istruzione syscall proibisce effettivamente il codice all'interno dell'enclave da qualsiasi servizio del kernel, come file e socket? Mi sembra abbastanza poco convincente perché in questo modo ciò che può fare un enclave sarebbe severamente limitato. Quindi penso che abbia frainteso o che ci sia del lavoro in giro.

risposta

5

Hai ragione quando dici che non è possibile utilizzare i servizi del kernel o qualsiasi chiamata di sistema, perché l'istruzione Syscall è proibita all'interno dell'enclave. Il sistema operativo non fa parte del trusted computing base (TCB) in SGX. lasciamo presumere che syscall sia abilitato all'interno dell'enclave e si scrivano istruzioni in assembly per eseguire l'istruzione syscall (diciamo con i parametri per la chiamata di sistema aperta sys_open). Quando esegui un syscall, durante il boot passi all'impostazione predefinita della posizione da parte del kernel per avviare l'esecuzione del codice del kernel. Ciò significa che stai saltando dal codice scritto da te (che è affidabile) al codice che non è stato scritto da te (sistema operativo, che non è affidabile e non fa parte del tuo TCB). Se tu fossi in grado di farlo, ciò avrebbe vanificato le garanzie di sicurezza fornite da SGX. Dato che il kernel/OS/qualsiasi altro software non scritto da te non è affidabile, potresti avere un kernel maligno la cui chiamata di sistema aperta legge i dati all'interno della tua enclave e ruba i tuoi segreti.

Questo è severamente limitante come dici tu perché non saresti in grado di utilizzare socket o altro direttamente dal tuo codice di enclave. Ma se volessi usare questi servizi all'interno dell'enclave, devi fidarti del codice non scritto da te che rompe il modello di sicurezza di SGX.

Non penso che SGX sia destinato ad usi come quello che si potrebbe pensare. qui ci sono alcuni casi d'uso previsti come mostrato da Intel e dovrebbe spiegare come è possibile ottenere queste applicazioni senza l'uso di chiamate di sistema.

https://software.intel.com/en-us/articles/using-innovative-instructions-to-create-trustworthy-software-solutions

+0

Grazie mille per la risposta! Sì, quello che hai detto ha senso e la chiamata di sistema dovrebbe essere vietata. Ma ho ricevuto alcune domande di follow-up. 1) Nella carta che hai indicato, è spesso menzionato che abbiamo un * canale fidato * tra enclave e server remoto. Ma se le cose 'socket' non sono permesse, come fa un'enclave a comunicare con il server remoto? 2) In che modo un'enclave comunica con le enclave locali? Il manuale dice che è necessario passare "REPORT" a un altro per attestare, ma come si fa senza l'aiuto del sistema? – qweruiop

+0

In generale, in che modo enclaves IPC senza l'aiuto della guida del sistema? Grazie in anticipo. – qweruiop

+0

Ora mi sembra chiaro .. Il cosiddetto * percorso di fiducia * è stabilito in cima al * percorso non affidabile * offerto dal sistema operativo (IPC tradizionale tra le applicazioni), con protezione crittografica (le chiavi sono conosciute solo dalle enclave). – qweruiop

2

destro. Vedere l'attestazione locale in uno dei tre articoli pubblicati da Intel su SGX. L'enclave che vuole dimostrare che è in esecuzione in un'enclave su una CPU Intel, crea un report all'interno dell'enclave (EREPORT). Il report non contiene alcun segreto, ma è MAC che usa la chiave del report, che è accessibile e generata all'interno dell'enclave. Il report viene inviato all'altra enclave tramite il canale non attendibile (Ie, OS fornito da IPC), quindi il report viene verificato all'interno dell'altra enclave, che ha accesso alla stessa chiave report (segreto condiviso) all'interno dell'enclave e può verificare il integrità della struttura utilizzando il MAC e la chiave di segnalazione (segreto condiviso tra enclavi). Se tutte le informazioni nel rapporto corrispondono, le due enclavi possono fidarsi dell'esecuzione sulla stessa piattaforma SGX. Possono quindi eseguire scambi di chiavi come lo scambio di chiavi DH o qualsiasi altro modo per stabilire un canale sicuro e possono comunicare tra loro in modo sicuro.

+0

Grazie! Mi rende la mente molto più chiara. – qweruiop

+0

Ancora non capisco come enclave1 possa trasferire il report in enclave2. Il report risiede in enclave1. Da lì è possibile utilizzare EEXIT e restituire un puntatore all'applicazione in uno spazio non protetto. Non è possibile accedere al puntatore in quanto punta a Enclave. Anche l'invio da enclave1 a enclave2 non è possibile. Puoi spiegare quella parte in dettaglio? – fliX

+0

il report che risiede in enclave1 viene prima copiato nella memoria non attendibile del processo di enclave1s dall'enclave stessa. Ricorda che l'enclave può accedere a tutta la memoria dei processi che è mappata. Questo va bene perché il rapporto non ha segreti. il codice non affidabile può quindi utilizzare l'ipc fornito da tutti i sistemi operativi per trasferire il report al processo di enclave2s che è anche memoria non affidabile. Quindi un codice fidato nel processo due può chiamare nell'enclave 2 che può quindi copiare il rapporto dalla memoria non fidata del processo di enclave2 nella memoria dell'enclave 2s. – Raghu

Problemi correlati