Načtitelný modul jádra - Loadable kernel module

Ve výpočtu , je zatížitelné modul jádra ( LKM ) je soubor objekt , který obsahuje kód pro prodloužení běžící jádro , nebo tak zvané základní jádro , z operačního systému . LKM se obvykle používají k přidání podpory pro nový hardware (jako ovladače zařízení ) a / nebo souborových systémů nebo k přidání systémových volání . Když funkce poskytované LKM již není vyžadována, lze ji uvolnit, aby se uvolnila paměť a další prostředky.

Většina současných unixových systémů a Microsoft Windows podporuje načtitelné moduly jádra pod různými názvy, například načtitelný modul jádra ( kld ) ve FreeBSD , rozšíření jádra ( kext ) v systému macOS (nyní zastaralé), modul rozšíření jádra v AIX , ovladač v režimu jádra ve Windows NT a stahovatelném modulu jádra ( DKM ) ve VxWorks . Oni jsou také známí jako jádra zaváděcí moduly (nebo KLM ), a jednoduše jako moduly jádra ( KMOD ).

Výhody

Bez načtitelných modulů jádra by operační systém musel zahrnovat všechny možné očekávané funkce kompilované přímo do základního jádra. Velká část této funkce by se nacházela v paměti, aniž by byla používána, plýtvání pamětí, a vyžadovala by, aby uživatelé znovu sestavili a restartovali základní jádro pokaždé, když vyžadují nové funkce.

Nevýhody

Jednou menší kritikou upřednostňování modulárního jádra před statickým jádrem je takzvaný trest za fragmentaci . Základní jádro je vždy rozbaleno do skutečné souvislé paměti svými instalačními rutinami; základní kód jádra tedy nikdy není fragmentovaný. Jakmile je systém ve stavu, ve kterém může být vložen moduly, například jakmile souborové systémy byly namontovány , které obsahují moduly, je pravděpodobné, že každý nový vkládání kódu jádra způsobí, že se jádro k fragmentaci, čímž se zavádí trest menší výkon tím, že použijete více záznamů TLB , což způsobí více chyb v TLB.

Implementace v různých operačních systémech

Linux

Načtitelné moduly jádra v systému Linux jsou načteny (a uvolněny) příkazem modprobe . Jsou umístěny v / lib / modules nebo / usr / lib / modules a mají příponu .ko („objekt jádra“) od verze 2.6 (předchozí verze používaly příponu .o ). Příkaz lsmod uvádí seznam načtených modulů jádra. V nouzových případech, kdy se systém nespustí kvůli např. Rozbitým modulům, lze konkrétní moduly povolit nebo zakázat úpravou seznamu parametrů spouštění jádra (například pokud používáte GRUB , stisknutím klávesy „e“ v úvodní nabídce GRUBu editace řádku parametrů jádra).

Problémy s licencí

Podle názoru správců Linuxu jsou LKM odvozenými pracemi jádra. Správci Linuxu tolerují distribuci proprietárních modulů, ale umožňují označovat symboly jako dostupné pouze modulům GNU General Public License (GPL).

Načtení proprietárního modulu nebo modulu nekompatibilního s GPL nastaví příznak 'taint' v běžícím jádře - to znamená, že jakékoli problémy nebo chyby, které se vyskytnou, budou méně pravděpodobné, že budou prošetřeny správci. LKM se efektivně stávají součástí běžícího jádra, takže mohou poškodit datové struktury jádra a způsobit chyby, které nemusí být možné prozkoumat, pokud je modul skutečně chráněný.

Linuxantská kontroverze

V roce 2004 se Linuxant, poradenská společnost, která vydává proprietární ovladače zařízení jako načtitelné moduly jádra, pokusila zneužít nulový terminátor v jejich MODULE_LICENSE, jak je vidět v následujícím výňatku kódu:

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

Kód pro porovnávání řetězců používaný v té době jádrem se snažil zjistit, zda byl modul GPLed zastaven, když dosáhl nulového znaku ( \ 0 ), takže byl podveden, aby si myslel, že modul deklaruje svou licenci pouze jako „GPL“ .

FreeBSD

Moduly jádra pro FreeBSD jsou uloženy v adresáři / boot / kernel / pro moduly distribuované s operačním systémem , nebo obvykle / boot / modules / pro moduly nainstalované z portů FreeBSD nebo balíků FreeBSD , nebo pro proprietární nebo jinak pouze binární moduly. Moduly jádra FreeBSD mají obvykle příponu .ko . Jakmile je stroj spuštěn, mohou být načteny příkazem kldload , uvolněny pomocí kldunload a uvedeny v seznamu kldstat . Moduly lze také načíst z zavaděče před spuštěním jádra, a to buď automaticky (prostřednictvím /boot/loader.conf ) nebo ručně.

Operační Systém Mac

Některé načtitelné moduly jádra v systému macOS lze načíst automaticky. Načtitelné moduly jádra lze také načíst příkazem kextload . Mohou být uvedeny pomocí příkazu kextstat . Načtitelné moduly jádra jsou umístěny ve svazcích s příponou .kext . Moduly dodávané s operačním systémem jsou uloženy v adresáři / System / Library / Extensions ; moduly dodávané třetími stranami jsou v různých jiných adresářích.

