Protectia memoriei este o modalitate de a controla drepturile de acces la memorie de pe un computer si este o parte din cele mai moderne arhitecturi ale seturilor de instructiuni si sistemelor de operare.

Scopul principal al protectiei memoriei este de a impiedica accesul unui proces la memoria care nu i-a fost alocata. Acest lucru impiedica o eroare sau un malware sa intre intr-un anumit proces si sa afecteze alte procese sau sistemul de operare in sine.

Protectia poate cuprinde toate accesele la o anumita zona de memorie, accesari de scriere sau incercari de a executa continutul zonei. Incercarea de a accesa memoria neautorizata are ca rezultat o defectiune hardware, numita o defectiune de segmentare sau o exceptie de incalcare a stocarii, cauzand, in general, incetarea anormala a procesului. Protectia memoriei pentru securitatea computerului include tehnici suplimentare, cum ar fi randomizarea dispunerii spatiului de adrese si protectia spatiului executabil.

Metode

Segmentarea

Segmentarea se refera la impartirea memoriei unui computer in segmente. O referinta la o locatie de memorie include o valoare care identifica un segment si o compensare in cadrul acelui segment.

Arhitectura x86 are mai multe caracteristici de segmentare, care sunt utile pentru utilizarea memoriei protejate pe aceasta arhitectura. Pe arhitectura x86, tabelul descriptorului global si tabelele descriptorilor locali pot fi utilizate pentru a face referire la segmente din memoria computerului.

Indicatoarele pentru segmentele de memorie pe procesoarele x86 pot fi de asemenea stocate in registrele de segmente ale procesorului. Initial procesoarele x86 aveau 4 registre de segment, CS (segment de cod), SS (segment de stiva), DS (segment de date) si ES (segment suplimentar); ulterior au fost adaugate alte doua registre de segment – FS si GS.

Memorie virtuala in pagina

In paginarea spatiului cu adrese de memorie, mediul este impartit in blocuri de dimensiuni egale numite pagini. Folosind hardware-ul de memorie virtuala, fiecare pagina poate sta in orice locatie a memoriei fizice a computerului sau poate fi semnalizata ca fiind protejata. Memoria virtuala face posibila existenta unui spatiu de adrese de memorie virtuala liniara si utilizarea acesteia pentru accesarea blocurilor fragmentate, pe spatiul de adrese ale memoriei fizice.

Majoritatea arhitecturilor de calculator care accepta paginarea folosesc si paginile ca baza pentru protectia memoriei.

Un tabel de pagini mapeaza memoria virtuala cu memoria fizica. Tabelul de pagini este de obicei invizibil pentru proces. Tabelele de pagini faciliteaza alocarea unei memorii suplimentare, deoarece fiecare noua pagina poate fi alocata de oriunde in memoria fizica.

Este imposibil ca o aplicatie sa acceseze o pagina care nu i-a fost alocata in mod explicit, deoarece fiecare adresa de memorie fie indica o pagina alocata acelei aplicatii, fie genereaza o intrerupere numita eroare de pagina. Paginile nealocate si paginile alocate oricarei alte aplicatii nu au nicio adresa din punct de vedere al aplicatiei.

O eroare de pagina poate sa nu indice neaparat o eroare. Defectiunile de pagina nu sunt utilizate numai pentru protectia memoriei. Sistemul de operare poate gestiona tabela de pagina in asa fel incat o referinta la o pagina care a fost schimbata anterior pe disc sa provoace o defectiune a paginii. Sistemul de operare intercepteaza defectul paginii, incarca pagina de memorie necesara si aplicatia continua ca si cum nu s-a produs nicio eroare.

Aceasta schema, cunoscuta sub numele de memorie virtuala, permite ca datele din memorie care nu sunt utilizate in prezent sa fie mutate in stocarea pe disc si inapoi intr-un mod transparent pentru aplicatii, pentru a creste capacitatea de memorie generala.

In unele sisteme, mecanismul de eroare al paginii este utilizat si pentru protectia spatiului executabil, cum ar fi W ^ X.

Chei de protectie

