banner
Casa / Notizia / Giocare a Nasconditi
Notizia

Giocare a Nasconditi

Nov 03, 2023Nov 03, 2023

21 ottobre 2022

Nella Parte 1 abbiamo spiegato cosa sono le enclavi Intel SGX e i vantaggi che apportano agli autori di ransomware. Nella Parte 2, esploreremo un'ipotetica implementazione passo passo e delineeremo i limiti di questo metodo.

Guarda questa demo di attacco dal vivo per vedere come la piattaforma CrowdStrike Falcon® e il team di rilevamento e risposta gestito CrowdStrike Falcon Complete™ proteggono dai ransomware.

In questa sezione, creiamo un esempio passo passo di un ransomware che utilizza enclavi per la crittografia asimmetrica. Il ransomware è diviso in due parti:

Gli estratti del codice qui presentato proverranno dal nucleo regolare dell'applicazione (main.c) o dall'enclave (enclave.c). L'enclave genererà una coppia di chiavi RSA, sigillerà la chiave privata e crittograferà i dati della vittima all'interno dell'enclave utilizzando l'API Intel SGX. Diamo un'occhiata a come viene fatto e come il nucleo dell'applicazione interagisce con l'enclave.

Innanzitutto, il nucleo normale dell'applicazione inizializza le risorse necessarie per l'esecuzione del ransomware, inclusa la creazione e l'impostazione dell'enclave. Per caricare l'enclave, utilizziamo la funzione sgx_create_enclave(), da sgx_urts.lib.1 Il prototipo della funzione è:

Gli argomenti di questa funzione rappresentano alcuni degli attributi dell'enclave, come la modalità di compilazione o le informazioni sui caricamenti precedenti. Ad esempio, sgx_launch_token_t è una struttura opaca che rappresenta il token di lancio dell'enclave. Le informazioni sul token contengono informazioni sull'enclave durante tutta la sua esecuzione e possono essere salvate per facilitare i caricamenti futuri dell'enclave.

Figura 1. Estratto del codice che crea l'enclave (clicca per ingrandire)

Una volta caricata l'enclave, il nucleo normale dell'applicazione può eseguire un ECALL per avviare il processo di generazione della chiave.

All'interno dell'enclave, la generazione delle chiavi si basa sull'SDK Intel SGX denominato sgx_tcrypto.lib. Questa è un'API documentata che può essere chiamata direttamente dall'enclave. Sotto il cofano, l'API si basa su altre librerie crittografiche sviluppate da Intel: Integrated Performance Primitives (Intel® IPP) e la libreria crittografica Intel® Software Guard Extensions SSL (Intel® SGX SSL),2 entrambe basate su OpenSSL .

Il primo passo in questo processo è generare componenti RSA per le chiavi privata e pubblica dall'enclave utilizzando la funzione sgx_create_rsa_key_pair(). Si tratta di una chiamata preliminare, eseguita prima delle chiamate di funzione che creano le chiavi, utilizzata per generare componenti conformi alla dimensione del modulo della chiave RSA predefinita e all'esponente pubblico.

Figura 2. Estratto del codice che genera i componenti delle chiavi RSA (clicca per ingrandire)

Da questi componenti della chiave RSA, utilizziamo la funzione sgx_create_rsa_pub1_key() per generare la chiave pubblica RSA che verrà utilizzata per crittografare i file della vittima.

Figura 3. Estratto del codice che crea la chiave pubblica RSA (clicca per ingrandire)

Il passaggio logico successivo sarebbe in genere quello di generare la chiave privata, come abbiamo fatto con la chiave pubblica. In questo caso, però, non abbiamo ancora bisogno della chiave privata, poiché la chiave privata verrà utilizzata solo per scopi di decifrazione, nel caso in cui la vittima rispetti le richieste degli autori del ransomware. Al momento dobbiamo solo archiviare e nascondere in modo sicuro i componenti della chiave privata per consentirne il recupero futuro. A tal fine, utilizziamo il metodo di sigillatura dei dati per garantire che la chiave privata possa essere scritta e archiviata crittografata su disco, senza mai apparire come testo in chiaro nella memoria normale del sistema operativo.

Un modo per farlo è generare la chiave privata e poi sigillarla direttamente sul disco, ma non procederemo in questo modo. Considera il prototipo della funzione dell'SDK3 Intel SGX che genera la chiave privata mostrata di seguito.

Tieni presente che il valore della chiave privata è scritto su un void** ma sotto il cofano, la struttura effettiva utilizzata è una struttura EVP_PKEY, una struttura complessa che ha origine dalla libreria OpenSSL.

Figura 4. Estratto del codice che definisce la struttura EVP_PKEY, dalla libreria openssl (clicca per ingrandire)