Laddningsbar kärnmodul - Loadable kernel module

Vid beräkning är en laddbar kärnmodul ( LKM ) en objektfil som innehåller kod för att utöka den körande kärnan , eller så kallad baskärna , i ett operativsystem . LKM används vanligtvis för att lägga till stöd för ny hårdvara (som enhetsdrivrutiner ) och / eller filsystem , eller för att lägga till systemanrop . När den funktionalitet som tillhandahålls av en LKM inte längre krävs kan den laddas ned för att frigöra minne och andra resurser.

De flesta nuvarande Unix-liknande system och Microsoft Windows stöder laddbara kärnmoduler under olika namn, till exempel kärnladdningsbar modul ( kld ) i FreeBSD , kärnförlängning ( kext ) i macOS (nu utfasad), kärntilläggsmodul i AIX , kärnlägesdrivrutin i Windows NT och nedladdningsbar kärnmodul ( DKM ) i VxWorks . De är också kända som kärneladdningsbara moduler (eller KLM ) och helt enkelt som kärnmoduler ( KMOD ).

Fördelar

Utan laddningsbara kärnmoduler måste ett operativsystem inkludera alla möjliga förväntade funktioner kompilerade direkt i baskärnan. Mycket av denna funktionalitet finns i minnet utan att användas, slöseri med minne och kräver att användare bygger om och startar om baskärnan varje gång de behöver ny funktionalitet.

Nackdelar

En smärre kritik av föredrar en modulär kärna över en statisk kärna är den så kallade fragmentering straff . Baskärnan packas alltid upp i riktigt angränsande minne av dess installationsrutiner; således är baskärnkoden aldrig fragmenterad. När systemet väl är i ett tillstånd där moduler kan infogas, till exempel när filsystemen har monterats som innehåller modulerna, är det troligt att någon ny kärnkodinsättning kommer att leda till att kärnan blir fragmenterad och därigenom introducerar en mindre prestationsstraff genom att använda fler TLB- poster, vilket orsakar fler TLB-missar.

Implementeringar i olika operativsystem

Linux

Laddningsbara kärnmoduler i Linux laddas (och laddas av) med kommandot modprobe . De finns i / lib / modules eller / usr / lib / modules och har haft tillägget .ko ("kärnobjekt") sedan version 2.6 (tidigare versioner använde .o- tillägget). Den lsmod kommandot listar de laddade kärnmoduler. I nödfall, när systemet inte startar på grund av t.ex. trasiga moduler, kan specifika moduler aktiveras eller inaktiveras genom att ändra listan över kärnstartparametrar (till exempel om du använder GRUB , genom att trycka på 'e' i GRUB-startmenyn och sedan redigering av kärnparameterraden).

Licensfrågor

Enligt Linux-underhållare är LKM härledda verk av kärnan. Linux-underhållarna tolererar distributionen av egna moduler, men tillåter symboler att markeras som endast tillgängliga för GNU General Public License (GPL) -moduler.

Att ladda en egen eller icke-GPL-kompatibel modul kommer att ställa in en 'fläck' -flagga i den körande kärnan - vilket innebär att eventuella problem eller buggar som upplevs är mindre benägna att undersökas av underhållarna. LKM-enheter blir effektivt en del av den körande kärnan, så kan korrumpera kärndatastrukturer och producera buggar som kanske inte kan undersökas om modulen verkligen är proprietär.

Linuxant kontrovers

År 2004 försökte Linuxant, ett konsultföretag som släpper ut egna enhetsdrivrutiner som laddningsbara kärnmoduler, att missbruka en nullterminator i sin MODULE_LICENSE, vilket syns i följande kodutdrag:

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

Strängjämförelsekoden som användes av kärnan vid den tidpunkten försökte avgöra om modulen var GPLed stoppad när den nollade karaktären ( \ 0 ), så det lurades att tro att modulen förklarade sin licens som bara "GPL" .

FreeBSD

Kärnmoduler för FreeBSD lagras i / boot / kernel / för moduler distribuerade med operativsystemet , eller vanligtvis / boot / modules / för moduler installerade från FreeBSD-portar eller FreeBSD-paket , eller för egna eller på annat sätt binära moduler. FreeBSD-kärnmoduler har vanligtvis tillägget .ko . När maskinen har startat kan de laddas med kldload- kommandot, lossas med kldunload och listas med kldstat . Moduler kan också laddas från lastaren innan kärnan startar, antingen automatiskt (via /boot/loader.conf ) eller för hand.

Mac OS

Vissa laddningsbara kärnmoduler i macOS kan laddas automatiskt. Laddningsbara kärnmoduler kan också laddas med kommandot kextload . De kan listas med kommandot kextstat . Laddningsbara kärnmoduler finns i buntar med tillägget .kext . Moduler som levereras med operativsystemet lagras i katalogen / System / Library / Extensions ; moduler som tillhandahålls av tredje part finns i olika andra kataloger.

