Ce este un sistem de operare bazat pe capabilități
Sistemele de operare moderne impun granițe de securitate între procese, fișiere, dispozitive și utilizatori. Totuși, modul în care aceste granițe sunt implementate variază semnificativ între diferite modele de sistem.
Majoritatea sistemelor de operare obișnuite se bazează pe controlul accesului bazat pe identitate și pe spații de nume globale. Sistemele de operare bazate pe capabilități adoptă o abordare fundamental diferită: reprezintă autoritatea în mod explicit și o tratează ca pe un concept de prim rang.
Această postare introduce sistemele bazate pe capabilități, explică în ce se deosebesc de modelele tradiționale și arată de ce sunt centrale pentru designul EriX.
Problema: autoritatea ambientală⌗
În sistemele tradiționale, procesele au adesea acces la resurse prin autoritate ambientală.
Autoritatea ambientală înseamnă că un program poate accesa o resursă doar pentru că aceasta există într-un spațiu de nume partajat și sistemul decide că programul are permisiunea de a o folosi.
De exemplu:
- Un proces poate deschide
/etc/passwddacă are permisiuni suficiente. - Un program se poate conecta la un socket de rețea dacă sistemul de operare îi permite.
- Un serviciu poate accesa fișiere în funcție de identitatea utilizatorului sau de apartenența la grup.
În toate aceste cazuri, autoritatea de a accesa resursa este implicită.
Procesul nu deține o referință directă și explicită la resursă. În schimb, se bazează pe:
- nume globale (căi de fișiere, porturi, identificatori de dispozitive)
- verificări de acces (ID-uri de utilizator, permisiuni, ACL-uri)
Acest model creează mai multe probleme:
1. Problema delegatului confuz⌗
Un program își poate folosi accidental autoritatea în mod greșit în numele altui program.
De exemplu, un serviciu privilegiat ar putea citi un fișier cerut de un client nesigur, chiar dacă acel client nu ar trebui să aibă acces la fișier.
2. Autoritate prea largă⌗
Programele rulează adesea cu mai multe permisiuni decât au nevoie în realitate. Acest lucru mărește impactul erorilor sau al compromiterilor de securitate.
3. Analiză dificilă⌗
Este greu de determinat ce are voie să facă un proces fără să analizezi starea globală, identitățile utilizatorilor și politicile de control al accesului.
Ideea centrală: capabilitățile⌗
O capabilitate este un token nefalsificabil care oferă acces la un obiect specific, cu drepturi specifice.
În loc să întrebe:
“Are acest proces permisiunea să acceseze această resursă?”
un sistem bazat pe capabilități întreabă:
“Deține acest proces o capabilitate care autorizează această operație?”
Dacă răspunsul este nu, operația nu poate continua.
Proprietățile capabilităților⌗
Capabilitățile au mai multe proprietăți definitorii:
1. Nefalsificabilitate⌗
Un proces nu poate crea o capabilitate validă din nimic.
Capabilitățile sunt create și gestionate de nucleu, ceea ce garantează că nu pot fi falsificate sau ghicite.
2. Autoritate explicită⌗
Toată autoritatea este reprezentată explicit prin capabilități.
Dacă un proces poate executa o operație, trebuie să dețină o capabilitate care permite acea operație. Nu există acces implicit prin spații de nume globale.
3. Drepturi granulare⌗
Capabilitățile pot codifica permisiuni specifice, precum:
- acces doar pentru citire
- acces pentru scriere
- permisiuni de execuție
- subseturi limitate de operații
Acest lucru permite control precis asupra a ceea ce poate face fiecare proces.
4. Transferabilitate⌗
Capabilitățile pot fi transferate între procese, de obicei prin comunicare inter-proces (IPC).
Acest lucru permite delegarea controlată a autorității.
Obiecte și capabilități⌗
Într-un sistem bazat pe capabilități, totul este modelat ca un obiect:
- regiuni de memorie
- fișiere
- dispozitive
- endpoint-uri IPC
- procese
O capabilitate este o referință la un obiect combinată cu un set de drepturi.
Un proces interacționează cu sistemul invocând operații asupra obiectelor prin intermediul capabilităților sale.
Nu este nevoie de nume globale precum căi de fișiere sau identificatori de dispozitive în interiorul nucleului. Orice acces este mediat prin capabilități.
Cum funcționează sistemele bazate pe capabilități⌗
La nivel înalt, un sistem bazat pe capabilități funcționează astfel:
- Nucleul creează obiecte și capabilități.
- Fiecare proces are un spațiu de capabilități (adesea numit CSpace), care își stochează capabilitățile.
- Un proces poate opera doar asupra obiectelor pentru care deține capabilități.
- Capabilitățile pot fi transferate între procese prin IPC.
- Nucleul aplică toate verificările de capabilități.
Rezultatul este un sistem în care autoritatea este:
- explicită
- localizată
- transferabilă
- ușor de analizat
Exemplu: deschiderea unui fișier⌗
Modelul tradițional⌗
Într-un sistem tradițional:
- Un proces apelează
open("/etc/config") - Nucleul verifică permisiunile:
- ID-ul utilizatorului
- apartenența la grup
- biții de mod ai fișierului
- Dacă accesul este permis, este returnat un descriptor de fișier
Autoritatea vine din stare globală și identitate.
Modelul bazat pe capabilități⌗
Într-un sistem bazat pe capabilități:
- Un proces trebuie să dețină deja o capabilitate de fișier
- Folosește acea capabilitate pentru a executa operații de citire sau scriere
Dacă procesul nu are capabilitatea, nu poate accesa fișierul indiferent ce nume folosește.
Nu există niciun pas de căutare globală în interiorul nucleului.
Delegare și privilegiu minim⌗
Unul dintre cele mai puternice aspecte ale sistemelor bazate pe capabilități este delegarea.
Un proces poate da altui proces un subset din autoritatea sa transferându-i o capabilitate.
De exemplu:
- Un server de fișiere oferă unui client acces doar pentru citire la un fișier
- Un manager de memorie acordă acces la o regiune de memorie specifică
- Un proces acordă acces la un endpoint IPC
Acest lucru permite principiul privilegiului minim:
Fiecare componentă primește doar autoritatea de care are efectiv nevoie.
Eliminarea autorității ambientale⌗
Sistemele bazate pe capabilități elimină complet autoritatea ambientală.
Nu există:
- spații de nume globale în interiorul nucleului
- acces implicit bazat pe identitate
- privilegii ascunse
Toată autoritatea trebuie transmisă explicit.
Acest lucru face mult mai ușoară analiza:
- a ceea ce poate face un proces
- a modului în care autoritatea circulă prin sistem
- a locurilor în care pot apărea probleme potențiale de securitate
Revocarea (o problemă dificilă)⌗
Una dintre provocările sistemelor bazate pe capabilități este revocarea.
După ce o capabilitate este dată unui proces, cum poate fi retrasă?
Sisteme diferite implementează revocarea în moduri diferite:
- straturi de indirecție
- urmărirea referințelor
- arbori de capabilități
- mecanisme de versionare
Revocarea este o zonă importantă de cercetare și va fi explorată în etapele ulterioare ale EriX.
Sistemele bazate pe capabilități în practică⌗
Ideile bazate pe capabilități nu sunt noi. Mai multe sisteme le-au implementat:
- KeyKOS / EROS
- seL4 (un micronucleu verificat formal)
- CHERI (capabilități asistate de hardware)
- Capsicum (extensii de capabilități pentru FreeBSD)
Aceste sisteme demonstrează că proiectele bazate pe capabilități sunt atât practice, cât și puternice.
Cum folosește EriX capabilitățile⌗
EriX este proiectat de la început ca un sistem bazat pe capabilități.
În EriX:
- toată autoritatea este reprezentată prin capabilități
- capabilitățile sunt puternic tipizate
- capabilitățile sunt imuabile după creare
- capabilitățile sunt transferate prin IPC
- nucleul aplică nefalsificabilitatea și invariantele de siguranță
Nu există spații de nume globale în interiorul nucleului. Orice acces la resurse este mediat prin capabilități.
Acest lucru se aliniază cu obiectivul mai larg de a face autoritatea:
- explicită
- minimă
- ușor de analizat
De ce contează asta⌗
Sistemele bazate pe capabilități oferă o bază pentru construirea:
- unor sisteme mai sigure
- unor arhitecturi mai modulare
- unor sisteme mai ușor de analizat și verificat
Prin eliminarea autorității implicite și făcând explicit orice acces, ele elimină clase întregi de vulnerabilități care sunt comune în sistemele tradiționale.
Ce urmează⌗
Capabilitățile sunt un concept fundamental în EriX. În postările viitoare vom explora cum sunt implementate în practică, inclusiv:
- spații de capabilități (CSpace)
- comunicare inter-proces (IPC)
- gestionarea memoriei folosind capabilități netipizate
- delegare și grafuri de autoritate
Înțelegerea capabilităților este primul pas spre înțelegerea restului sistemului.