Ladbares Kernelmodul
Im Computer, a Ladbares Kernelmodul (Lkm) ist ein Objektdatei das enthält Code zu erweitern das Laufen Kernel, oder so genannt Basiskern, von einem Betriebssystem. LKMs werden in der Regel verwendet, um neue Unterstützung für neue zu erhöhen Hardware- (wie Gerätetreiber) und/oder Dateisysteme, oder zum Hinzufügen Systemaufrufe. Wenn die von einem LKM bereitgestellte Funktionalität nicht mehr erforderlich ist, kann sie entladen werden, um frei zu frei Erinnerung und andere Ressourcen.
Aktuellsten Unix-artig Systeme und Microsoft Windows Unterstützen Sie ladbare Kernelmodule unter verschiedenen Namen, wie z. Kernelladbares Modul (kld) in Freebsd, Kernelerweiterung (Kext) in Mac OS (jetzt veraltet[1]),[2] Kernel -Erweiterungsmodul in AIX, Kernel-Mode-Treiber in Windows NT[3] und herunterladbares Kernel -Modul (DKM) in VxWorks. Sie sind auch als bekannt als als Kernel -ladbare Module (oder KLM) und einfach als Kernelmodule (KMOD).
Vorteile
Ohne ladbare Kernelmodule müsste ein Betriebssystem alle möglichen erwarteten Funktionen einbeziehen, die direkt in den Basiskern zusammengestellt sind. Ein Großteil dieser Funktionalität würde sich im Speicher befinden, ohne verwendet zu werden, das Speicher zu verschwenden, und erfordern, dass Benutzer den Basiskern jedes Mal wieder aufbauen und neu starten, wenn sie neue Funktionen benötigen.
Nachteile
Eine kleine Kritik daran, einen modularen Kernel gegenüber einem statischen Kernel zu bevorzugen, ist der sogenannte Zersplitterung Strafe. Der Basiskern ist immer in real zusammenhängend Erinnerung durch seine Setup -Routinen; Somit wird der Basiskernelcode niemals fragmentiert. Sobald sich das System in einem Zustand befindet, in dem Module eingefügt werden können, zum Beispiel einmal der Dateisysteme gewesen sein montiert Das enthält die Module, es ist wahrscheinlich, dass ein neues Kernel -Code -Einfügen den Kernel fragmentiert wird, wodurch eine geringfügige Leistungsstrafe durch mehr verwendet wird Tlb Einträge, die mehr TLB -Fehler verursachen.
Implementierungen in verschiedenen Betriebssystemen
Linux
Ladbare Kernelmodule in Linux werden durch die geladen (und entladen) Modprobe
Befehl. Sie befinden sich in /lib/module
oder /usr/lib/module
und hatte die Erweiterung .Ko
("Kernel -Objekt") Seit Version 2.6 (frühere Versionen verwendeten die .Ö
Verlängerung).[4] Das lsmod
Der Befehl listet die geladenen Kernel -Module auf. In Notfällen, wenn das System aufgrund von z. Zerbrochene Module, bestimmte Module können aktiviert oder deaktiviert werden, indem die Liste der Kernel -Startparameter geändert wird (beispielsweise bei Verwendung RODENdurch Drücken von 'e' im Grub -Startmenü und dann die Kernel -Parameterlinie bearbeiten).
Lizenzfragen
Nach Ansicht von Linux -Betreuern sind LKM abgeleitete Werke des Kernels. Die Linux -Betreuer tolerieren die Verteilung von proprietär Module, aber zulassen, dass Symbole als nur verfügbar markiert werden GNU Allgemeine öffentliche Lizenz (GPL) Module.
Das Laden eines proprietären oder nicht gPL-kompatiblen Modul[5][6] Im Laufkern - bedeutet, dass Probleme oder Fehlern, die aufgetreten sind, weniger wahrscheinlich von den Betreuern untersucht werden.[7][8] LKMs werden effektiv Teil des laufenden Kernels und können Kernel -Datenstrukturen korrumpieren und Fehler erzeugen, die möglicherweise nicht untersucht werden können, wenn das Modul tatsächlich proprietär ist.
Linuxant -Kontroverse
Im Jahr 2004 liefert Linuxant ein Beratungsunternehmen, das proprietär freigibt Gerätetreiber Als ladbare Kernelmodule versuchte ein Missbrauch a Null -Terminator in ihren Module_license
, wie im folgenden Codeauszug sichtbar:
Module_license("GPL\0für Dateien in der \ "Gpl\ " Verzeichnis; Für andere gilt nur die Lizenzdatei ");
Der vom Kernel verwendete String -Vergleichscode zum Zeitpunkt versuchte zu bestimmen, ob das Modul mit einem Nullzeichen gestoppt wurde (\0
), also wurde es täuschen, zu denken, dass das Modul seine Lizenz als "GPL" erklärte.[9]
Freebsd
Kernelmodule für Freebsd sind in innerhalb /boot/kernel/
Für Module, die mit dem verteilt sind Betriebssystemoder normalerweise /boot/module/
Für Module, die von installiert sind FreeBSD -Ports oder FreeBSD -Pakete, oder für proprietäre oder auf andere Weise nur binäre Module. FreeBSD -Kernelmodule haben normalerweise die Erweiterung .Ko
. Sobald die Maschine gebootet ist, können sie mit dem geladen werden KLDAD
Befehl, entladen mit Kldunload
und aufgelistet mit KLDSTAT
. Module können auch aus dem Lader geladen werden, bevor der Kernel startet, entweder automatisch (bis /boot/loader.conf
) oder von Hand.
Mac OS
Einige ladbare Kernelmodule in MacOS können automatisch geladen werden. Ladbare Kernelmodule können auch von der geladen werden kextload
Befehl. Sie können von der aufgeführt werden kextstat
Befehl. Ladbare Kernelmodule befinden sich in Bündel mit der Erweiterung .Kext
. Mit dem Betriebssystem gelieferte Module werden in der gespeichert /System/Bibliothek/Erweiterungen
Verzeichnis; Module, die von Dritten geliefert werden, befinden sich in verschiedenen anderen Verzeichnissen.
Netware
Ein NetWare -Kernel -Modul wird als als bezeichnet NetWare Ladable Modul (NLM). NLMs werden mittels des Lastbefehls in den NetWare -Kernel eingefügt und mittels des Befehls von Entlade entfernt. das Module
Befehlslisten listen derzeit Kernelmodule auf. NLMS kann sich in einem gültigen Suchpfad befinden, der auf dem NetWare -Server zugewiesen ist, und sie haben es .Nlm
als Dateiname Erweiterung.
VxWorks
Ein DKM -Typ (Downloadable Kernel Modul) kann erstellt werden, um eine ".out" -Datei "zu generieren, die dann mit dem Befehl" LD "in den Kernel -Speicherplatz geladen werden kann. Dieses herunterladbare Kernel -Modul kann mit "UNLD" -Befehl entladen werden.
Solaris
Solaris verfügt /Plattform/Plattform-Name/Kernel/Kernel/USR/Kernel
. Die meisten Kernelmodule leben in Unterverzeichnissen unter /Kernel
; Diejenigen, die nicht als notwendig angesehen werden, um das System so weit zu starten, dass Init beginnen kann, sind häufig (aber nicht immer) in /usr/kernel
. Beim Ausführen eines Debugkerns versucht das System aktiv, Module zu entladen.
Binäre Kompatibilität
Linux bietet keinen Stall API oder Abi Für Kernelmodule. Dies bedeutet, dass es Unterschiede in der internen Struktur und Funktion zwischen verschiedenen Kernelversionen gibt, die Kompatibilitätsprobleme verursachen können. In dem Versuch, diese Probleme zu bekämpfen, werden Symbolversionierungsdaten innerhalb der platziert .Modinfo
Abschnitt von Ladable ELF Module. Diese Versionsinformationen können mit dem des laufenden Kernels verglichen werden, bevor ein Modul geladen wird. Wenn die Versionen nicht kompatibel sind, wird das Modul nicht geladen.
Andere Betriebssysteme, wie z. Solaris, Freebsd, Mac OS, und Fenster Behalte den Kernel API und Abi relativ stabil und vermeidet dieses Problem. Zum Beispiel, Freebsd Kernel -Module, die gegen Kernel Version 6.0 zusammengestellt wurden, funktioniert ohne Neukompilierung für eine andere FreeBSD 6.x -Version, z. 6.4. Sie sind jedoch nicht mit anderen Hauptversionen kompatibel und müssen zur Verwendung mit FreeBSD 7.x neu kompiliert werden, da die Kompatibilität von API und ABI nur innerhalb eines Zweigs aufrechterhalten wird.
Sicherheit
Während ladbare Kernelmodule eine bequeme Methode zur Änderung des laufenden Kernels sind, kann dies von Angreifern auf einem kompromittierten System missbraucht werden, um die Erkennung ihrer zu verhindern Prozesse oder Dateienund erlauben ihnen, die Kontrolle über das System aufrechtzuerhalten. Viele Rootkits Nutzen Sie LKMs auf diese Weise. Beachten Sie, dass bei den meisten Betriebssystemmodulen nicht helfen Privilegerhebung In irgendeiner Weise ist ein erhöhtes Privileg erforderlich, um ein LKM zu laden; Sie machen es dem Angreifer nur leichter, den Einbruch zu verbergen.[10]
Linux
Linux ermöglicht das Deaktivieren des Moduls des Moduls durch sysctl Möglichkeit /proc/sys/kernel/modules_disabled
.[11][12] Ein Initramfs Das System kann bestimmte Module laden, die für eine Maschine beim Start benötigt werden, und dann das Laden des Moduls deaktivieren. Dies macht die Sicherheit einem monolithischen Kernel sehr ähnlich. Wenn ein Angreifer die Initramfs ändern kann, kann er den Kernel -Binär ändern.
Mac OS
Im OS X Yosemite und später Veröffentlichungen muss eine Kernel -Erweiterung sein Code signiert mit einem Entwicklerzertifikat, das dafür einen bestimmten "Anspruch" besitzt. Ein solches Entwicklerzertifikat wird nur von Apple auf Anfrage bereitgestellt und nicht automatisch angegeben Apple -Entwickler Mitglieder. Diese Funktion namens "Kext Signing" ist standardmäßig aktiviert und weist den Kernel an, nicht mehr zu booten, wenn vorzeichenlose Kernelverlängerungen vorhanden sind.[13] Im Os x El Capitan und später veröffentlichen, es ist Teil von von Systemintegritätsschutz.
In älteren Versionen von macOS oder wenn die Kext-Signierung deaktiviert ist, kann ein ladbares Kernel-Modul in einem Kernel-Erweiterungsbündel von Nicht-Root-Benutzern geladen werden, wenn die Eigenschaft osbundleAllowuserload in der Eigenschaftsliste des Bundle auf true eingestellt ist.[14] Wenn jedoch eine der Dateien im Bundle, einschließlich der ausführbaren Code -Datei, nicht im Besitz von Root und Group Wheel oder von der Gruppe oder "anderen" beschreibend ist, schlägt der Versuch, das Kernel -Loadable -Modul zu laden, fehl.[15]
Solaris
Kernelmodule können optional einen kryptografischen Signatur -ELF -Abschnitt haben, der je nach den verifizierten Boot -Richtlinieneinstellungen über Last verifiziert wird. Der Kernel kann durchsetzen, dass Module kryptografisch von einer Reihe von vertrauenswürdigen Zertifikaten unterzeichnet werden. Die Liste der vertrauenswürdigen Zertifikate findet auf einigen Sparc -basierten Plattformen außerhalb des Betriebssystems im ILOM statt. Das Laden von UserSpace Initiated Kernel Modul ist nur vom vertrauenswürdigen Pfad aus möglich, wenn das System mit der unveränderlichen globalen Zone -Funktion aktiviert ist.
Siehe auch
Verweise
- ^ "Veraltete Kernelerweiterungen und Alternativen zur Systemerweiterung". Apple Inc. Abgerufen 13. März 2021.
- ^ "Kernel -Erweiterungsprogrammierungsthemen: Einführung". Apple Inc. 1. September 2010. Archiviert Aus dem Original am 4. Mai 2013. Abgerufen 5. Mai, 2013.
- ^ "Was bestimmt, wann ein Treiber geladen ist". Microsoft Developer Network. Microsoft. 21. November 2012. Archiviert Aus dem Original am 6. März 2013. Abgerufen 5. Mai, 2013.
- ^ "Programmierhandbuch für Linux -Kernel -Modul, Abschnitt 2.2" Kompilienkernmodule kompilieren "". Abgerufen 2020-10-05.
- ^ Linus Torvalds; et al. (2011-06-21). "Dokumentation/oops-Tracing.txt". kernel.org. Archiviert vom Original am 2011-10-02. Abgerufen 2011-10-03.
- ^ "Verdorbene Kerne". Der Leitfaden des Linux -Kernel -Benutzers und des Administrators.
- ^ Jonathan Corbet (2006-03-24). "Tainting aus dem Benutzerraum". Lwn.net. Archiviert vom Original am 2011-11-16. Abgerufen 2011-10-03.
- ^ "Novell Support Dokumentation: verdorbener Kernel". 2007-07-26. Abgerufen 2011-10-03.
- ^ Jonathan Corbet (27. April 2004). "Ehrlich mit Module_license zu sein". Lwn.net. Archiviert Aus dem Original am 2. November 2012. Abgerufen 30. Oktober, 2012.
- ^ Ausnutzung von ladbaren Kernelmodulen Archiviert 2012-02-04 bei der Wayback -Maschine
- ^ "Sysctl/kernel.txt". Archiviert von das Original am 15. April 2013. Abgerufen 4. Januar, 2013.
- ^ Kees Cook (2012-11-28). "Behinderung des Moduls" sauberes Modul ". exflux.net. Abgerufen 2020-10-05.
- ^ "Kernelverlängerungen". MAC Developer Library. Apfel. 16. September 2015. Archiviert Aus dem Original am 17. August 2016. Abgerufen 29. September, 2016.
- ^ "Info.Plist -Eigenschaften für Kernel -Erweiterungen". Apple Inc. Archiviert Aus dem Original am 26. September 2012. Abgerufen 27. September, 2012.
- ^ Darwin und Mac OS Systemmanager Handbuch - -