NetWare

En NetWare-kärnmodul kallas en NetWare Loadable Module (NLM). NLM: er infogas i NetWare-kärnan med hjälp av LOAD-kommandot och tas bort med hjälp av UNLOAD-kommandot; de moduler kommandot listor för närvarande laddade kärnmoduler. NLM kan finnas i valfri sökväg som tilldelats på NetWare-servern och de har .NLM som filnamnstillägg.

VxWorks

Ett nedladdningsbart kärnmodul (DKM) -projekt kan skapas för att generera en ".out" -fil som sedan kan laddas till kärnutrymme med kommandot "ld". Den här nedladdningsbara kärnmodulen kan laddas ned med kommandot "unld".

Solaris

Solaris har en konfigurerbar laddningsväg för kärnmodulen, den är som standard / platform / platform-name / kernel / kernel / usr / kernel . De flesta kärnmoduler finns i underkataloger under / kernel ; de som inte anses nödvändiga för att starta systemet så att init kan starta finns ofta (men inte alltid) i / usr / kernel . När du kör en DEBUG-kärna försöker systemet aktivt att ladda ner moduler.

Binär kompatibilitet

Linux tillhandahåller inte ett stabilt API eller ABI för kärnmoduler. Det betyder att det finns skillnader i intern struktur och funktion mellan olika kärnversioner, vilket kan orsaka kompatibilitetsproblem. I ett försök att bekämpa dessa problem placeras symbolversioneringsdata i .modinfo- delen av laddningsbara ELF- moduler. Denna versioneringsinformation kan jämföras med den som körs innan den laddas in en modul. om versionerna är inkompatibla laddas inte modulen.

Andra operativsystem, som Solaris , FreeBSD , macOS och Windows håller kärnan API och ABI relativt stabila, vilket undviker detta problem. Exempelvis fungerar FreeBSD- kärnmoduler som har kompilerats mot kärnversion 6.0 utan att kompileras på någon annan FreeBSD 6.x-version, t.ex. 6.4. De är dock inte kompatibla med andra större versioner och måste kompileras om för användning med FreeBSD 7.x, eftersom API och ABI-kompatibilitet endast bibehålls inom en gren.

säkerhet

Medan laddningsbara kärnmoduler är en bekväm metod för att ändra den körande kärnan, kan detta missbrukas av angripare på ett komprometterat system för att förhindra upptäckt av deras processer eller filer , så att de kan behålla kontrollen över systemet. Många rootkits använder LKM på detta sätt. Observera att moduler på de flesta operativsystem inte hjälper privilegieringshöjning på något sätt, eftersom förhöjt privilegium krävs för att ladda en LKM; de gör det bara lättare för angriparen att dölja inbrottet.

Linux

Linux gör det möjligt att inaktivera laddning av modul via sysctl- alternativet /proc/sys/kernel/modules_disabled. Ett initramfs- system kan ladda specifika moduler som behövs för en maskin vid start och sedan inaktivera modulbelastning. Detta gör säkerheten väldigt lik en monolitisk kärna. Om en angripare kan ändra initramfs kan de ändra kärnbinäret.

Mac OS

I OS X Yosemite och senare versioner måste ett kärntillägg kodsigneras med ett utvecklarcertifikat som innehåller en viss "rätt" för detta. Ett sådant utvecklarcertifikat tillhandahålls endast av Apple på begäran och ges inte automatiskt till Apple Developer- medlemmar. Denna funktion, kallad "kext-signering", är aktiverad som standard och den instruerar kärnan att sluta starta om osignerade kärntillägg finns. I OS X El Capitan och senare versioner är det en del av System Integrity Protection .

I äldre versioner av macOS, eller om kext-signering är inaktiverad, kan en laddningsbar kärnmodul i ett kärntilläggsbunt laddas av icke-root-användare om egenskapen OSBundleAllowUserLoad är satt till True i buntens fastighetslista. Men om någon av filerna i paketet, inklusive den körbara kodfilen, inte ägs av rot- och grupphjulet, eller om de kan skrivas av gruppen eller "annat", misslyckas försöket att ladda den kärnläsbara modulen.

Solaris

Kärnmoduler kan valfritt ha en kryptografisk signatur ELF-sektion som verifieras vid belastning beroende på inställningarna för Verifierad startpolicy. Kärnan kan tillämpa att moduler är kryptografiskt signerade av en uppsättning pålitliga certifikat; listan över betrodda certifikat finns utanför operativsystemet i ILOM på vissa SPARC-baserade plattformar. Användarutrymme initierad kärnmodulläsning är endast möjlig från den betrodda sökvägen när systemet körs med funktionen Immutable Global Zone aktiverad.

Se även

Referenser