O cheie de protectie a memoriei (MPK) imparte memoria fizica in blocuri de o anumita dimensiune (de exemplu, 4 KiB), fiecare avand o valoare numerica asociata numita cheie de protectie. Fiecare proces are, de asemenea, o valoare a cheii de protectie asociata cu acesta.

Pe un acces la memorie, hardware-ul verifica daca cheia de protectie a procesului curent se potriveste cu valoarea asociata blocului de memorie accesat; daca nu, apare o exceptie. Acest mecanism a fost introdus in arhitectura System / 360. Este disponibil pe mainframe-urile System Z de astazi si este foarte utilizat de sistemele de operare System Z si de subsistemele lor.

Tastele de protectie System / 360 descrise mai sus sunt asociate cu adrese fizice. Acest lucru este diferit de mecanismul de cheie de protectie utilizat de arhitecturi precum Hewlett-Packard / Intel IA-64 si Hewlett-Packard PA-RISC, care sunt asociate cu adrese virtuale si care permit mai multe chei pe proces.

In arhitecturile Itanium si PA, traducerile (intrari TLB) au chei (Itanium) sau ID-uri de acces (PA) asociate cu acestea. Un proces de rulare are mai multe registre – cheie de protectie (16 pentru Itanium, 4 pentru HP / PA ). O traducere selectata de adresa virtuala are cheia sa in comparatie cu fiecare dintre registrele de chei de protectie.

Daca oricare dintre acestea se potriveste (plus alte verificari posibile), accesul este permis. Daca nu se potriveste, se genereaza o defectiune sau o exceptie. Daca doriti, instrumentul de gestionare a erorilor software poate verifica cheia care lipseste pe o lista mai mare de chei intretinute de software; astfel, registrele de cheie de protectie din interiorul procesorului, pot fi tratate ca un cache gestionat de software al unei liste mai mari de chei asociate cu un proces.

PA are 15-18 biti de cheie; Itanium are cel putin 18. Tastele sunt de obicei asociate cu domenii de protectie, cum ar fi bibliotecile, modulele etc.

In x86, arhitectura tastelor de protectie permite etichetarea adreselor virtuale pentru paginile utilizatorului cu oricare din cele 16 taste de protectie. Toate paginile etichetate cu aceeasi cheie de protectie constituie un domeniu de protectie. Un nou registru contine permisiunile asociate cu fiecare domeniu de protectie.

Operatiunile de incarcare si stocare sunt verificate atat cu permisiunile tabelului de pagina, cat si cu permisiunile de cheie de protectie asociate domeniului de protectie a adresei virtuale si sunt permise numai daca ambele permisiuni permit accesul.

Permisiunile de cheie de protectie pot fi setate din spatiul utilizatorului, permitand aplicatiilor sa restrictioneze direct accesul la datele aplicatiei fara interventia sistemului de operare. Intrucat cheile de protectie sunt asociate cu o adresa virtuala, domeniile de protectie sunt pe spatiul de adresa, astfel incat procesele care ruleaza in spatii de adrese diferite, pot utiliza fiecare cele 16 domenii.

Segmentare simulata

Simularea este utilizarea unui program de monitorizare pentru a interpreta instructiunile codului masinii ale unor arhitecturi de calculator. Un astfel de simulator de set de instructiuni, poate oferi protectie a memoriei folosind o schema asemanatoare segmentarii si validand adresa si tinta fiecarei instructiuni in timp real, inainte de a le efectua.

Simulatorul trebuie sa calculeze adresa si lungimea tintei si sa o compare cu o lista de intervale de adrese valide pe care le detine in ceea ce priveste mediul thread, cum ar fi orice blocuri de memorie dinamice dobandite de la inceputul firului, plus orice sloturi de memorie statice partajate valide.

Sensul de „valid” se poate schimba de-a lungul vietii firului, in functie de context. Uneori poate fi permisa modificarea unui bloc static de stocare si, uneori nu, in functie de modul de executie curent, care poate sau nu sa depinda de o cheie de stocare sau de o stare de supraveghere.

