Espai d'usuari i espai de Kernel
Introducció
Els sistemes operatius tenen en comú una pràctica a l’hora de gestionar processos i recursos que afecta directament a la seguretat: la distinció entre espai de Kernel i l’espai d’usuari. Aquesta distinció serveix per definir el control que les aplicacions poden tenir sobre l’equip, i cal conèixer-la per entendre com funciona un sistema. En aquest post això és el que explorarem, descrivint en que consisteix cada espai, quines avantatges té utilitzar aquesta distinció i finalment posarem alguns exemples.
Què és l’espai de Kernel?
L’espai de kernel és una àrea de memòria on s’executa el codi de més baix nivell (codi del kernel). Aquí es gestionen els recursos del sistema (memòria, CPU,…) i els dispositius (hardware). Per tant, aquesta és una zona de memòria on el codi té tots els privilegis per realitzar qualsevol operació.
Atès que el codi dins aquesta àrea té tants permisos, és important restringir el codi que pot accedir-hi.
Operacions en espai de Kernel
-
Gestió de memòria
El kernel gestiona l’accès a la memòria i atorga a cada procès un espai de memòria protegit i independent per tal que diferents processos no interfereixin entre si.
-
Gestió de processos
El kernel s’ocupa de la creació, gestió i finalització de processos (incloent tasques com l’scheduling).
-
Gestió de dispositius
En aquest espai també s’executen els controladors (drivers) del hardware, per tal que el sistema pugui interactuar amb ells.
-
Seguretat i aïllament
El kernel assegura que els processos en espai d’usuari no puguin accedir a l’espai de kernel directament, aïllant així aquest espai i proporcionant seguretat.
Què és l’espai d’usuari?
L’espai d’usuari és l’àrea de memòria on s’executen les aplicacions i serveis que utilitzen els usuaris del sistema, com navegadors o jocs. Contrari a l’espai de kernel, el codi d’aquesta zona té pocs privilegis, pel que no pot accedir directament a recursos del sistema o a memòria d’altres processos sense que el kernel li permeti.
Operacions en espai d’usuari
-
Execució de programes en espai d’d’usuari
Qualsevol aplicació que s’executa en espai d’usuari (navegadors, jocs, processadors de text,…).
-
Accés a recursos de manera segura
Degut a que les aplicacions no poden accedir directament als recursos del sistema (memòria, hardware,…), han de passar per crides del sistema (system calls).
-
Aïllament de processos
Cada aplicació disposa d’un espai de memòria separat (assignat pel kernel), assegurant que no interfereixin entre si. Així, si un procès falla no interromprà el sistema.
-
Seguretat
Amb l’aïllament d’aquest espai de memòria, el codi maliciós no pot arribar a l’espai de kenrel si no està autoritzat.
Crides al sistema (System Calls)
Les crides al sistema són interfícies donades pel sistema operatiu per interactuar amb el kernel. Així, els programes en espai d’usuari poden accedir a recursos del sistema.
Alguns exemples d’aquestes en llenguatge C serien:
-
Manipulació de fitxers: open(), read() o write()
-
Creació de processos: fork()
-
Gestió de memòria compartida: mmap()
-
Interacció amb dispositius: ioctl()
Riscos i avantatges
Seguretat
Al separar espai d’usuari i espai de kernel, si rebem un atac en un programa en espai d’usuari és més difícil que l’atacant exploti recursos crítics, ja que des de l’espai d’usuari no es pot accedir directament al kernel.
Estabilitat del sistema
Un error d’una aplicació no ha de comportar més que una falla en la mateixa aplicació i res més, ja que està separada d’altres aplicacions i no pot afectar directament al kernel.
Rendiment
Aquesta separació implica un cost en la eficiència. Al realitzar crides al sistema, estem causant canvis de context entre espai d’usuari i espai de kernel, que causa un pitjor rendiment, sobretot en programes que requereixen moltes interaccions amb el kernel.
Un canvi de context és quan un procès surt de la CPU perquè n’entri un altre. Això implica que el sistema ha de guardar l’estat del primer procès per desprès seguir executant-lo.
El canvi de context entre espai d’usauri i espai de kernel és més costós ja que el sistema ha de canviar d’anell de protecció (de mode usuari a mode privilegiat).
Exemples de programes en espai de kernel
En l’actualitat tenim alguns exemples de programes en espai de kernel, com són CrowdStrike Falcon i Riot Vanguard:
CrowdStrike Falcon
És un software de seguretat que conté eines de detecció i resposta contra amenaces. Aquest programa s’executa principalment en espai d’usuari, però conté opcions de monitorització que poden actuar a nivell de kernel.
Aquest enfocament ofereix més compatibilitat i estabilitat contra fallades en el programa (tot i que no és infalible).
Per altra banda, al tenir menys accés al kernel, pot ser més difícil monitoritzar i bloquejar amenaces de baix nivell.
Riot Vanguard
Com molts sabreu, Riot Games va incorporar als seus jocs el Riot Vanguard, un sistema antitrampes que s’executa a nivell de kernel. Com hem comentat, això vol dir que aquest component té accès profund a tot el nostre sistema operatiu.
Què comporta?
Per un costat, al tenir accès a tan baix nivell, aquest programa pot detectar i bloquejar trampes molt més fàcilment que si operès en nivell d’usuari.
Per altre costat, és un programa que té la capacitat d’accedir a informació sensible del nostre equip i fins i tot modificar elements del sistema. Això implica un risc tan per la nostra privadesa com per la seguretat, ja que si Riot Vanguard és compromès, et poden fer molt de mal.
A més, la supervisió que comporta a nivell de kernel pot donar problemes d’estabilitat, a més de consumir més recursos.
Conclusió
En resum, aquest enfocament és molt beneficiós per la seguretat del sistema i la privacitat de l’usuari, encara que comporti certa pèrdua de rendiment.
I fins aquí el post d’avui. Si t’ha semblat útil pots deixar un comentari i compartir-lo. Ens veiem al següent!