Programare i securitate la nivelul arhitecturii x 86

  • Slides: 23
Download presentation
Programare și securitate la nivelul arhitecturii x 86 Prof. dr. ing. Gheorghe Sebestyen Cursul

Programare și securitate la nivelul arhitecturii x 86 Prof. dr. ing. Gheorghe Sebestyen Cursul 2 Arhitectura Intel ISA X 86 -64 n Modul “Long”

ISA x 86 -64 n n Dezvoltat initial de AMD (AMD 64 – AMD

ISA x 86 -64 n n Dezvoltat initial de AMD (AMD 64 – AMD K 8) prin extinderea arhitecturii de 32 biti la 64 biti Ulterior adoptat si de Intel (care avea un alt plan pentru ISA x 64) n n n Extinderea registrelor generale la 64 biti Instructiuni pe 64 biti Adrese: n n n Teoretic pe 64 biti Practic pe 40 biti = 1 Tbytes – memorie fizica maxima Memorie virtuala pe 48 biti =256 Tbytes Adaugarea de 8 noi registre generale R 8 -15 Introducerea modului de operare “long” Accepta si modurile traditionale (legacy): n n In modul Long: n Modul 64 -biti n Modul Compatibil: n modul protejat pe 32 si 16 biti; nu accepta modul real si virtual In modul Legacy: n Mod protejat 16 si 32 biti n Mod virtual n Mod real

“Harta” modurilor de lucru (ISAx 86 -64) 64 -bit mode Sursa: wikipedia

“Harta” modurilor de lucru (ISAx 86 -64) 64 -bit mode Sursa: wikipedia

Moduri de operare pentru procesoare pe 64 de biti Mod de operare Nr. Registre

Moduri de operare pentru procesoare pe 64 de biti Mod de operare Nr. Registre generale Dim. tipica a registrelor generale 8, 16, 32, sau 64 biti 16 registre 64 biti 32 biti 8, 16, sau 32 biti 8 registre 32 biti 16 biti 8, 16, sau 32 biti 8 registre 32 biti 32 -bit protected mode code 32 biti 8, 16, sau 32 biti 8 registre 32 biti SO sau bootloader pe 16 -biti mod protejat, sau 32 - sau 64 -biti boot loader 16 -bit protected mode code 16 biti 8, 16, sau 32 biti 8 registre 16 sau 32 biti Modul virtual 8086 SO pe 16 - sau 32 -biti in modprotejat 16 -bit real mode code 16 biti 8, 16, sau 32 biti 8 registre 16 sau 32 biti Modul real SO sau bootloader pe 16 -biti in modul real sau, sau 32 - sau 64 -bit boot loader 16 -bit real mode code 16 biti 8, 16, sau 32 biti 8 registre 16 sau 32 biti Sub-mod de operare Modul 64 -biti Modul “long” Modul compatibil Modul protejat Modul mostenit (legacy) Tip de cod care ruleaza Dimensiune default pt. adresa Dimensiune default pentru operanzi SO sau bootloader pe 64 -biti 64 -bit code 64 biti 32 biti SO sau bootloader pe 64 -biti 32 -bit protected mode code 32 biti SO pe 64 -biti 16 -bit protected mode code SO sau bootloader pe 32 -biti, sau bootloader pe 64 -biti Sistem de operare necesar Operanzi suportanti/ acceptati

Moduri de operare pentru procesoare pe 64 de biti

Moduri de operare pentru procesoare pe 64 de biti

Modificari in Modul Long n Indicator “No-execute” atasat paginilor pentru a indica daca continutul

Modificari in Modul Long n Indicator “No-execute” atasat paginilor pentru a indica daca continutul unei pagini poate sa fie executat sau nu n n n Prin acest bit se evita atacurile de tip "buffer overrun" sau "unchecked buffer" Anterior aceasta functie de protectie se solutiona prin segmentare (indicatori in descriptorul de segment) Modul Long renunta la segmentare – toate segmentele incep la adresa 0 si cuprind toata memoria fizica (4 Gbytes) n n Registrele segment CS, DS, ES, SS nu se folosesc; exceptie fac registrele FS si GS folosite in cazuri speciale Se foloseste un model de memorie “flat” adica nestructurat pe segmente; practic toate segmentele se suprapun

Modificari in Modul Long n Eliminarea unor elemente din modurile traditionale (legacy): n n

Modificari in Modul Long n Eliminarea unor elemente din modurile traditionale (legacy): n n Registrele segment (mai putin FS si GS) Lipsesc urmatoarele instructiuni: n n n de salvare si refacere a registrelor segment, PUSHA/POPA, BOUND, INTO JMP si CALL cu adresa directa de tip “far” Se lucreaza cu un spatiu virtual de adrese generat prin mecanismul de paginare

Adrese canonice in spatiul virtual de adrese Implementare pe 48 linii de adresa n

Adrese canonice in spatiul virtual de adrese Implementare pe 48 linii de adresa n n n Implementare pe 56 linii de adresa Implementare pe 64 linii de adresa In implementarile actuale se folosesc doar 48 din cele 64 de linii posibile de adresa Pentru a ocupa intregul spatiu de 264 bytes si pentru a da senzatia de continuitate a memoriei toate adresele A 48 -A 63 copiaza bitul A 47 pe principiul “extensie de semn” Astfel se asigura scalabilitatea si compatibilitatea cu versiuni care au 64 linii de adresa Pentru 48 linii de adresa spatiul disponibil este de: n 0 - 00007 FFF'FFFF si FFFF 8000'0000 - FFFF'FFFF Partea superioara a memoriei este de obicei folosita de sistemul de operare (kernel space) iar partea inferioara de aplicatiile utilizator (user space) Adresa canonica = adresa care respecta aceste reguli

Paginarea n n Metoda de extindere a memoriei interne (fizice) peste memoria externa Inlocuieste

Paginarea n n Metoda de extindere a memoriei interne (fizice) peste memoria externa Inlocuieste segmentarea in modul long Simplifica calculul adreselor de memorie Bazat pe principiul localitatii temporale si spatiale a datelor: n n n Localitate temporala: daca o locatie a fost adresata, are sanse mari sa fie re-adresata in viitorul apropiat Localitate spatiala: daca o locatie este adresata atunci si vecinii sai au o probabilitate mare sa fie adresati in viitorul apropiat Consecinta: prin paginare vor fi aduse in memoria fizica blocuri de memorie (pagini) care au o probabilitate mai mare sa fie utilizate

Paginarea Pagina Adresa liniara Adresa fizica 1 1234567 xxx 0000 2 1234568 xxx 00003000

Paginarea Pagina Adresa liniara Adresa fizica 1 1234567 xxx 0000 2 1234568 xxx 00003000 3 123456 Axxx 00001000 4 1234800 xxx 00005000 Aplicatia 1 Tabela de paginare Aplicatia 2 Memoria fizica Memoria virtuala

Paginarea cu tabele de pagini ierarhizate n Problema: o singura tabela de pagina ocupa

Paginarea cu tabele de pagini ierarhizate n Problema: o singura tabela de pagina ocupa prea mult in memorie n n Ex: Mem. virt. = 256 TB(248); Mem. fizica=4 GB(232); 1 pagina=4 k. B (212) => 64 Gpagini (252) *4 bytes=256 GB memorie fizica necesara pentru tabela de pagini Solutie: organizarea unei structuri ierarhice cu directoare si tabele de pagini Sursa: wikipedia

Paginarea extinsa – Physical Address Extension (PAE) n n Tabela de pagina organizata pe

Paginarea extinsa – Physical Address Extension (PAE) n n Tabela de pagina organizata pe 3 nivele Aparut pe procesoarele pe 32 biti (ex. Pentium pro) Sursa: wikipedia

Paginarea in Modul Long n n Superset al paginarii PAE Pagini de: n 4

Paginarea in Modul Long n n Superset al paginarii PAE Pagini de: n 4 KB sau 2 MB – procesoare pe 32 biti n 1 GB (modul long) Se folosesc 4 nivele de paginare (in loc de 3) Indicator “No-execute” care arata ca o pabina nu se poate executa Page map Page directory pointer table Page directory Page table Memoria fizica

Trecerea in modul protejat n n n La resetare procesorul este in modul real

Trecerea in modul protejat n n n La resetare procesorul este in modul real – pentru a accesa toate resursele si instructiunile fara a se genera exceptii Modificarea unui indicator (PE-flag = Protected ode enable) din registru de stare (PSW) determina trecerea in modul protejat, DAR – trebuie facute anumite operatii inainte si dupa modificarea acestui indicator In CR 0 (Control register 0) bitul 0 indica Modul curent al procesorului: n n PE=1 – Mod protejat PE = 0 – Mod real

Trecerea in modul protejat Pasii de urmat pentru a trece din Moul Real in

Trecerea in modul protejat Pasii de urmat pentru a trece din Moul Real in Modul Protejat: 1. Creaza un pseudo-descriptor de 6 octeti care sa poanteze la GDT 1. 2. 3. 4. Daca se va folosi paginarea, incarca in CR 3 cu adresa unei tabele de pagina valide, PDBR, sau PML 4. Daca se va folosi PAE (Physical Address Extension) , seteaza CR 4. PAE = 1. Daca se va comuta pe modul long, seteaza IA 32_EFER. LME = 1. Invalideaza intreruperile (IF=0 prin CLI). Incarca un pseudo-descriptor IDT care limita nula (aceasta nu permite utilizarea tabelei de intreruperi IDT din modul real in modul protejat) Seteaza indicatorul PE al registrului MSW sau CR 0 (daca se foloseste paginarea se seteaza si indicatorul PG – page enable)

Trecerea in modul protejat (continuare) Executa un salt “far” la inceputul secventei executate in

Trecerea in modul protejat (continuare) Executa un salt “far” la inceputul secventei executate in modul protejat 6. • 7. 8. 9. 10. In cazul comutarii in modul long, chiar daca codul segment destinatie este pe 64 -biti, offsetul nu trebuie sa depaseasca 32 biti deoarece saltul se face in modul “compatibil”. Incarca registrele segment de date cu selectoare valide pentru a evita exceptii de tip GP (general protection) cand apar intreruperile Incarca SS: (E)SP cu adresa valida a stivei Incarca un pseudo-descriptor IDT care poanteaza catre IDT Valideaza intreruperile (IF=1 prin STI).

Exemplu de program cli lgdt [gdtr] or al, 1 ; invalidare intreruperi ; incarca

Exemplu de program cli lgdt [gdtr] or al, 1 ; invalidare intreruperi ; incarca registrul GDT cu adresa tabelei GTD ; seteazabitul PE (Protection Enable) in CR 0 ; (Control Register 0) mov cr 0, eax ; Salt “far” la selectorul 08 h (offset in GDT, indicand la un descriptor de segment de cod de 32 bit ) ; pentru a incarca CS cu descriptorul potrivit) JMP 08 h: PMode. Main ; [. . . ] PMode. Main: ; incarca DS, ES, FS, GS, SS, ESP.

