
Linux-Kernel-4.1.15-Quellbaum mit Schwerpunkt auf CVE-2018-5873, der eine Referenz für Schwachstellenanalyse und Exploit-Forschung darstellt.
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 Unterstützung eines locker verbundenen Teams von Hackern im gesamten Netz geschrieben wurde. Es strebt die Einhaltung von POSIX und der Single UNIX Specification an.
Es verfügt über alle Funktionen, die Sie von einem modernen vollwertigen Unix erwarten würden, einschließlich echtem Multitasking, virtuellem Speicher, gemeinsam genutzten Bibliotheken, Demand Loading, gemeinsam genutzten Copy-on-Write-Executables, ordnungsgemäßer Speicherverwaltung und Multistack-Netzwerk (einschließlich IPv4 und IPv6).
Es wird unter der GNU General Public License vertrieben – weitere Einzelheiten finden Sie in der beiliegenden COPYING-Datei.
AUF WELCHER HARDWARE LÄUFT ES?
Obwohl ursprünglich 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 über eine Paged Memory Management Unit (PMMU) und einen Port des GNU C Compilers (gcc) (Teil der GNU Compiler Collection, GCC) verfügen. Linux wurde auch auf eine Reihe von 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 Userspace-Anwendung ausführen – dies wird UserMode Linux (UML) genannt.
DOKUMENTATION:
Es gibt sowohl in elektronischer Form im Internet als auch in Büchern eine Fülle von Dokumentationen, die sowohl Linux-spezifisch als auch allgemeine UNIX-Fragen betreffen. Ich empfehle, in den Dokumentations-Unterverzeichnissen auf einer beliebigen Linux-FTP-Site nach den LDP-Büchern (Linux Documentation Project) zu suchen. Diese README ist nicht als Dokumentation des Systems gedacht: Es gibt viel bessere Quellen.
Im Unterverzeichnis Documentation/ befinden sich verschiedene README-Dateien: Diese enthalten normalerweise kernelspezifische Installationshinweise für einige Treiber. 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 Probleme enthält, die durch ein Upgrade Ihres Kernels entstehen können.
Das Unterverzeichnis Documentation/DocBook/ enthält mehrere Leitfäden für Kernelentwickler und -benutzer. Diese Leitfäden können in verschiedenen Formaten ausgegeben werden: PostScript (.ps), PDF, HTML und man-Seiten, unter anderem. Nach der Installation werden mit "make psdocs", "make pdfdocs", "make htmldocs" oder "make mandocs" die Dokumentationen im gewünschten Format erstellt.
INSTALLATION des Kernelquellcodes:
Wenn Sie die vollständigen Quellen installieren, legen Sie das Kernel-Tarball in ein Verzeichnis, für das Sie Schreibrechte haben (z.B. Ihr Home-Verzeichnis) und entpacken Sie es:
xz -cd linux-4.X.tar.xz | tar xvf -
Ersetzen Sie "X" durch die Versionsnummer des neuesten Kernels. Verwenden Sie NICHT das Verzeichnis /usr/src/linux! In diesem Bereich befindet sich ein (normalerweise unvollständiger) Satz von Kernel-Headern, die von den Bibliotheks-Header-Dateien verwendet werden. Diese sollten mit der Bibliothek übereinstimmen und nicht durch den jeweils aktuellen Kernel durcheinandergebracht werden.
Sie können auch zwischen 4.x-Versionen durch Patchen aktualisieren. Patches werden im xz-Format verteilt. Um durch Patchen zu installieren, holen Sie alle neueren Patch-Dateien, wechseln Sie in das oberste Verzeichnis des Kernelquellcodes (linux-4.X) und führen Sie aus:
xz -cd ../patch-4.x.xz | patch -p1
Ersetzen Sie "x" für alle Versionen, die größer als die Version "X" Ihres aktuellen Quellbaums sind, der Reihe nach, und alles sollte in Ordnung sein. Möglicherweise möchten Sie die Sicherungsdateien (ein-dateiname~ oder ein-dateiname.orig) entfernen und sicherstellen, dass es keine fehlgeschlagenen Patches gibt (ein-dateiname# oder ein-dateiname.rej). Falls doch, 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 beispielsweise 4.0 ist und Sie den 4.0.3-Patch anwenden möchten, dürfen Sie nicht zuerst die Patches 4.0.1 und 4.0.2 anwenden. Wenn Sie Kernelversion 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. Weitere Informationen hierzu finden Sie in Documentation/applying-patches.txt
Alternativ kann das Skript patch-kernel verwendet werden, um diesen Prozess zu automatisieren. Es ermittelt die aktuelle Kernelversion und wendet alle gefundenen Patches an.
linux/scripts/patch-kernel linux
Das erste Argument im obigen Befehl ist der Speicherort des Kernelquellcodes. 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.
SOFTWAREANFORDERUNGEN
Das Kompilieren und Ausführen der 4.x-Kernel erfordert aktuelle Versionen verschiedener Softwarepakete. Konsultieren Sie Documentation/Changes für die erforderlichen Mindestversionsnummern und Informationen zum Erhalt von Updates für diese Pakete. Beachten Sie, dass die Verwendung extrem alter Versionen dieser Pakete indirekte Fehler verursachen kann, die sehr schwer zu lokalisieren sind. Gehen Sie daher nicht davon aus, dass Sie Pakete einfach aktualisieren können, wenn während des Builds oder Betriebs offensichtliche Probleme auftreten.
BUILD-Verzeichnis für den Kernel:
Wenn Sie den Kernel kompilieren, werden alle Ausgabedateien standardmäßig zusammen mit dem Kernelquellcode gespeichert. Mit der Option "make O=output/dir" können Sie einen alternativen Ort für die Ausgabedateien (einschließlich .config) angeben. Beispiel:
kernel source code: /usr/src/linux-4.X
build directory: /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: Wenn die Option 'O=output/dir' verwendet wird, muss sie für alle make-Aufrufe verwendet werden.
KONFIGURATION des Kernels:
Überspringen Sie diesen Schritt nicht, auch wenn Sie nur eine Nebenversion aktualisieren. In jeder Version werden neue Konfigurationsoptionen hinzugefügt, und es treten seltsame 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" Einfache Textoberfläche.
"make menuconfig" Textbasierte Farbmenüs, Radiolisten und Dialoge.
"make nconfig" Erweiterte textbasierte Farbmenüs.
"make xconfig" X-Windows (Qt) basiertes Konfigurationswerkzeug.
"make gconfig" X-Windows (Gtk) basiertes Konfigurationswerkzeug.
"make oldconfig" Beantwortet alle Fragen standardmäßig basierend auf dem Inhalt Ihrer vorhandenen ./.config-Datei und fragt nach neuen Konfigurationssymbolen.
"make silentoldconfig" Wie oben, vermeidet jedoch das Überladen des Bildschirms mit bereits beantworteten Fragen. Aktualisiert zusätzlich die Abhängigkeiten.
"make olddefconfig" Wie oben, setzt jedoch neue Symbole ohne Nachfrage auf ihre Standardwerte.
"make defconfig" Erstellt eine ./.config-Datei unter Verwendung der Standardsymbolwerte aus entweder arch/$ARCH/defconfig oder arch/$ARCH/configs/${PLATFORM}_defconfig, abhängig von der Architektur.
"make ${PLATFORM}_defconfig" Erstellt eine ./.config-Datei 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 ./.config-Datei, indem Symbole so weit wie möglich auf 'y' gesetzt werden.
"make allmodconfig" Erstellt eine ./.config-Datei, indem Symbole so weit wie möglich auf 'm' gesetzt werden.
"make allnoconfig" Erstellt eine ./.config-Datei, indem Symbole so weit wie möglich auf 'n' gesetzt werden.
"make randconfig" Erstellt eine ./.config-Datei, indem Symbole auf zufällige Werte gesetzt werden.
"make localmodconfig" Erstellt eine Konfiguration basierend auf der aktuellen Konfiguration und den geladenen Modulen (lsmod). Deaktiviert jede Moduloption, die für die geladenen Module nicht benötigt wird.
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 Obige funktioniert auch beim Cross-Compilieren.
"make localyesconfig" Ähnlich wie localmodconfig, mit dem Unterschied, dass alle Moduloptionen in integrierte (=y) Optionen umgewandelt werden.
Weitere Informationen zur Verwendung der Linux-Kernel-Konfigurationstools finden Sie in Documentation/kbuild/kconfig.txt.
HINWEISE zu "make config":
Das Vorhandensein unnötiger Treiber macht den Kernel größer und kann unter bestimmten Umständen zu Problemen führen: Die Suche nach einer nicht vorhandenen Controllerkarte kann andere Controller verwirren.
Das Kompilieren des Kernels mit einem auf höher als 386 eingestellten "Prozessortyp" führt zu einem Kernel, der NICHT auf einem 386 funktioniert. Der Kernel erkennt dies beim Booten und gibt auf.
Ein Kernel mit integrierter Mathematik-Emulation verwendet den Koprozessor, falls vorhanden: Die Mathematik-Emulation wird in diesem Fall einfach nie genutzt. 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 des "Kernel Hacking" führen normalerweise zu einem größeren oder langsameren Kernel (oder beidem) und können den Kernel sogar instabiler machen, indem einige Routinen so konfiguriert werden, dass sie aktiv versuchen, fehlerhaften Code zu durchbrechen, um Kernelprobleme zu finden (kmalloc()). Daher sollten Sie die Fragen zu "Entwicklung", "experimentell" oder "Debugging" wahrscheinlich mit 'n' beantworten.
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 weiterhin a.out-Benutzerprogramme ausführen können.
Führen Sie "make" aus, um ein komprimiertes Kernel-Image zu erstellen. Es ist auch möglich, "make install" auszuführen, wenn lilo entsprechend den Kernel-Makefiles installiert ist, aber Sie sollten zuerst Ihre spezifische lilo-Konfiguration überprüfen. Für die eigentliche Installation müssen Sie root sein, aber keiner der normalen Build-Schritte sollte das erfordern. Verwenden Sie den Namen root nicht leichtfertig.
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 ruhigen Modus (aber nicht völlig still). Manchmal müssen Sie oder andere Kernelentwickler jedoch die Kompilierungs-, Link- oder anderen 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
Um das Build-System auch den Grund für den Neuaufbau jedes Ziels angeben zu lassen, verwenden Sie "V=2". Die Voreinstellung ist "V=0".
Halten Sie einen Backup-Kernel bereit, falls etwas schiefgeht. Dies gilt insbesondere für Entwicklungsversionen, da jede neue Version neuen Code enthält, der noch nicht debuggt wurde. Stellen Sie sicher, dass Sie auch ein Backup der zugehörigen Module dieses Kernels aufbewahren. Wenn Sie einen neuen Kernel mit derselben Versionsnummer wie Ihr funktionierender Kernel installieren, erstellen Sie ein Backup Ihres Module-Verzeichnisses, bevor Sie "make modules_install" ausführen.
Alternativ können Sie vor dem Kompilieren die Kernel-Konfigurationsoption "LOCALVERSION" verwenden, um einen eindeutigen Suffix an die reguläre Kernel-Version 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 normaler 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 im File /etc/lilo.conf angegebene Kernel-Image verwendet. 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 Lademap zu aktualisieren!! Wenn Sie das nicht tun, können Sie das neue Kernel-Image nicht booten.
Die Neuinstallation von LILO erfolgt normalerweise durch Ausführen von /sbin/lilo. Möglicherweise möchten Sie /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 Standard-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 angebracht). Es ist nicht nötig, den Kernel neu zu kompilieren, um diese Parameter zu ändern.
Starten Sie mit dem neuen Kernel neu und genießen Sie es.
WENN ETWAS SCHIEFGEHT:
Wenn Sie Probleme haben, die auf Kernel-Fehler zurückzuführen zu sein scheinen, überprüfen Sie bitte die Datei MAINTAINERS, ob eine bestimmte Person 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 ([email protected]) und möglicherweise an eine andere relevante Mailingliste oder an die Newsgroup zu senden.
Geben Sie bei allen Fehlerberichten bitte an, um welchen Kernel es sich handelt, wie das Problem reproduziert werden kann und wie Ihr Setup aussieht (verwenden Sie Ihren gesunden Menschenverstand). Wenn das Problem neu ist, teilen Sie mir dies mit, und wenn das Problem alt ist, versuchen Sie bitte mitzuteilen, 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, bitte duplizieren Sie es genau. Der Dump mag für Sie unverständlich aussehen, enthält aber Informationen, die beim Debuggen des Problems helfen können. Der Text über dem Dump ist ebenfalls wichtig: Er gibt Aufschluss darüber, warum der Kernel Code ausgeworfen hat (im obigen Beispiel aufgrund eines ungültigen Kernel-Zeigers). Weitere Informationen zur Interpretation des Dumps finden Sie in Documentation/oops-tracing.txt
Wenn Sie den Kernel mit CONFIG_KALLSYMS kompiliert haben, können Sie den Dump so senden; andernfalls müssen Sie das Programm "ksymoops" verwenden, um den Dump zu interpretieren (das Kompilieren mit CONFIG_KALLSYMS wird jedoch normalerweise bevorzugt). 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 oben ist es enorm hilfreich, wenn Sie nachschlagen können, was der EIP-Wert bedeutet. Der Hex-Wert als solcher hilft mir oder anderen nicht sehr viel: Er hängt von Ihrer spezifischen Kernel-Konfiguration ab. Sie sollten den Hex-Wert aus der EIP-Zeile nehmen (ignorieren Sie die "0010:"), und ihn in der Kernel-Namensliste nachschlagen, um zu sehen, welche Kernel-Funktion die fehlerhafte Adresse enthält.
Um den Namen der Kernel-Funktion herauszufinden, müssen Sie die Systembinärdatei finden, die zu dem Kernel gehört, der das Symptom zeigte. Dies ist die Datei 'linux/vmlinux'. Um die Namensliste zu extrahieren und sie mit der EIP aus dem Kernel-Absturz abzugleichen, führen Sie aus:
nm vmlinux | sort | less
Dies gibt Ihnen eine Liste von Kernel-Adressen in aufsteigender Reihenfolge, 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 durchsuchen ('grep'): Die Liste gibt Ihnen jedoch den Startpunkt jeder Kernel-Funktion. Indem Sie nach der Funktion suchen, deren Startadresse niedriger ist als die gesuchte, aber von einer Funktion mit einer höheren Adresse gefolgt wird, finden Sie die gesuchte. Tatsächlich kann es eine gute Idee sein, ein wenig "Kontext" in Ihren Problembericht aufzunehmen, indem Sie ein paar Zeilen um die interessante Stelle 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 erfahren. Bitte lesen Sie das Dokument REPORTING-BUGS für Details.
Alternativ können Sie gdb auf einem laufenden Kernel verwenden. (Nur lesend; d.h. Sie können keine Werte ändern oder Haltepunkte setzen.) Kompilieren Sie dazu zuerst den Kernel mit -g; bearbeiten Sie arch/i386/Makefile entsprechend, und führen Sie dann "make clean" aus. 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 XXXe durch den EIP-Wert.)
Das Ausführen von gdb auf einem nicht laufenden Kernel schlägt derzeit fehl, da gdb (fälschlicherweise) den Startoffset ignoriert, für den der Kernel kompiliert wurde.