Assembly-kieli ja x86-tason järjestelmäohjelmointi · Oppitunti

Suojausrenkaat ja käyttöoikeudet

Oppikaa x86:n käyttöoikeustasot eli renkaat ja ymmärtäkää, miten ne erottavat käyttöjärjestelmän käyttäjäsovelluksista ja parantavat tietoturvaa.

Oppitunti 2/412 vaihetta

Suojausrenkaat ja käyttöoikeudet on ilmainen Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Assembly-kieli ja x86-tason järjestelmäohjelmointi-kurssilla on yhteensä 4 oppituntia.

Johdanto: suojausrenkaat

Oletteko koskaan pohtineet, miten sovellukset pidetään erillään käyttöjärjestelmästä? Tai miten haitallinen ohjelma ei voi vain ottaa tietokonetta hallintaansa?

Vastaus ovat etuoikeusrenkaat, jotka ovat x86-suorittimien keskeinen suojausominaisuus!

Miksi renkaat? Tietoturva!

Etuoikeusrenkaat muodostavat hierarkkisen rakenteen ohjelmistojen suorittamista varten. Niitä voi ajatella suojaustasoina.

  • Eristys: Estää käyttäjäohjelmia kaatamasta käyttöjärjestelmää.
  • Tietoturva: Suojaa kriittisiä järjestelmäresursseja.
  • Vakaus: Varmistaa järjestelmän luotettavan toiminnan.

Rengas 0: ydin

Rengas 0 on etuoikeuksiltaan korkein taso. Siellä sijaitsee käyttöjärjestelmän ydin.

Ytimellä on suora pääsy kaikkeen laitteistoon, muistiin ja suorittimen ominaisuuksiin. Se on ylin auktoriteetti ja hallitsee kaikkea rajoituksetta.

Rengas 3: käyttäjäsovellukset

Rengas 3 on etuoikeuksiltaan alhaisin taso. Siellä suoritetaan useimmat jokapäiväiset sovellukset.

Käyttäjäsovellusten pääsy laitteistoon ja muistiin on rajoitettu. Niiden on pyydettävä palveluita ytimestä (renkaasta 0) etuoikeutettujen toimintojen suorittamista varten.

x86:n rengashierarkia

x86-arkkitehtuuri määrittelee neljä etuoikeustasoa: renkaat 0, 1, 2 ja 3.

Nykyaikaiset käyttöjärjestelmät, kuten Linux ja Windows, käyttävät kuitenkin yleensä vain seuraavia:

  • Rengas 0: käyttöjärjestelmän ytimelle.
  • Rengas 3: käyttäjäsovelluksille.

Renkaat 1 ja 2 ovat yleensä käyttämättömiä, mikä yksinkertaistaa useimpien järjestelmien mallia.

CPL: nykyinen etuoikeustaso

Suoritin seuraa parhaillaan suoritettavan koodin nykyistä etuoikeustasoa (Current Privilege Level, CPL).

CPL tallennetaan Code Segment (CS) -rekisteriin, tarkemmin sen kahteen alimpaan bittiin. Se kertoo suorittimelle, missä renkaassa ohjelma parhaillaan toimii.

DPL: segmentin etuoikeustaso

Jokaisella segmentin kuvaajalla, joka määrittelee muistisegmentit, on kuvaajan etuoikeustaso (Descriptor Privilege Level, DPL).

DPL määrittää segmentin käyttämiseen vaadittavan vähimmäisetuoikeustason. Esimerkiksi renkaan 0 koodisegmentin DPL-arvo olisi 0.

RPL: pyytäjän etuoikeustaso

Pyytäjän etuoikeustaso (Requestor Privilege Level, RPL) ilmaisee sen koodin etuoikeustason, joka pyysi pääsyä segmenttiin.

Suoritin käyttää CPL-, DPL- ja RPL-arvoja suojaussääntöjen valvontaan. Esimerkiksi renkaan 3 ohjelma ei voi ladata renkaan 0 koodisegmenttiä, vaikka se yrittäisi huijata järjestelmää.

Siirtymät renkaiden välillä: järjestelmäkutsut

Miten renkaan 3 sovellus pyytää renkaan 0 ydintä suorittamaan jonkin etuoikeutetun toiminnon, kuten tiedostoon kirjoittamisen?