Construirea unei tabele GDT n Elemente necesare: n n n Un Descriptor nul –

Construirea unei tabele GDT n Elemente necesare: n n n Un Descriptor nul – nefolosit direct de procesor. Se poate folosi pentru a pastra chiar adresa (pointer la) GDT Un Descriptor de segment pentru cod (pentru kernel D-voastra, ar trebui sa aiba tipul=0 x 9 A) Un Descriptor de segment pentru date (Tipul=0 x 92) Un Descritor de segment TSS Spatu pentru alte segmente daca sunt necesare (Ex. de nivel utilizator, LDT-uri, mai multe TSS-uri, etc. )

Exemple de GDT – varianta flat, 4 GB ; varianta flat, 4 GB GDT[0]

Exemple de GDT – varianta flat, 4 GB ; varianta flat, 4 GB GDT[0] = {. base=0, . limit=0, . type=0}; // Selectorul 0 x 00 nu poate fi folosit GDT[1] = {. base=0, . limit=0 xffff, . type=0 x 9 A}; // Selectorul 0 x 08 va fi pentru cod GDT[2] = {. base=0, . limit=0 xffff, . type=0 x 92}; // Selectorul 0 x 10 va fi pentru date GDT[3] = {. base=&my. Tss, . limit=sizeof(my. Tss), . type=0 x 89}; //se poate folosi instr. LTR(0 x 18) Load Task register ; varianta “Small kernel” GDT[0] = {. base=0, . limit=0, . type=0}; // Selectorul 0 x 00 nu poate fi folosit GDT[1] = {. base=0 x 04000000, . limit=0 x 03 ffffff, . type=0 x 9 A}; // Selectorul 0 x 08 va fi pentru cod GDT[2] = {. base=0 x 08000000, . limit=0 x 03 ffffff, . type=0 x 92}; // Selectorul 0 x 10 va fi pentru date GDT[3] = {. base=&my. Tss, . limit=sizeof(my. Tss), . type=0 x 89}; // se poate folosi instr. LTR(0 x 18) Load Task register

