Modulul kernelului

Versiunea actuală a paginii nu a fost încă revizuită de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 19 octombrie 2018; verificările necesită 4 modificări .

Modulul kernel , modulul kernel încărcat ( LKM ) este un fișier obiect  care conține cod care extinde funcționalitatea unui nucleu de sistem de bază care rulează sau așa-numitul nucleu de bază . Modulele kernel sunt folosite pentru a adăuga suport pentru hardware sau sisteme de fișiere noi sau pentru a adăuga noi apeluri de sistem . Atunci când funcționalitatea oferită de un modul nu mai este necesară, acesta poate fi descărcat pentru a elibera memorie și alte resurse.

Cele mai multe sisteme Unix moderne și Windows acceptă module kernel încărcate, deși pot folosi nume diferite pentru ele, cum ar fi kernel loadable module ( kld ) pe FreeBSD , extensia kernel ( kext ) pe OS X . Acestea sunt uneori denumite module Kernel Loadable ( KLM ) sau Kernel Modules ( KMOD ).

Beneficii

Fără module de nucleu încărcate, sistemele de operare ar trebui să aibă toate funcționalitățile posibile într-un nucleu monolitic . O parte semnificativă a codului nu este utilizată și ocupă doar memorie . De fiecare dată când utilizatorul are nevoie de o nouă funcționalitate care nu este încă inclusă în nucleul de bază, este necesară o recompilare completă a nucleului de bază și o repornire. Utilizarea modulelor încărcate simplifică foarte mult schimbarea funcționalității nucleului și nu necesită o recompilare completă (un modul poate fi adesea construit separat de nucleu sau livrat într-o formă precompilată) sau repornire.

Compatibilitate binară

Linux nu oferă un API sau ABI stabil pentru modulele kernel. Aceasta înseamnă că există diferențe în structura și funcția internă între diferitele versiuni de kernel care pot cauza probleme de compatibilitate. În încercarea de a combate aceste probleme, simbolul de versiune a datelor este plasat în .modinfo în secțiunea de încărcare a modulului ELF . Aceste informații despre versiune pot fi comparate cu informațiile despre versiunea nucleului executabil înainte ca modulul să fie încărcat; dacă versiunile sunt incompatibile, atunci modulul nu va fi încărcat.

Alte sisteme de operare precum Solaris , FreeBSD , Mac OS X , Windows mențin API-ul și ABI pentru module relativ stabile, evitând această problemă. De exemplu, modulele FreeBSD compilate pentru versiunea de kernel 6.0 vor funcționa fără recompilare pe orice altă versiune a FreeBSD 6.x, cum ar fi 6.4. Cu toate acestea, ele nu sunt compatibile cu alte versiuni majore și trebuie să fie recompilate pentru a fi utilizate cu FreeBSD 7.x, deoarece compatibilitatea API și ABI este menținută doar în aceeași ramură.

Securitate

Modulele de nucleu încărcabile sunt o modalitate convenabilă de a modifica nucleul, aceasta putând fi folosită de un atacator într-un sistem compromis pentru a preveni detectarea proceselor sau fișierelor sale , permițându-i să-și păstreze controlul asupra sistemului. Prin urmare, multe rootkit-uri folosesc module kernel. [unu]

Linux

În lumea Linux , modulele sunt încărcate și descărcate de utilitarul modprobe . Modulele sunt stocate în /lib/modules în fișiere .ko ("obiect kernel") începând cu Linux 2.6. [2] Versiunile anterioare foloseau extensia .o . Comanda lsmod listează modulele nucleului încărcate și dependențele acestora.

Probleme de licențiere

Potrivit deținătorilor Linux, LKM este o lucrare derivată a nucleului. Funcțiile kernelului pot fi marcate ca fiind disponibile numai pentru modulele GPL .

Încărcarea modulelor proprietare sau incompatibile cu GPL setează indicatorul „taint” (tint) [3] în nucleu. Acest semnalizare înseamnă că orice probleme sau erori sunt mai puțin probabil să fie investigate de către deținătorii nucleului. [4] [5] Modulele devin de fapt parte din nucleul care rulează și pot corupe structurile interne de date, creând erori care nu pot fi reproduse de cei care nu pot încărca un modul proprietar .

Cazul Linuxant

În 2004, Linuxant, o companie de consultanță care a lansat un modul proprietar ( driver de dispozitiv ), a încercat să ocolească restricțiile „GPLONLY” privind unele funcții ale nucleului. MODULE_LICENSEPentru a face acest lucru, simbolul NUL a fost folosit în graficul din codul sursă al modulului său :

MODULE_LICENSE ("GPL\0pentru fișierele din directorul \"GPL\"; pentru altele, se aplică numai fișierul LICENSE");

Determinarea licenței de către nucleul Linux se face prin compararea lexicografică a șirurilor terminate cu NUL, astfel încât compararea șirului specificat va fi echivalent cu compararea cu șirul „GPL” , în timp ce modulul nu este licențiat sub licență GPL . [6]

FreeBSD

Modulele kernelului FreeBSD sunt stocate în /boot/kernel/ (module distribuite cu distribuția) sau /boot/modules/ pentru modulele instalate din porturile FreeBSD și din alte surse. Modulele nucleului FreeBSD au de obicei extensia .ko . Modulele pot fi încărcate cu kldload , descărcate cu kldunload . Lista modulelor este vizibilă cu comanda kldstat . Unele module sunt încărcate în timpul fazei inițiale de pornire (specificate în fișierul /boot/loader.conf ).

Mac OS X

Unele module kernel încărcate din Mac OS X pot fi încărcate automat. Modulele de nucleu încărcabile pot fi încărcate și cu comanda kextload . Lista poate fi afișată cu comanda kextstat . Modulele de nucleu încărcabile se află în pachete software cu extensia .kext . Modulele furnizate cu sistemul de operare sunt stocate în directorul /System/Library/Extensions , modulele de la terți sunt stocate în alte directoare.

Windows

Nucleul Windows în sine nu acceptă extensii prin module încărcate. Cu toate acestea, driverele descărcabile sunt acceptate , iar un modul proiectat ca driver Windows nu este necesar pentru a funcționa cu niciun dispozitiv extern. Datorită acestui fapt, „pseudo driverele” sunt utilizate pe scară largă pentru a schimba și extinde funcționalitatea nucleului Windows - anti -rootkit-uri , interceptoare de ieșire de depanare , „agenți” auxiliari ai multor programe de sistem lansate de Sysinternals etc.

Note

  1. Exploatarea modulelor kernel încărcate . Data accesului: 5 mai 2012. Arhivat din original pe 4 februarie 2012.
  2. Ghidul de programare al modulelor kernel Linux, secțiunea 2.2 „Compilarea modulelor kernelului” . Consultat la 14 octombrie 2011. Arhivat din original la 20 septembrie 2012.
  3. Linus Torvalds și altele. Documentație/oops-tracing.txt (link descendent) . kernel.org (21 iunie 2011). Consultat la 3 octombrie 2011. Arhivat din original la 20 septembrie 2012. 
  4. Jonathan Corbet. Vioarea din spațiul utilizatorului . LWN.net (24 martie 2006). Consultat la 3 octombrie 2011. Arhivat din original pe 16 noiembrie 2011.
  5. Documentație de asistență Novell: Tainted kernel (26 iulie 2007). Consultat la 3 octombrie 2011. Arhivat din original la 20 septembrie 2012.
  6. Jonathan Corbet. Fiind sincer cu MODULE_LICENSE . LWN.net (27 august 2004). Preluat la 4 iunie 2012. Arhivat din original la 20 septembrie 2012.

Link -uri