Se käyttää hallittua mekanismia nimeltä järjestelmäkutsu (system call eli syscall). Järjestelmäkutsut toimivat kuin "portit", jotka sallivat turvalliset ja rajatut siirtymät korkeammalle etuoikeustasolle ja takaisin.

IOPL: I/O-porttien hallinta

Suora laitteiston I/O IN- ja OUT-käskyillä vaatii korkeat etuoikeudet. Käyttäjätilan ohjelma (rengas 3), joka yrittää tätä, aiheuttaa yleensä yleisen suojauspoikkeuksen (General Protection Fault).

Suoritin tarkistaa EFLAGS-rekisterin I/O-etuoikeustason (I/O Privilege Level, IOPL). Jos nykyinen etuoikeustaso (CPL) on numeerisesti pienempi tai yhtä suuri kuin IOPL, suora I/O sallitaan. Muussa tapauksessa toiminto estetään.

Tässä esimerkissä yritetään lukea I/O-portista. Nykyaikaisessa käyttöjärjestelmässä tämä todennäköisesti epäonnistuu suojauspoikkeukseen tai ohjelma lopetetaan. Esimerkki havainnollistaa rajoitusta:

; This example illustrates a privileged I/O attempt.
; It is specific to Linux (using int 0x80 for syscalls).

section .data
  msg db "Attempting privileged I/O...", 0xA
  len equ $ - msg

section .text
  global _start

_start:
  ; Print message using a system call (Ring 3 -> Ring 0 transition)
  mov eax, 4      ; sys_write
  mov ebx, 1      ; stdout file descriptor
  mov ecx, msg    ; address of string
  mov edx, len    ; length of string
  int 0x80        ; Invoke Linux kernel (syscall)

  ; Attempt to read from I/O port 0x60 (e.g., keyboard data)
  ; This instruction requires sufficient privilege (IOPL <= CPL)
  ; In a typical Ring 3 user program, this will cause a fault.
  in al, 0x60     ; !!! PRIVILEGED INSTRUCTION !!!

  ; Exit program using a system call
  mov eax, 1      ; sys_exit
  xor ebx, ebx    ; exit code 0
  int 0x80        ; Invoke Linux kernel (syscall)

Etuoikeusrenkaan tarkistus

Testataan ymmärrystänne etuoikeusrenkaista!

Yhteenveto: renkaat ja tietoturva

Hienoa! Olette oppineet x86:n etuoikeusrenkaista.

  • Rengas 0: käyttöjärjestelmän ydin, korkein etuoikeustaso.
  • Rengas 3: käyttäjäsovellukset, matalin etuoikeustaso.
  • CPL, DPL, RPL: suorittimen mekanismit etuoikeuksien tarkistamiseen.
  • Järjestelmäkutsut: hallitut siirtymät korkeammille etuoikeustasoille.
  • IOPL: rajoittaa suoraa I/O-käyttöä.

Nämä renkaat ovat olennaisia järjestelmän tietoturvan ja vakauden kannalta, sillä ne eristävät ohjelmiston eri osat toisistaan.

Aloita maksutta

Opi Assembly tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
12
Oppitunnit
48

Usein kysytyt kysymykset

Onko oppitunti ”Suojausrenkaat ja käyttöoikeudet” ilmainen?

Kyllä – oppitunnin ”Suojausrenkaat ja käyttöoikeudet” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Assembly-kieli ja x86-tason järjestelmäohjelmointi-kurssin, päivitä CoddyKit PROhon. Assembly-kieli ja x86-tason järjestelmäohjelmointi-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Suojausrenkaat ja käyttöoikeudet”?

Oppikaa x86:n käyttöoikeustasot eli renkaat ja ymmärtäkää, miten ne erottavat käyttöjärjestelmän käyttäjäsovelluksista ja parantavat tietoturvaa. Harjoittelet Assembly-kieli ja x86-tason järjestelmäohjelmointi-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Assembly-kieli ja x86-tason järjestelmäohjelmointi-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Suojausrenkaat ja käyttöoikeudet”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppitunnilla?

Kyllä. Jokainen Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Sivutus ja muistinhallintayksikkö (MMU)
  2. Suojausrenkaat ja käyttöoikeudet
  3. Hypervisorit ja virtualisoinnin perusteet
  4. Segmentointi ja Global Descriptor Table (GDT)
← Takaisin: Assembly-kieli ja x86-tason järjestelmäohjelmointi