Trecerea in Modul Long n n Modul long – noul mod pentru procesoarele pe

Trecerea in Modul Long n n Modul long – noul mod pentru procesoarele pe 64 biti Pasii pentru a trece din Modul Protejat in Modul Long: 1. Daca paginarea este validata atunci invalideaza paginarea (CR 0. PG=0) 2. Daca CR 4. PAE nu este setat, se seteaza 3. Seteaza IA 32_EFER. LME = 1. (tipul de paginare folosit – IA-32 e paging) 4. Construieste ierarhia de paginare: PML 4 ->PDPT->PDT->PT 5. Incarca CR 3 cu adresa unei tabele PML 4 valide. 6. Valideaza paginarea (CR 0. PG=1). 7. In acest punct esti in modul “compatibil”. Se executa un salt “far” pentru a trece in modul long. Totusi, offsetul nu trebuie sa depaseasca 32 -biti. (vezi Setting Up Long Mode - OSDev Wiki. htm)

Registre de control aditionale (adaugate pentru modul long) n Extended Feature Enable Register (EFER)

Registre de control aditionale (adaugate pentru modul long) n Extended Feature Enable Register (EFER) n Pentru a intra si a iesi din modul long n Pentru a permite instructiunile de apel si revenire (SYSCALL/SYSRET) din rutine sistem Bit Scop 63 -16 Rezervat 15 TCE (Translation Cache Extension) 14 FFXSR (Fast FXSAVE/FXRSTOR) 13 LMSLE (Long Mode Segment Limit Enable) 12 SVME (Secure Virtual Machine Enable) 11 NXE (No-Execute Enable) 10 LMA (Long Mode Active) 9 Reserved 8 LME (Long Mode Enable) 7 -1 Reserved 0 SCE (System Call Extensions)