NetWare

Modul jádra NetWare se označuje jako NetWare Loadable Module (NLM). NLM jsou vloženy do jádra NetWare pomocí příkazu LOAD a odebrány pomocí příkazu UNLOAD; jsou moduly příkaz vypíše aktuálně načtené moduly jádra. NLM se mohou nacházet v jakékoli platné vyhledávací cestě přiřazené na serveru NetWare a jako příponu názvu souboru mají .NLM .

VxWorks

Lze vytvořit projekt typu stahovatelného modulu jádra (DKM), který vygeneruje soubor „.out“, který lze poté načíst do prostoru jádra pomocí příkazu „ld“. Tento stahovatelný modul jádra lze uvolnit pomocí příkazu „unld“.

Solaris

Solaris má konfigurovatelnou cestu pro načtení modulu jádra, výchozí je / platforma / název-platformy / jádro / jádro / usr / jádro . Většina modulů jádra žije v podadresářích pod / kernel ; ty, které nejsou považovány za nutné pro zavedení systému do bodu, který může spustit init, se často (ale ne vždy) nacházejí v / usr / kernel . Při spuštění sestavení jádra DEBUG se systém aktivně pokouší uvolnit moduly.

Binární kompatibilita

Linux neposkytuje stabilní API ani ABI pro moduly jádra. To znamená, že existují rozdíly ve vnitřní struktuře a funkcích mezi různými verzemi jádra, což může způsobit problémy s kompatibilitou. Ve snaze bojovat proti těmto problémům, symbol verzí dat je umístěn v .modinfo úseku loadable ELF modulů. Tyto informace o verzích lze porovnat s informacemi o běžícím jádru před načtením modulu; pokud jsou verze nekompatibilní, modul se nenačte.

Jiné operační systémy, jako jsou Solaris , FreeBSD , macOS a Windows, udržují rozhraní API jádra a ABI relativně stabilní, čímž se tomuto problému vyhnou. Například moduly jádra FreeBSD kompilované proti jádru verze 6.0 budou fungovat bez rekompilace s jakoukoli jinou verzí FreeBSD 6.x, např. 6.4. Nejsou však kompatibilní s jinými hlavními verzemi a musí být znovu zkompilovány pro použití s ​​FreeBSD 7.x, protože kompatibilita API a ABI je udržována pouze v rámci větve.

Bezpečnostní

Zatímco zaváděcí moduly jádra jsou pohodlnou metodou úpravy běžícího jádra, útočníci na napadeném systému to mohou zneužít, aby zabránili detekci svých procesů nebo souborů , což jim umožní udržet si kontrolu nad systémem. Mnoho rootkitů tímto způsobem využívá LKM. Všimněte si, že na většině operačních systémů moduly nijak nepomáhají ke zvýšení oprávnění , protože k načtení LKM je vyžadováno zvýšené oprávnění; pouze útočníkovi usnadňují skrytí vloupání.

Linux

Linux umožňuje zakázat načítání modulů pomocí volby sysctl/proc/sys/kernel/modules_disabled . Systém initramfs může načíst konkrétní moduly potřebné pro počítač při spuštění a poté deaktivovat načítání modulů. Díky tomu je zabezpečení velmi podobné monolitickému jádru. Pokud útočník dokáže změnit initramfs, může změnit binární soubor jádra.

Operační Systém Mac

V OS X Yosemite a novějších verzích musí být přípona jádra podepsána kódem s certifikátem vývojáře, který k tomu má určité „oprávnění“. Takový certifikát pro vývojáře poskytuje Apple pouze na vyžádání a není automaticky vydáván členům Apple Developer . Tato funkce, nazývaná „podepisování kextů“, je ve výchozím nastavení povolena a dává jádru pokyn, aby zastavil bootování, pokud jsou k dispozici nepodepsaná rozšíření jádra. V OS X El Capitan a novějších verzích je součástí ochrany integrity systému .

Ve starších verzích systému macOS nebo pokud je podepisování kextů zakázáno, lze načíst modul jádra v balíčku rozšíření jádra uživateli bez oprávnění root, pokud je vlastnost OSBundleAllowUserLoad nastavena na True v seznamu vlastností balíčku. Pokud však některý ze souborů v balíčku, včetně souboru spustitelného kódu, není vlastněn kořenovým a skupinovým kolečkem nebo je zapisovatelný skupinou nebo „jiným“, pokus o načtení zaváděcího modulu jádra selže.

Solaris

Moduly jádra mohou volitelně mít sekci ELF s kryptografickým podpisem, která se ověřuje při načtení v závislosti na nastavení zásad Verified Boot. Jádro může vynutit, aby byly moduly kryptograficky podepsány sadou důvěryhodných certifikátů; seznam důvěryhodných certifikátů je uchováván mimo operační systém v ILOM na některých platformách založených na SPARC. Načítání modulu jádra iniciovaného uživatelským prostorem je možné pouze z důvěryhodné cesty, když je systém spuštěn s povolenou funkcí Immutable Global Zone.

Viz také

Reference