In general, nu este recomandabil sa folositi aceasta metoda de protectie a memoriei atunci cand exista facilitati adecvate pe un procesor, deoarece acest lucru preia o putere de procesare valoroasa de la computer.

Cu toate acestea, este utilizata in general pentru scopuri de depanare si testare pentru a oferi un nivel suplimentar de granularitate la incalcari de stocare generice, si altfel poate indica cu exactitate ce instructiune incearca sa suprascrie sectiunea particulara de stocare, care poate avea aceeasi cheie de stocare ca si stocarea neprotejata.

Adresarea bazata pe capacitati

Adresarea bazata pe capacitati este o metoda de protectie a memoriei care nu este utilizata in computerele comerciale moderne. In aceasta metoda, indicatoarele sunt inlocuite de obiecte protejate (numite capabilitati) care pot fi create numai folosind instructiuni privilegiate care pot fi executate doar de kernel sau un alt proces autorizat in acest sens.

Acest lucru permite efectiv controlul kernelului, ale carui procese pot accesa obiectele din memorie, fara a fi nevoie sa folositi spatii de adrese separate sau comutatoare de context.

Doar cateva produse comerciale au folosit securitatea bazata pe capacitati: Plessey System 250, IBM System / 38, arhitectura Intel iAPX 432 si KeyKOS. Abordarile de capabilitate sunt utilizate pe scara larga in sistemele de cercetare precum EROS si Combex DARPA Browser.

Acestea sunt utilizate conceptual ca baza pentru unele masini virtuale, in special Smalltalk si Java. In prezent, proiectul CHERI finantat de DARPA de la Universitatea din Cambridge, lucreaza la crearea unei masini moderne de capabilitate, care sprijina si software-ul vechi.

Deconectare dinamica

Tainting-ul dinamic este o tehnica pentru protejarea programelor impotriva acceselor ilegale de memorie. Cand memoria este alocata, la timpul de executie, aceasta tehnica nuanteaza atat memoria cat si indicatorul corespunzator folosind acelasi marcaj. Marcajele sunt apoi propagate in mod adecvat in timp ce programul se executa si sunt verificate de fiecare data cand o adresa de memorie “m” este accesata printr-un pointer “p”; daca marcajele asociate cu m si p difera, executia este oprita si accesul ilegal este raportat.

Procesoarele SPARC M7 (si versiuni superioare) implementeaza o nuantare dinamica in hardware. Oracle comercializeaza aceasta caracteristica ca Silicon Secured Memory (SSM) (marcat anterior ca Application Data Integrity (ADI)).

Masuri

Nivelul de protectie al unei anumite implementari poate fi masurat prin respectarea cu atentie a principiului privilegiului minim.

Protectia memoriei in diferite sisteme de operare

Sisteme de operare diferite utilizeaza diferite forme de protectie sau separare a memoriei. Desi protectia memoriei a fost comuna in majoritatea sistemelor principale si a multor sisteme de minicomputere din anii 1960, separarea adevarata a memoriei nu a fost utilizata in sistemele de operare ale computerelor de domiciliu (pc-uri personale) pana cand OS / 2 (si in RISC OS) au fost lansate in 1987.

Pe sistemele anterioare, o astfel de lipsa de protectie a fost chiar utilizata ca forma de comunicare interproces, prin trimiterea unui indicator intre procese. Este posibil ca procesele sa acceseze memoria sistemului din familia sistemelor de operare Windows 9x.

Unele sisteme de operare care implementeaza protectia memoriei includ:

  • Sisteme asemanatoare Unix (de la sfarsitul anilor 1970), inclusiv Solaris, Linux, BSD, macOS, iOS si GNU Hurd
  • Plan9 si Inferno, create la Bell Labs ca succesori Unix (1992, 1995)
  • OS / 2 (1987)
  • RISC OS (1987)
  • Microware OS-9, ca modul optional (din 1992)
  • Familia Microsoft Windows din Windows NT 3.1 (1993)
  • Atari MultiTOS (din 1991)
  • Pharos (din 2017)

La sistemele Unix, apelul sistemului mprotect este utilizat pentru a controla protectia memoriei.