primo, cerchiamo di gestire la sua terminologia alquanto vaga della
discussioni SGX abilitati dal TCS e filettatura non attendibile fornita da SDK.
All'interno di un'enclave, possono essere eseguiti solo i thread "attendibili". Non c'è threading "non attendibile" all'interno di un'enclave. Forse, la seguente frase nella Guida SDK [1] ti ha ingannato:
La creazione di thread all'interno dell'enclave non è supportata. Le discussioni che girano all'interno della enclave sono creati all'interno dell'applicazione (non attendibile).
L'applicazione non affidabile deve configurare le pagine TCS (per ulteriori informazioni su TCS, vedere [2]). Quindi, come può il TCS impostato dall'applicazione non affidabile essere la base per i thread affidabili all'interno dell'enclave? [2] fornisce la risposta:
EENTER è garantito solo per eseguire salti controllati all'interno del codice di un'enclave se il contenuto di tutte le pagine TCS viene misurato.
Misurando le pagine TCS, l'integrità dei thread (il TCS definisce i punti di ingresso consentiti) può essere verificata tramite l'attestazione enclave. Pertanto, solo i percorsi di esecuzione conosciuti possono essere eseguiti all'interno dell'enclave.
Secondo, esaminiamo le primitive di sincronizzazione.
L'SDK offre primitive di sincronizzazione, che si dice non sono attendibili perché alla fine sono servite dal sistema operativo. Vediamo la descrizione di queste primitive in [1]:
- sgx_spin_lock() e sbloccare operare esclusivamente all'interno della enclave (utilizzando le operazioni atomiche), senza la necessità di interazione del sistema operativo (senza OCALL). Usando uno spinlock, potresti implementare le primitive di livello superiore.
- sgx_thread_mutex_init() inoltre non esegue un OCALL. La struttura dei dati mutex è inizializzata all'interno dell'enclave.
- sgx_thread_mutex_lock() e sbloccare potenzialmente eseguire OCALLS. Tuttavia, poiché i dati mutex si trovano all'interno dell'enclave, possono sempre applicare la correttezza del blocco all'interno dell'enclave sicura.
Osservando le descrizioni delle funzioni mutex, suppongo che gli OCALL servano per implementare l'attesa non occupata all'esterno dell'enclave. Questo è effettivamente gestito dal sistema operativo e suscettibile di attacchi. Il sistema operativo può scegliere di non riattivare un thread in attesa fuori dall'enclave. Ma può anche scegliere di interrompere un thread in esecuzione all'interno di un'enclave. SGX non protegge dagli attacchi DoS (Denial of Service) dal sistema operativo (potenzialmente compromesso).
Per riepilogare, spin-lock (e per estensione qualsiasi sincronizzazione di livello superiore) possono essere implementati in modo sicuro all'interno di un'enclave. Tuttavia, SGX non protegge dagli attacchi DoS e quindi non si può presumere che un thread verrà eseguito. Questo vale anche per il blocco delle primitive: un thread in attesa su un mutex potrebbe non essere risvegliato quando il mutex viene liberato. Realizzando questa limitazione intrinseca, i progettisti dell'SDK hanno scelto di utilizzare OCALL (non attendibili) per implementare in modo efficiente alcune primitive di sincronizzazione (ad esempio attesa non occupata).
[1] SGX SDK Guide
[2] SGX Explained
Ciao, Freddy. Ho pensato più tardi che creare TCS multipli ed EENTER per loro sono l'unico thread consentito in un'enclave. Quindi la maggior parte di quello che hai detto ha perfettamente senso. Ma non sono sicuro che tutte le condizioni di gara (introdotte deliberatamente dal sistema operativo) si traducano necessariamente in attacchi DoS. Supponiamo che il thread T sia un thread di monitoraggio, in attesa di un cond. var. e verrà avvisato se accadono cose brutte. Quindi il sistema operativo può scegliere di non svegliare mai T in modo che l'errore non venga mai gestito e potenzialmente causare più danni. Questo esempio è un po 'inventato ma è possibile. In questo caso, le condizioni di gara sono più di quanto non facciano. – qweruiop
A proposito, sai dello stato di supporto del threading nell'SDK corrente? Ad esempio, quale API è per EENTER un TCS? – qweruiop
La mia risposta era troppo lunga per il commento. Vedi l'altra risposta qui sotto. – Freddy