Kernemodul, der kan indlæses - Loadable kernel module

I databehandling er et indlæseligt kernemodul ( LKM ) en objektfil, der indeholder kode for at udvide den kørende kerne eller den såkaldte basiskerne af et operativsystem . LKM'er bruges typisk til at tilføje support til ny hardware (som enhedsdrivere ) og / eller filsystemer eller til tilføjelse af systemopkald . Når funktionaliteten fra en LKM ikke længere er påkrævet, kan den aflades for at frigøre hukommelse og andre ressourcer.

De fleste nuværende Unix-lignende systemer og Microsoft Windows support belastbare kernemoduler under forskellige navne, såsom kerne indlæsbare modul ( kld ) i FreeBSD , kernel forlængelse ( kext ) i MacOS (nu forældet), kernel udvidelsesmodul i AIX , kernel-mode driver i Windows NT og kernemodul, der kan downloades ( DKM ) i VxWorks . De er også kendt som kernemodulerbare moduler (eller KLM ) og simpelthen som kernemoduler ( KMOD ).

Fordele

Uden indlæselige kernemoduler ville et operativsystem skulle omfatte al mulig forventet funktionalitet, der er samlet direkte i basiskernen. Meget af denne funktionalitet ligger i hukommelsen uden at blive brugt, spilder hukommelse og kræver, at brugerne genopbygger og genstarter basiskernen, hver gang de har brug for ny funktionalitet.

Ulemper

Et mindre kritik af foretrækker en modulær kerne over en statisk kerne er det såkaldte fragmentering straf . Basiskernen pakkes altid ud i ægte sammenhængende hukommelse af dens installationsrutiner; således er basiskernekoden aldrig fragmenteret. Når systemet først er i en tilstand, hvor moduler kan indsættes, for eksempel når filsystemerne er blevet monteret, der indeholder modulerne, er det sandsynligt, at enhver ny kernekodeindsættelse vil få kernen til at blive fragmenteret og derved indføre en mindre ydelsesstraff ved at bruge flere TLB- poster, hvilket forårsager flere TLB-fejl.

Implementeringer i forskellige operativsystemer

Linux

Indlæselige kernemoduler i Linux indlæses (og aflæsses) ved hjælp af kommandoen modprobe . De er placeret i / lib / modules eller / usr / lib / modules og har haft udvidelsen .ko (" kerneobjekt ") siden version 2.6 (tidligere versioner brugte .o- udvidelsen). Kommandoen lsmod viser de indlæste kernemoduler. I nødsituationer, når systemet ikke starter på grund af f.eks. Ødelagte moduler, kan specifikke moduler aktiveres eller deaktiveres ved at ændre listen over kerneprogrammer (f.eks. Hvis du bruger GRUB ved at trykke på 'e' i GRUB-startmenuen og derefter redigering af kernel-parameterlinjen).

Licensproblemer

Efter Linux-vedligeholdere er LKM afledte værker af kernen. Linux-vedligeholdere tåler distributionen af proprietære moduler, men tillader symboler at blive markeret som kun tilgængelige for GNU General Public License (GPL) -moduler.

Indlæsning af et proprietært eller ikke-GPL-kompatibelt modul indstiller et 'plettet' flag i den kørende kerne - hvilket betyder, at eventuelle problemer eller fejl, der opleves, er mindre tilbøjelige til at blive undersøgt af vedligeholdere. LKM'er bliver effektivt en del af den kørende kerne, så kan ødelægge kerne-datastrukturer og producere fejl, der muligvis ikke kan undersøges, hvis modulet faktisk er proprietært.

Linux kontrovers

I 2004 forsøgte Linuxant, et konsulentfirma, der frigiver proprietære enhedsdrivere som kernemoduler, der kan indlæses, at misbruge en null-terminator i deres MODULE_LICENSE, som det fremgår af følgende kodeuddrag:

MODULE_LICENSE("GPL\0for files in the \"GPL\" directory; for others, only LICENSE file applies");

Strengsammenligningskoden, der blev brugt af kernen på det tidspunkt, forsøgte at bestemme, om modulet blev GPLed stoppet, da det nåede et null-tegn ( \ 0 ), så det blev narret til at tro, at modulet erklærede sin licens for at være "GPL" .

FreeBSD

Kernemoduler til FreeBSD gemmes i / boot / kernel / til moduler, der distribueres med operativsystemet , eller normalt / boot / modules / til moduler installeret fra FreeBSD-porte eller FreeBSD-pakker eller til proprietære eller på anden måde binære moduler. FreeBSD-kernemoduler har normalt udvidelsen .ko . Når maskinen er startet, kan de blive indlæst med kldload- kommandoen, aflæst med kldunload og opført med kldstat . Moduler kan også indlæses fra indlæseren, før kernen starter, enten automatisk (gennem /boot/loader.conf ) eller manuelt.

macOS

Nogle kernemoduler, der kan indlæses i macOS, kan indlæses automatisk. Indlæselige kernemoduler kan også indlæses ved hjælp af kommandoen kextload . De kan vises ved hjælp af kommandoen kextstat . Kernemoduler, der kan indlæses, er placeret i bundter med udvidelsen .kext . Moduler, der leveres med operativsystemet, er gemt i / System / Library / Extensions- biblioteket; moduler leveret af tredjeparter findes i forskellige andre kataloger.

