Intel Software Guard Extensions (Intel SGX) sunt un set de instrucțiuni CPU care permit unei aplicații să creeze enclave - zone din spațiul de adrese virtuale care sunt protejate de citirea și scrierea din afara acestei zone de către alte procese, inclusiv nucleul sistemului de operare . Intel SGX oferă integritatea și confidențialitatea calculelor de înaltă securitate efectuate pe sisteme în care procesele privilegiate (kernel, hypervisor etc.) sunt considerate nedemne de încredere.
Intel SGX este proiectat pentru calcularea securizată la distanță, navigarea securizată pe web și protecția drepturilor de autor . Alte aplicații practice ale acestei tehnologii includ asigurarea confidențialității algoritmilor proprietari și a cheilor de criptare.
Extensiile Intel SGX au sosit în 2015 cu a șasea generație de microprocesoare Intel bazate pe microarhitectura Skylake . Începând cu Skylake, procesorul are un nou modul hardware numit Memory Encryption Engine (MEE), care permite criptarea automată a datelor transferate de la procesor în zona de memorie a enclavei. Acest lucru a făcut posibilă abandonarea ipotezei fiabilității RAM și limitarea perimetrului de securitate la un singur procesor central, ceea ce a făcut posibilă crearea SGX [1] .
În 2016, a fost introdusă a doua versiune a tehnologiei SGX, numită SGX2. A extins setul de instrucțiuni SGX1 cu gestionarea dinamică a memoriei enclavei. SGX1 a impus restricții în ceea ce privește alocarea memoriei și reutilizarea memoriei enclavei - dezvoltatorului i sa cerut să aloce toată memoria atunci când crea o instanță de enclavă. SGX2 a introdus noi instrucțiuni și modele de programare pentru a extinde suportul pentru gestionarea dinamică a memoriei enclave [2] .
Acceptat numai pe procesoarele Intel Core 7000, 8000, 9000 și 10000 de generații (tehnologia SGX a fost eliminată pe procesoarele Core din generația 11 și 12), precum și pe procesoarele de server Intel Xeon Scalabale din a 3-a generație . Procesoarele AMD nu acceptă SGX. [3]
În primul rând, tehnologia SGX a fost creată pentru a permite calcularea securizată la distanță - rularea software-ului pe un computer la distanță deținut de o parte neîncrezătoare, cu unele garanții de integritate și confidențialitate. În general, calcularea securizată la distanță este o problemă nerezolvată. Criptarea complet homomorfă rezolvă problema pentru o familie limitată de calcule, dar are o performanță nepractică [4] .
Extensiile Intel SGX rezolvă problema calculării securizate la distanță prin utilizarea hardware-ului de încredere pe computerul de la distanță. Autenticitatea echipamentului este stabilită în timpul procesului de certificare. Hardware de încredere creează o „zonă securizată”, iar utilizatorul serviciului de calcul la distanță poate încărca codul și datele necesare în această „zonă”. Hardware-ul de încredere protejează confidențialitatea și integritatea datelor în timp ce efectuează calcule pe acestea [5] .
Dezvoltarea Intel SGX a avut 8 obiective principale [6] :
SGX alocă o zonă de memorie numită Processor Reserved Memory (PRM). Procesorul protejează PRM-ul de toate accesele de memorie non-enclavă, inclusiv accesul la kernel, hypervisor și modul de gestionare a sistemului (SMM), precum și accesul DMA de la periferice [5] [7] .
PRM conține Enclave Page Cache (EPC), care constă din pagini de 4 kiloocteți care stochează codul și datele enclavei. Software-ul de sistem nesigur este responsabil pentru alocarea paginilor EPC către enclave. CPU ține evidența stării fiecărei pagini EPC în metadatele EPCM (Enclave Page Cache Metadata) pentru a se asigura că fiecare pagină EPC aparține unei singure enclave [7] .
Codul sursă și datele din enclavă sunt încărcate de un software de sistem care nu este de încredere. În timpul fazei de pornire, software-ul de sistem cere CPU să copieze datele din memoria neprotejată (în afara PRM) în paginile EPC și atribuie paginile enclavei care se instalează. Rezultă că starea inițială a enclavei este cunoscută de software-ul de sistem [5] [7] .
După ce toate paginile enclavei sunt încărcate în EPC, software-ul de sistem cere CPU-ului să marcheze enclava ca fiind inițializată, după care software-ul aplicației poate executa codul în interiorul enclavei. După inițializarea enclavei, metoda de încărcare descrisă mai sus [5] [7] este interzisă .
În timp ce enclava se încarcă, un hash criptografic este calculat pe baza conținutului său. După ce enclava este inițializată, procesul de hashing este finalizat și hashul rezultat devine hash-ul de măsurare al enclavei [8] .
Partea de la distanță poate trece printr-un proces de atestare pentru a se asigura că comunică cu o enclavă care are un anumit hash de verificare și rulează într-un mediu securizat [9] .
Un fir de execuție poate intra în enclavă numai prin instrucțiuni speciale ale CPU, care sunt similare cu mecanismul de trecere de la modul utilizator la modul kernel. Execuția enclavei are loc întotdeauna în modul protejat, pe inelul 3 și folosește traducerea adresei stabilită de kernel-ul OS și hypervisor [5] [7] .
Pentru a evita scurgerea de date sensibile, CPU nu deservește întreruperile (cum ar fi pagina eroare ) sau ieșirea mașinii virtuale (vmexit) în timp ce codul enclavă este în execuție. În schimb, procesorul efectuează mai întâi o ieșire asincronă a enclavei (AEX) pentru a comuta de la codul enclavei la codul ring 3, apoi deservește o întrerupere sau o ieșire a mașinii virtuale. CPU efectuează un AEX, stochându-și starea într-o zonă predefinită din interiorul enclavei și transferă controlul unei instrucțiuni predefinite din afara enclavei, înlocuind registrele CPU cu valori sintetice [5] [7] .
Alocarea paginilor EPC pentru enclave este delegată nucleului sistemului de operare (sau hypervisor). Sistemul de operare își comunică deciziile de alocare a memoriei către implementarea SGX prin instrucțiuni speciale pentru procesorul inelului 0. Sistemul de operare poate, de asemenea, să schimbe paginile EPC cu RAM nesigură și apoi să le încarce înapoi folosind instrucțiuni speciale de procesor [5] .
SGX folosește Memory Encryption Engine (MEE) pentru a asigura confidențialitatea, integritatea și actualitatea paginilor EPC încărcate în timp ce acestea sunt stocate în memorie neîncrezătoare [5] . MME funcționează ca o extensie a unității de gestionare a memoriei și criptează automat toate datele transferate de la procesor în memorie [10] .
Proiectarea aplicației cu Intel SGX necesită ca aplicația să fie împărțită în două componente [9] :
Un bean de încredere ar trebui să se limiteze doar la datele care au nevoie de cea mai mare protecție și la operațiunile care trebuie să interacționeze cu ele. O enclavă mare cu o interfață complexă nu numai că consumă mai multă memorie protejată, ci mărește și suprafața de atac. De asemenea, enclavele ar trebui să aibă o interacțiune minimă între componentele de încredere. Deși enclavele pot apela funcții într-o componentă neîncrezătoare (folosind o instrucțiune specială), restricționarea unor astfel de apeluri va întări enclava de atacuri [9] [8] .
În arhitectura Intel SGX, atestarea este procesul de autentificare în enclavă. Există două mecanisme de atestare [9] :
Atestarea locală este utilă atunci când o aplicație are mai multe enclave care trebuie să lucreze împreună, sau când două aplicații trebuie să comunice între enclave [9] .
În procesul de atestare dintre două enclave, fiecare enclavă trebuie să se asigure mai întâi că cealaltă este de încredere. O enclavă se autentifică la o altă enclavă țintă folosind instrucțiunea EREPORT. Această instrucțiune SGX creează un raport de atestare (RAPORT) care asociază criptografic un mesaj de enclavă cu o identitate bazată pe hash-ul enclavei și pe baza certificatelor. Legarea criptografică este realizată folosind o etichetă specială calculată folosind o cheie simetrică care este disponibilă numai pentru enclava țintă și implementarea SGX [5] .
Enclavele pot stabili apoi o sesiune securizată folosind protocolul Diffie-Hellman pentru a schimba cheia de sesiune. Această cheie de sesiune poate fi folosită pentru a cripta datele care urmează să fie partajate între două enclave [9] .
Deoarece o enclavă nu poate accesa spațiul de memorie protejat al altei enclave, chiar dacă aparțin aceleiași aplicații, toți pointerii trebuie dereferențiați, iar datele trebuie să fie transmise direct între enclave [9] .
Procesul de certificare este următorul. Un procesor compatibil SGX calculează un hash al codului și datelor din fiecare enclavă. Software-ul din interiorul enclavei începe procesul de calcul al semnăturii de atestare SGX, care include hash-ul enclavei și mesajul enclavei [8] .
Primitiva criptografică folosită în semnarea atestării SGX este prea complexă pentru a fi implementată în hardware, astfel încât procesul de semnare este realizat de o Enclavă de cotare privilegiată furnizată de Intel cu acces la cheia de atestare SGX, o cheie asimetrică hardware unică pentru fiecare platformă. Cheia de atestare SGX nu există în momentul în care procesorul a fost creat. Este emis ulterior, folosind Provisioning Enclave furnizată de Intel [5] .
Deoarece semnătura este calculată în Enclava de cotare, este nevoie de un canal de comunicare securizat între enclava în curs de validare software și Enclava de cotare. Această problemă este rezolvată folosind mecanismul local de atestare [5] .
Dacă serverul de la distanță stabilește că enclava a fost creată corect și rulează pe un procesor autentic Intel SGX, acum poate avea încredere în enclavă și îi poate transmite secrete printr-un canal de încredere [9] .
În calculul de la distanță, conținutul enclavei este descărcat de software-ul de sistem pe computer și, prin urmare, nu ar trebui să conțină secrete clare. După inițializare, există un proces de atestare în care enclava este autentificată pe un server la distanță. După autentificarea cu succes, serverul de la distanță este de așteptat să dezvăluie unele secrete în enclavă printr-un canal de comunicare securizat. Designul Intel SGX încearcă să se asigure că hash-ul calculat în timpul procesului de atestare reflectă cu acuratețe conținutul încărcat în enclavă [8] .
SGX oferă, de asemenea, un sistem de identificare bazat pe certificate. Este folosit pentru a face schimb de secrete între enclave care au certificate emise de aceeași autoritate de certificare. Procesul de schimb implică criptarea secretelor înainte de a le transmite unui software de sistem care nu are încredere, care apoi le transferă într-o altă enclavă [5] [8] .
Același mecanism poate fi folosit pentru a stoca în cache secretele obținute în timpul procesului de atestare pe medii de stocare neîncrezătoare gestionate de software-ul de sistem. Această memorie cache poate reduce numărul de procese de atestare într-un sistem distribuit [5] .
Pe 27 martie 2017, cercetătorii de la Universitatea de Tehnologie din Graz au dezvoltat un prototip capabil să obțină chei RSA de la enclavele SGX care rulează pe același sistem [11] [12] folosind un atac temporizat în cinci minute . O contramăsuri împotriva acestui tip de atac a fost prezentată și publicată de Daniel Gruss și colab. la Simpozionul de securitate USENIX din 2017 [13] . Printre alte contramăsuri publicate pe 28 septembrie 2017 a fost utilitarul DR.SGX. Se pretinde că DR.SGX are performanțe superioare în timp ce este mult mai ușor de implementat decât alte soluții propuse [14] .
Grupul LSDS de la Imperial College London a demonstrat că o vulnerabilitate speculativă de securitate Spectre ar putea fi adaptată pentru a ataca enclava [15] . Atacul Foreshadow , descoperit în august 2018, combină execuția speculativă și depășirea tamponului pentru a ocoli SGX [16] .
Pe 8 februarie 2019, cercetătorii de la Universitatea de Tehnologie din Graz au publicat rezultate ale cercetării care au arătat că în unele cazuri este posibil să ruleze cod rău intenționat din enclavă în sine [17] . Documentul susține că, din cauza naturii confidențiale și protejate a enclavei, software-ul antivirus nu poate detecta și elimina programele malware care se află în ea. Cu toate acestea, deoarece soluțiile antivirus moderne monitorizează apelurile de sistem și interacțiunile aplicațiilor cu sistemul de operare, ar trebui să fie posibilă identificarea enclavelor rău intenționate după comportamentul lor. Intel a lansat o declarație în care afirmă că acest atac nu face parte din modelul de amenințare SGX, că nu poate garanta că codul executat de utilizator provine din surse de încredere și a îndemnat consumatorii să folosească numai cod de încredere [18] .
Cercetătorii de la Universitatea din Graz din Austria au descoperit o nouă vulnerabilitate periculoasă bazată pe măsurarea tensiunii CPU, care permite extragerea cheilor AES și RSA dintr-o enclavă SGX sigură. Această caracteristică a fost prezentă în toate procesoarele Intel încă de la Sandy Bridge , în care funcțiile northbridge au fost complet înlocuite de un agent de sistem integrat în matrița procesorului. Vulnerabilitatea exploatează capacitatea sistemului RAPL (Running Average Power Limit), care nu necesită acces privilegiat, de a obține estimări detaliate ale consumului de energie al nucleului, agentului de sistem și DRAM [19] . Pentru a combate vulnerabilitatea, Intel a lansat un patch cu microcod (INTEL-SA-0389 [20] ).