
Linux kernel source tree (v4.1.15) mit Schwerpunkt auf CVE-2023-28772, das eine Referenzumgebung für Schwachstellenanalyse, Exploit-Forschung und Kernel-Sicherheitsschulung bietet.
Linux-Kernel, Version 4.x http://kernel.org/
Dies sind die Versionshinweise für Linux Version 4. Lesen Sie sie sorgfältig, da sie erklären, worum es geht, wie der Kernel installiert wird, und was zu tun ist, wenn etwas schiefgeht.
WAS IST LINUX?
Linux ist ein Klon des Betriebssystems Unix, der von Grund auf von Linus Torvalds mit Hilfe eines locker verbundenen Teams von Hackern aus dem Netz geschrieben wurde. Es zielt auf POSIX- und Single-UNIX-Specification-Konformität ab.
Es verfügt über alle Funktionen, die man von einem modernen vollwertigen Unix erwarten würde, einschließlich echtem Multitasking, virtuellem Speicher, Shared Libraries, Demand Loading, Copy-on-Write-Executables, ordnungsgemäßer Speicherverwaltung, und Multistack-Netzwerk mit IPv4 und IPv6.
Es wird unter der GNU General Public License vertrieben – siehe die beiliegende Datei COPYING für weitere Details.
AUF WELCHER HARDWARE LÄUFT ES?
Obwohl ursprünglich zunächst für 32-Bit-x86-basierte PCs (386 oder höher) entwickelt, läuft Linux heute auch auf (mindestens) den Architekturen Compaq Alpha AXP, Sun SPARC und UltraSPARC, Motorola 68000, PowerPC, PowerPC64, ARM, Hitachi SuperH, Cell, IBM S/390, MIPS, HP PA-RISC, Intel IA-64, DEC VAX, AMD x86-64, AXIS CRIS, Xtensa, Tilera TILE, AVR32 und Renesas M32R.
Linux ist leicht auf die meisten 32- oder 64-Bit-Allzweckarchitekturen portierbar, sofern sie eine seitenweise Speicherverwaltungseinheit (PMMU) und einen Port des GNU-C-Compilers (gcc) (Teil der GNU Compiler Collection, GCC) besitzen. Linux wurde auch auf einige Architekturen ohne PMMU portiert, wobei die Funktionalität dann offensichtlich etwas eingeschränkt ist. Linux wurde auch auf sich selbst portiert. Sie können den Kernel jetzt als Benutzeranwendung ausführen – dies wird UserMode Linux (UML) genannt.
DOKUMENTATION:
Es gibt sowohl im Internet in elektronischer Form als auch in Büchern eine große Menge an Dokumentation, sowohl Linux-spezifisch als auch zu allgemeinen UNIX-Fragen. Ich empfehle, in den Dokumentationsunterverzeichnissen auf jeder Linux-FTP-Site nach den LDP-Büchern (Linux Documentation Project) zu suchen. Diese README ist nicht als Dokumentation für das System gedacht: es gibt viel bessere Quellen.
Es gibt verschiedene README-Dateien im Unterverzeichnis Documentation/: diese enthalten typischerweise kernelspezifische Installationshinweise für einige Treiber, zum Beispiel. Siehe Documentation/00-INDEX für eine Liste dessen, was in jeder Datei enthalten ist. Bitte lesen Sie die Datei Changes, da sie Informationen über die Probleme enthält, die durch ein Upgrade Ihres Kernels auftreten können.
Das Unterverzeichnis Documentation/DocBook/ enthält mehrere Anleitungen für Kernel-Entwickler und -Benutzer. Diese Anleitungen können in einer Reihe von Formaten ausgegeben werden: PostScript (.ps), PDF, HTML, und Man-Seiten, unter anderem. Nach der Installation rendern "make psdocs", "make pdfdocs", "make htmldocs" oder "make mandocs" die Dokumentation im angeforderten Format.
INSTALLATION DER KERNEL-QUELLEN:
Wenn Sie die vollständigen Quellen installieren, legen Sie das Kernel-Tarball in ein Verzeichnis, in dem Sie Schreibrechte haben (z.B. Ihr Home-Verzeichnis) und entpacken Sie es:
xz -cd linux-4.X.tar.xz | tar xvf -
Ersetzen Sie "X" mit der Versionsnummer des aktuellen Kernels.
Verwenden Sie NICHT den Bereich /usr/src/linux! Dieser Bereich enthält einen (normalerweise unvollständigen) Satz von Kernel-Headern, die von den Bibliotheks-Header-Dateien verwendet werden. Sie sollten zur Bibliothek passen und nicht durch das, was der Kernel-des-Tages gerade ist, durcheinandergebracht werden.
Sie können auch zwischen 4.x-Veröffentlichungen durch Patchen upgraden. Patches werden im xz-Format verteilt. Um durch Patchen zu installieren, holen Sie sich alle neueren Patch-Dateien, wechseln Sie in das oberste Verzeichnis der Kernel-Quellen (linux-4.X) und führen Sie aus:
xz -cd ../patch-4.x.xz | patch -p1
Ersetzen Sie "x" für alle Versionen größer als die Version "X" Ihres aktuellen Quellbaums, der Reihe nach, und es sollte funktionieren. Sie möchten vielleicht die Sicherungsdateien (irgendein-dateiname~ oder irgendein-dateiname.orig) entfernen und sicherstellen, dass es keine fehlgeschlagenen Patches gibt (irgendein-dateiname# oder irgendein-dateiname.rej). Wenn es welche gibt, haben entweder Sie oder ich einen Fehler gemacht.
Im Gegensatz zu Patches für die 4.x-Kernel sind Patches für die 4.x.y-Kernel (auch als -stable-Kernel bekannt) nicht inkrementell, sondern werden direkt auf den Basis-4.x-Kernel angewendet. Wenn Ihr Basiskernel zum Beispiel 4.0 ist und Sie den 4.0.3-Patch anwenden möchten, müssen Sie nicht zuerst die 4.0.1- und 4.0.2-Patches anwenden. Wenn Sie Kernel-Version 4.0.2 ausführen und auf 4.0.3 springen möchten, müssen Sie zuerst den 4.0.2-Patch rückgängig machen (d.h. patch -R) bevor Sie den 4.0.3-Patch anwenden. Sie können mehr darüber in Documentation/applying-patches.txt lesen.
Alternativ kann das Skript patch-kernel verwendet werden, um diesen Prozess zu automatisieren. Es ermittelt die aktuelle Kernel-Version und wendet alle gefundenen Patches an.
linux/scripts/patch-kernel linux
Das erste Argument im obigen Befehl ist der Speicherort der Kernel-Quellen. Patche werden aus dem aktuellen Verzeichnis angewendet, aber ein alternatives Verzeichnis kann als zweites Argument angegeben werden.
Stellen Sie sicher, dass keine veralteten .o-Dateien und Abhängigkeiten herumliegen:
cd linux make mrproper
Sie sollten nun die Quellen korrekt installiert haben.
SOFTWARE-ANFORDERUNGEN
Das Kompilieren und Ausführen der 4.x-Kernel erfordert aktuelle Versionen verschiedener Softwarepakete. Konsultieren Sie Documentation/Changes für die erforderlichen Mindestversionsnummern und wie Sie Updates für diese Pakete erhalten. Beachten Sie, dass die Verwendung übermäßig alter Versionen dieser Pakete indirekte Fehler verursachen kann, die sehr schwer aufzuspüren sind, also gehen Sie nicht davon aus, dass Sie Pakete einfach aktualisieren können, wenn während des Baus oder Betriebs offensichtliche Probleme auftreten.
BUILD-VERZEICHNIS für den Kernel:
Beim Kompilieren des Kernels werden alle Ausgabedateien standardmäßig zusammen mit dem Kernel-Quellcode gespeichert. Mit der Option "make O=output/dir" können Sie einen alternativen Ort für die Ausgabedateien (einschließlich .config) angeben. Beispiel:
Kernel-Quellcode: /usr/src/linux-4.X
Build-Verzeichnis: /home/name/build/kernel
Um den Kernel zu konfigurieren und zu bauen, verwenden Sie:
cd /usr/src/linux-4.X
make O=/home/name/build/kernel menuconfig
make O=/home/name/build/kernel
sudo make O=/home/name/build/kernel modules_install install
Bitte beachten Sie: Wenn die Option 'O=output/dir' verwendet wird, muss sie für alle Aufrufe von make verwendet werden.
KONFIGURIEREN DES KERNELS:
Überspringen Sie diesen Schritt nicht, auch wenn Sie nur eine Nebenversion upgraden. Neue Konfigurationsoptionen werden in jeder Version hinzugefügt, und es treten merkwürdige Probleme auf, wenn die Konfigurationsdateien nicht wie erwartet eingerichtet sind. Wenn Sie Ihre vorhandene Konfiguration mit minimalem Aufwand auf eine neue Version übertragen möchten, verwenden Sie "make oldconfig", das Sie nur nach den Antworten auf neue Fragen fragt.
Alternative Konfigurationsbefehle sind:
"make config" Reine Textoberfläche.
"make menuconfig" Textbasierte Farbmenüs, Radiolisten und Dialoge.
"make nconfig" Verbesserte textbasierte Farbmenüs.
"make xconfig" X-Windows (Qt) basiertes Konfigurationswerkzeug.
"make gconfig" X-Windows (Gtk) basiertes Konfigurationswerkzeug.
"make oldconfig" Standardmäßig alle Fragen basierend auf dem Inhalt Ihrer vorhandenen Datei ./.config beantworten und nach neuen Konfigurationssymbolen fragen.
"make silentoldconfig" Wie oben, aber vermeidet das Überladen des Bildschirms mit bereits beantworteten Fragen. Aktualisiert zusätzlich die Abhängigkeiten.
"make olddefconfig" Wie oben, setzt aber neue Symbole ohne Eingabeaufforderung auf ihre Standardwerte.
"make defconfig" Erstellt eine Datei ./.config unter Verwendung der Standardsymbolwerte entweder aus arch/$ARCH/defconfig oder arch/$ARCH/configs/${PLATFORM}_defconfig, je nach Architektur.
"make ${PLATFORM}_defconfig" Erstellt eine Datei ./.config unter Verwendung der Standardsymbolwerte aus arch/$ARCH/configs/${PLATFORM}_defconfig. Verwenden Sie "make help", um eine Liste aller verfügbaren Plattformen Ihrer Architektur zu erhalten.
"make allyesconfig" Erstellt eine Datei ./.config, indem Symbolwerte so weit wie möglich auf 'y' gesetzt werden.
"make allmodconfig" Erstellt eine Datei ./.config, indem Symbolwerte so weit wie möglich auf 'm' gesetzt werden.
"make allnoconfig" Erstellt eine Datei ./.config, indem Symbolwerte so weit wie möglich auf 'n' gesetzt werden.
"make randconfig" Erstellt eine Datei ./.config, indem Symbolwerte auf zufällige Werte gesetzt werden.
"make localmodconfig" Erstellt eine Konfiguration basierend auf der aktuellen Konfiguration und den geladenen Modulen (lsmod). Deaktiviert alle Moduloptionen, die für die geladenen Module nicht benötigt werden.
Um eine localmodconfig für einen anderen Rechner zu erstellen,
speichern Sie das lsmod dieses Rechners in einer Datei
und übergeben Sie es als LSMOD-Parameter.
target$ lsmod > /tmp/mylsmod
target$ scp /tmp/mylsmod host:/tmp
host$ make LSMOD=/tmp/mylsmod localmodconfig
Das oben Genannte funktioniert auch beim Cross-Compilieren.
KOMPILIEREN DES KERNELS:
Stellen Sie sicher, dass mindestens gcc 3.2 verfügbar ist. Weitere Informationen finden Sie in Documentation/Changes.
Bitte beachten Sie, dass Sie mit diesem Kernel immer noch a.out-Benutzerprogramme ausführen können.
Führen Sie ein "make" durch, um ein komprimiertes Kernel-Image zu erstellen. Es ist auch möglich, "make install" auszuführen, wenn lilo installiert ist, das zu den Kernel-Makefiles passt, aber Sie sollten zuerst Ihr spezifisches lilo-Setup überprüfen.
Um die eigentliche Installation durchzuführen, müssen Sie root sein, aber keiner der normalen Build-Schritte sollte das erfordern. Nehmen Sie den Namen root nicht vergeblich in den Mund.
Wenn Sie Teile des Kernels als `modules' konfiguriert haben, müssen Sie auch "make modules_install" ausführen.
Ausführliche Kernel-Kompilierungs-/Build-Ausgabe:
Normalerweise läuft das Kernel-Build-System in einem relativ leisen Modus (aber nicht völlig still). Manchmal müssen Sie oder andere Kernel-Entwickler jedoch Compiler-, Link- oder andere Befehle genau so sehen, wie sie ausgeführt werden. Verwenden Sie dazu den "verbose"-Build-Modus. Dies geschieht durch Einfügen von "V=1" in den "make"-Befehl. Z.B.:
make V=1 all
Wenn das Build-System auch den Grund für den Neubau jedes Ziels anzeigen soll, verwenden Sie "V=2". Der Standardwert ist "V=0".
Halten Sie einen Backup-Kernel bereit, falls etwas schiefgeht. Dies ist besonders wichtig für Entwicklungsversionen, da jede neue Version neuen Code enthält, der nicht debuggt wurde. Stellen Sie sicher, dass Sie auch ein Backup der zu diesem Kernel gehörenden Module haben. Wenn Sie einen neuen Kernel mit derselben Versionsnummer wie Ihren funktionierenden Kernel installieren, sichern Sie Ihr Module-Verzeichnis, bevor Sie "make modules_install" ausführen.
Alternativ können Sie vor dem Kompilieren die Kernel-Konfigurationsoption "LOCALVERSION" verwenden, um der regulären Kernelversion ein eindeutiges Suffix anzuhängen. LOCALVERSION kann im Menü "General Setup" eingestellt werden.
Um Ihren neuen Kernel zu booten, müssen Sie das Kernel-Image (z.B. .../linux/arch/i386/boot/bzImage nach der Kompilierung) an den Ort kopieren, an dem sich Ihr regulärer bootfähiger Kernel befindet.
Das Booten eines Kernels direkt von einer Diskette ohne die Hilfe eines Bootloaders wie LILO wird nicht mehr unterstützt.
Wenn Sie Linux von der Festplatte booten, verwenden Sie wahrscheinlich LILO, das das Kernel-Image verwendet, das in der Datei /etc/lilo.conf angegeben ist. Das Kernel-Image ist normalerweise /vmlinuz, /boot/vmlinuz, /bzImage oder /boot/bzImage. Um den neuen Kernel zu verwenden, speichern Sie eine Kopie des alten Images und kopieren Sie das neue Image über das alte. Dann MÜSSEN SIE LILO ERNEUT AUSFÜHREN, um die Ladezuordnung zu aktualisieren!! Wenn Sie das nicht tun, können Sie das neue Kernel-Image nicht booten.
WENN ETWAS SCHIEFGEHT:
Wenn Sie Probleme haben, die auf Kernel-Fehler zurückzuführen zu sein scheinen, überprüfen Sie bitte die Datei MAINTAINERS, um zu sehen, ob es eine bestimmte Person gibt, die mit dem Teil des Kernels verbunden ist, mit dem Sie Probleme haben. Wenn dort niemand aufgeführt ist, ist die zweitbeste Möglichkeit, sie an mich zu mailen ([email protected]) und möglicherweise an jede andere relevante Mailing-Liste oder an die Newsgroup.
Geben Sie in allen Fehlerberichten bitte an, über welchen Kernel Sie sprechen, wie das Problem zu reproduzieren ist und wie Ihr Setup aussieht (verwenden Sie Ihren gesunden Menschenverstand). Wenn das Problem neu ist, teilen Sie mir das mit, und wenn das Problem alt ist, versuchen Sie bitte zu sagen, wann Sie es zum ersten Mal bemerkt haben.
Wenn der Fehler zu einer Meldung wie
unable to handle kernel paging request at address C0000010 Oops: 0002 EIP: 0010:XXXXXXXX eax: xxxxxxxx ebx: xxxxxxxx ecx: xxxxxxxx edx: xxxxxxxx esi: xxxxxxxx edi: xxxxxxxx ebp: xxxxxxxx ds: xxxx es: xxxx fs: xxxx gs: xxxx Pid: xx, process nr: xx xx xx xx xx xx xx xx xx xx xx
oder ähnlichen Kernel-Debugging-Informationen auf Ihrem Bildschirm oder in Ihrem Systemlog führt, reproduzieren Sie diese exakt. Der Dump mag für Sie unverständlich erscheinen, enthält aber Informationen, die beim Debuggen des Problems helfen können. Der Text über dem Dump ist ebenfalls wichtig: Er sagt etwas darüber aus, warum der Kernel Code gedumpt hat (im obigen Beispiel aufgrund eines ungültigen Kernel-Zeigers). Weitere Informationen zur Deutung des Dumps finden Sie in Documentation/oops-tracing.txt
Wenn Sie den Kernel mit CONFIG_KALLSYMS kompiliert haben, können Sie den Dump so wie er ist senden, andernfalls müssen Sie das Programm "ksymoops" verwenden, um den Dump zu verstehen (aber das Kompilieren mit CONFIG_KALLSYMS ist normalerweise vorzuziehen). Dieses Dienstprogramm kann von ftp://ftp..kernel.org/pub/linux/utils/kernel/ksymoops/ heruntergeladen werden. Alternativ können Sie die Dump-Suche von Hand durchführen:
Beim Debuggen von Dumps wie dem obigen hilft es enorm, wenn Sie nachschlagen können, was der EIP-Wert bedeutet. Der Hex-Wert als solcher hilft mir oder jemand anderem nicht sehr viel: Er hängt von Ihrem spezifischen Kernel-Setup ab. Was Sie tun sollten, ist, den Hex-Wert aus der EIP-Zeile zu nehmen (ignorieren Sie die "0010:"), und ihn in der Kernel-Namensliste nachzuschlagen, um zu sehen, welche Kernel-Funktion die fehlerhafte Adresse enthält.
Um den Namen der Kernel-Funktion zu finden, müssen Sie die System-Binärdatei finden, die zu dem Kernel gehört, der das Symptom gezeigt hat. Dies ist die Datei 'linux/vmlinux'. Um die Namensliste zu extrahieren und sie mit dem EIP aus dem Kernel-Absturz abzugleichen, führen Sie aus:
nm vmlinux | sort | less
"make localyesconfig" Ähnlich wie localmodconfig, außer dass es alle Moduloptionen in eingebaute (=y) Optionen umwandelt.
Weitere Informationen zur Verwendung der Linux-Kernel-Konfigurationstools finden Sie in Documentation/kbuild/kconfig.txt.
HINWEISE zu "make config":
Unnötige Treiber machen den Kernel größer und können unter bestimmten Umständen zu Problemen führen: Das Sondieren nach einer nicht vorhandenen Controller-Karte kann Ihre anderen Controller verwirren.
Das Kompilieren des Kernels mit einem "Prozessortyp" höher als 386 führt zu einem Kernel, der NICHT auf einer 386 funktioniert. Der Kernel erkennt dies beim Booten und gibt auf.
Ein Kernel mit integrierter Mathematik-Emulation wird dennoch den Koprozessor verwenden, falls vorhanden: Die Mathematik-Emulation wird in diesem Fall einfach nie verwendet. Der Kernel wird etwas größer sein, aber auf verschiedenen Maschinen funktionieren, unabhängig davon, ob sie einen Mathematik-Koprozessor haben oder nicht.
Die Konfigurationsdetails von "kernel hacking" führen normalerweise zu einem größeren oder langsameren Kernel (oder beidem) und können den Kernel sogar weniger stabil machen, indem einige Routinen so konfiguriert werden, dass sie aktiv versuchen, schlechten Code zu finden, um Kernelprobleme zu erkennen (kmalloc()). Daher sollten Sie die Fragen zu "development", "experimental" oder "debugging"-Funktionen wahrscheinlich mit 'n' beantworten.
Die Neuinstallation von LILO ist normalerweise eine Sache des Ausführens von /sbin/lilo. Sie möchten vielleicht /etc/lilo.conf bearbeiten, um einen Eintrag für Ihr altes Kernel-Image (z.B. /vmlinux.old) anzugeben, falls das neue nicht funktioniert. Weitere Informationen finden Sie in der LILO-Dokumentation.
Nach der Neuinstallation von LILO sollte alles bereit sein. Fahren Sie das System herunter, starten Sie neu und genießen Sie!
Wenn Sie jemals das standardmäßige Root-Gerät, den Videomodus, die Ramdisk-Größe usw. im Kernel-Image ändern müssen, verwenden Sie das Programm 'rdev' (oder alternativ die LILO-Boot-Optionen, wenn angemessen). Kein Grund, den Kernel neu zu kompilieren, um diese Parameter zu ändern.
Starten Sie mit dem neuen Kernel neu und genießen Sie es.
Dies gibt Ihnen eine Liste von Kernel-Adressen, die in aufsteigender Reihenfolge sortiert sind, aus der es einfach ist, die Funktion zu finden, die die fehlerhafte Adresse enthält. Beachten Sie, dass die von den Kernel-Debugging-Meldungen angegebene Adresse nicht unbedingt genau mit den Funktionsadressen übereinstimmt (tatsächlich ist das sehr unwahrscheinlich), also können Sie nicht einfach die Liste 'grep'en: Die Liste gibt Ihnen jedoch den Startpunkt jeder Kernel-Funktion, sodass Sie durch die Suche nach der Funktion, die eine Startadresse hat, die niedriger ist als die, nach der Sie suchen, aber von einer Funktion mit einer höheren Adresse gefolgt wird, die gewünschte Funktion finden. Tatsächlich kann es eine gute Idee sein, ein wenig "Kontext" in Ihren Problembericht aufzunehmen, indem Sie ein paar Zeilen um die interessante herum angeben.
Wenn Sie aus irgendeinem Grund das Obige nicht tun können (Sie haben ein vorkompiliertes Kernel-Image oder ähnliches), hilft es, mir so viel wie möglich über Ihr Setup zu erzählen. Bitte lesen Sie das Dokument REPORTING-BUGS für Details.
Alternativ können Sie gdb auf einem laufenden Kernel verwenden. (schreibgeschützt; d.h. Sie können keine Werte ändern oder Haltepunkte setzen.) Dazu kompilieren Sie den Kernel zuerst mit -g; bearbeiten Sie arch/i386/Makefile entsprechend, und führen Sie dann ein "make clean" durch. Sie müssen auch CONFIG_PROC_FS aktivieren (über "make config").
Nachdem Sie mit dem neuen Kernel neu gestartet haben, führen Sie "gdb vmlinux /proc/kcore" aus. Sie können nun alle üblichen gdb-Befehle verwenden. Der Befehl, um den Punkt nachzuschlagen, an dem Ihr System abgestürzt ist, ist "l *0xXXXXXXXX". (Ersetzen Sie die XXXes mit dem EIP-Wert.)
gdb auf einem nicht laufenden Kernel schlägt derzeit fehl, weil gdb (fälschlicherweise) den Startoffset ignoriert, für den der Kernel kompiliert ist.