Scrierea unui Bootloader n n Bootloader – secventa de program care incarca un sistem

Scrierea unui Bootloader n n Bootloader – secventa de program care incarca un sistem de operare (un kernel) Are o pozitie predefinita cunoscuta de functia BIOS care rolul de a lansa un sistem de operare n n Ce face un bootloader? n n n Ex. la sistemele DOS (Disk Operating System) este primul sector de pe pista 0 si capul de citire 0 de pe prima unitate de disc accesibila pentru incarcarea SO (bootable driver) Incarca kernelul SO in memoria calculatorului Furnizeaza kernelului informatii necesare despre sistemul hardware Comuta procesorul intr-un Mod de lucru agreat de kernel (ex. Modul protejat, validarea A 20 si incarcarea tabelei GDT) Lanseaza in executie Kernelul Pe durata executarii bootloader-ului intreruperile sunt de obicei blocate

Scrierea unui Bootloader n Tipuri de bootare: n n n Incarcarea unor SO-uri multiple

Scrierea unui Bootloader n Tipuri de bootare: n n n Incarcarea unor SO-uri multiple n n One stage bootloader – de obicei un sector pe disc (512 octeti) care incarca intregul kernel Two stage bootloader – incarcare in 2 etape: bootloaderul are 2 parti; se incarca primul (mai scurt) si apoi al doilea (mai lung) Bootloader complex care trebuie sa stie sa trateze tabela de partitionare si sistemul de fisiere de pe un disc – aproape la fel de complicat ca si un SO simplu Lansarea unui bootloader: n La PC-uri – prin apelarea intreruperii INT 19 H, care citeste primul sector de pe disc si il lanseaza in executie