Espai d'usuari i espai de Kernel

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.

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.

  • 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.

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.

  • 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.

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()

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.

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.

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).

En l’actualitat tenim alguns exemples de programes en espai de kernel, com són CrowdStrike Falcon i Riot Vanguard:

É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.

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.

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.

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!