NetWare

Et NetWare-kernemodul kaldes et NetWare Loadable Module (NLM). NLM'er indsættes i NetWare-kernen ved hjælp af LOAD-kommandoen og fjernes ved hjælp af UNLOAD-kommandoen; de moduler kommando lister aktuelt indlæste kernemoduler. NLM'er kan opholde sig i enhver gyldig søgesti, der er tildelt på NetWare-serveren, og de har .NLM som filtypenavn.

VxWorks

Et kernemodul (DKM) -projekt, der kan downloades, kan oprettes for at generere en ".out" -fil, som derefter kan indlæses i kerneområdet ved hjælp af kommandoen "ld". Dette kernemodul, der kan downloades, kan downloades ved hjælp af "unld" -kommandoen.

Solaris

Solaris har en konfigurerbar sti til kernemodulindlæsning, den er som standard / platform / platform-navn / kerne / kerne / usr / kerne . De fleste kernemoduler lever i underkataloger under / kernel ; dem, der ikke anses for nødvendige for at starte systemet til det punkt, hvor init kan starte, findes ofte (men ikke altid) i / usr / kernel . Når du kører en DEBUG-kerne, forsøger systemet aktivt at aflaste moduler.

Binær kompatibilitet

Linux leverer ikke en stabil API eller ABI til kernemoduler. Dette betyder, at der er forskelle i intern struktur og funktion mellem forskellige kerneversioner, hvilket kan forårsage kompatibilitetsproblemer. I et forsøg på at bekæmpe disse problemer placeres data til symbolversionering inden for .modinfo- sektionen i ELF- moduler, der kan indlæses . Denne versioneringsinformation kan sammenlignes med den kørende kerne, inden der indlæses et modul; hvis versionerne er inkompatible, indlæses modulet ikke.

Andre operativsystemer, såsom Solaris , FreeBSD , macOS og Windows holder kernen API og ABI relativt stabile og undgår dermed dette problem. For eksempel fungerer FreeBSD- kernemoduler, der er kompileret mod kernen version 6.0, uden rekompilering på nogen anden FreeBSD 6.x-version, f.eks. 6.4. De er dog ikke kompatible med andre større versioner og skal kompileres igen til brug med FreeBSD 7.x, da API og ABI-kompatibilitet kun opretholdes inden for en gren.

Sikkerhed

Mens kernel-moduler, der kan indlæses, er en bekvem metode til at ændre den kørende kerne, kan dette misbruges af angribere på et kompromitteret system for at forhindre detektering af deres processer eller filer , så de kan opretholde kontrol over systemet. Mange rootkits bruger LKM'er på denne måde. Bemærk, at moduler på de fleste operativsystemer ikke hjælper privilegiehøjde på nogen måde, da forhøjet privilegium kræves for at indlæse en LKM; de gør det blot lettere for angriberen at skjule indbruddet.

Linux

Linux tillader deaktivering af modulindlæsning via sysctl- indstilling /proc/sys/kernel/modules_disabled. Et initramfs- system kan indlæse specifikke moduler, der er nødvendige for en maskine ved opstart, og derefter deaktivere modulindlæsning. Dette gør sikkerheden meget lig en monolitisk kerne. Hvis en angriber kan ændre initramfs, kan de ændre kernen binær.

macOS

I OS X Yosemite og senere udgivelser skal en kerneudvidelse kodesigneres med et udviklercertifikat, der indeholder en bestemt "ret" til dette. Et sådant udviklercertifikat leveres kun af Apple efter anmodning og gives ikke automatisk til Apple Developer- medlemmer. Denne funktion, kaldet "kext-signering", er som standard aktiveret, og den beder kernen om at stoppe opstart, hvis der ikke findes signaturede kerneudvidelser. I OS X El Capitan og senere udgivelser er det en del af System Integrity Protection .

I ældre versioner af macOS, eller hvis kext-signering er deaktiveret, kan et kernelmodul, der kan indlæses i en kerneudvidelsespakke, indlæses af ikke-root-brugere, hvis egenskaben OSBundleAllowUserLoad er indstillet til True i bundtets ejendomsliste. Men hvis nogen af ​​filerne i pakken, inklusive den eksekverbare kodefil, ikke ejes af rod- og gruppehjul eller kan skrives af gruppen eller "andet", vil forsøget på at indlæse det modul, der kan indlæses, mislykkes.

Solaris

Kernel-moduler kan valgfrit have en kryptografisk ELF-sektion, der er verificeret ved indlæsning afhængigt af de politiske indstillinger for Verified Boot. Kernen kan håndhæve, at moduler er kryptografisk underskrevet af et sæt pålidelige certifikater; listen over pålidelige certifikater opbevares uden for OS i ILOM på nogle SPARC-baserede platforme. Brugerspace-initieret kernemodulindlæsning er kun mulig fra den betroede sti, når systemet kører med funktionen Immutable Global Zone aktiveret.

Se også

Referencer