\section{General architecture-dependent options \texorpdfstring{$\rightarrow$}{->}} (Allgemeine architekturabhängige Optionen) \subsection{Kprobes} CONFIG\_KPROBES [=y] \textbf{[Y]}\\ Mit Kprobes können Sie an fast jeder Kerneladresse trappen und eine Callback-Funktion ausführen. register\_kprobe() legt einen Probepoint fest und spezifiziert den Callback. Kprobes ist nützlich für Kernel-Debugging, nicht-intrusive Instrumentierung und Tests.\\ Im Zweifelsfall sagen Sie "N". \subsection{Optimize very unlikely/likely branches} CONFIG\_JUMP\_LABEL [=y] \textbf{[Y]}\\ Diese Option ermöglicht eine transparente Verzweigungsoptimierung, die die Ausführung bestimmter fast-immer-wahrer oder fast-immer-falscher Verzweigungsbedingungen im Kernel noch billiger macht. Bestimmte leistungsempfindliche Kernel-Codes wie Trace-Points, Scheduler-Funktionen, Netzwerk-Code und KVM haben solche Verzweigungen und bieten Unterstützung für diese Optimierungstechnik. Wenn festgestellt wird, dass der Compiler \glqq asm goto\grqq{} unterstützt, kompiliert der Kernel solche Verzweigungen mit einer einfachen nop-Anweisung. Wenn das Bedingungsflag auf true gesetzt wird, wird der nop-Befehl in einen Sprungbefehl umgewandelt, um den bedingten Befehlsblock auszuführen. Diese Technik senkt den Overhead und die Belastung der Verzweigungsvorhersage des Prozessors und macht den Kernel im Allgemeinen schneller. Die Aktualisierung der Bedingung ist zwar langsamer, aber das kommt immer sehr selten vor. (Bei 32-Bit-x86 können die erforderlichen Optionen, die zu den Compiler-Flags hinzugefügt werden, die Größe des Kernels leicht erhöhen). \subsubsection{Static key selftest} CONFIG\_STATIC\_KEYS\_SELFTEST [=n] \textbf{[N]}\\ Bootzeit-Selbsttest des Branch-Patching-Codes. \subsection{Static call selftest} CONFIG\_STATIC\_CALL\_SELFTEST [=n] \textbf{[N]}\\ Bootzeit-Selbsttest des Call-Patching-Codes. \subsection{Enable seccomp to safely execute untrusted bytecode} CONFIG\_SECCOMP [=n] \textbf{[N]}\\ Diese Kernel-Funktion ist nützlich für numerische Anwendungen, die während ihrer Ausführung mit nicht vertrauenswürdigem Bytecode umgehen müssen. Durch die Verwendung von Pipes oder anderen Transporten, die dem Prozess als Dateideskriptoren zur Verfügung gestellt werden und die Lese-/Schreib-Syscalls unterstützen, ist es möglich, diese Anwendungen mit seccomp in ihrem eigenen Adressraum zu isolieren. Sobald seccomp über prctl(PR\_SET\_SECCOMP) oder den seccomp()-Syscall aktiviert ist, kann es nicht mehr deaktiviert werden, und die Task darf nur einige wenige sichere Syscalls ausführen, die für jeden seccomp-Modus definiert sind. Wenn Sie unsicher sind, sagen Sie Y. \subsubsection{Show seccomp filter cache status in /proc/pid/seccomp\_cache} CONFIG\_SECCOMP\_CACHE\_DEBUG [=n] \textbf{[N]}\\ Dies ermöglicht der Schnittstelle /proc/pid/seccomp\_cache die Überwachung der seccomp-Cache-Daten. Das Dateiformat kann sich ändern. Zum Lesen der Datei ist CAP\_SYS\_ADMIN erforderlich. Diese Option ist nur zur Fehlersuche gedacht. Die Aktivierung birgt das Risiko, dass ein Angreifer die seccomp-Filterlogik ableiten kann.\\ Wenn Sie unsicher sind, sagen Sie N. \subsection{Stack Protector buffer overflow detection} CONFIG\_STACKPROTECTOR [=y] \textbf{[Y]}\\ Diese Option schaltet die GCC-Funktion \glqq stack-protector\grqq{} ein. Diese Funktion legt am Anfang von Funktionen einen Canary-Wert (Kanarienvogelwert) auf den Stack kurz vor der Rücksprungadresse und überprüft den Wert kurz vor der eigentlichen Rückkehr. Stack-basierte Pufferüberläufe (die diese Rücksprungadresse überschreiben müssen) überschreiben nun auch den Canary-Wert, was erkannt wird und der Angriff wird dann durch eine Kernel-Panik neutralisiert. Bei Funktionen, die ein 8-Byte- oder größeres Zeichenarray auf dem Stack haben, wird die Logik des Stack-Protector-Canarys hinzugefügt. Diese Funktion erfordert gcc Version 4.2 oder höher, oder eine gcc-Distribution, die die Funktion zurückportiert hat (\texttt{-fstack-protector}). Auf einem x86-\glqq defconfig\grqq{}-Build fügt diese Funktion Canary-Prüfungen zu etwa 3\% aller Kernel-Funktionen hinzu, was die Kernel-Codegröße um etwa 0,3\% erhöht. \subsubsection{Strong Stack Protector} CONFIG\_STACKPROTECTOR\_STRONG [=y] \textbf{[Y]}\\ Bei Funktionen wird die Stack-Protector-Canary-Logik unter einer der folgenden Bedingungen hinzugefügt: \begin{itemize} \item[-] die Adresse einer lokalen Variablen wird als Teil der rechten Seite einer Zuweisung oder eines Funktionsarguments verwendet \item[-] die lokale Variable ist ein Array (oder eine Union, die ein Array enthält), unabhängig von Typ oder Länge des Arrays \item[-] Lokale Variablen werden als Register verwendet \end{itemize} Diese Funktion erfordert gcc Version 4.9 oder höher, oder eine gcc-Distribution, die die Funktion zurück\-por\-tiert hat (\texttt{-fstack-protector-strong}). Auf einem x86-\glqq defconfig\grqq{}-Build fügt diese Funktion Canary-Prüfungen zu etwa 20\% aller Kernel-Funktionen hinzu, was die Größe des Kernel-Codes um etwa 2\% erhöht. \subsection{Link Time Optimization (LTO) () \texorpdfstring{$\rightarrow$}{->}} \subsubsection{None} CONFIG\_LTO\_NONE [=y] \textbf{[Y]}\\ Erstellen Sie den Kernel normal, ohne Link Time Optimization (LTO). \subsection{Provide system calls for 32-bit time\_t} CONFIG\_COMPAT\_32BIT\_TIME [=y] \textbf{[Y]}\\ Dies ermöglicht die Unterstützung von 32 Bit time\_t zusätzlich zur Unterstützung von 64~Bit time\_t. Dies ist auf allen 32-Bit-Architekturen und 64-Bit-Architekturen als Teil der Kompatibilitäts-Syscall-Behandlung relevant. \subsection{Use a virtually-mapped stack} CONFIG\_VMAP\_STACK [=y] \textbf{[Y]}\\ Aktivieren Sie dies, wenn Sie virtuell gemappte Kernel-Stacks mit Guard Pages verwenden wollen. Dies führt dazu, dass Kernel-Stack-Überläufe sofort abgefangen werden und keine schwer zu diagnostizierende Korruption verursachen. Um dies mit Software-KASAN-Modi zu verwenden, muss die Architektur die Unterstützung von virtuellen Mappings mit echtem Schattenspeicher unterstützen und KASAN\_VMALLOC muss aktiviert sein. \subsection{Support for randomizing kernel stack offset on syscall entry} CONFIG\_RANDOMIZE\_KSTACK\_OFFSET [=y] \textbf{[Y]}\\ Der Kernel-Stack-Offset kann (nach pt\_regs) mit etwa 5~Bits Entropie randomisiert werden, wodurch Angriffe auf Speicherbeschädigung vereitelt werden, die auf Stack-Adress-Determinismus oder auf die Offenlegung der Adressen von Cross-Syscalls angewiesen sind. Die Funktion wird über den Kernel-Boot-Parameter \texttt{randomize\_kstack\_offset=on/off} gesteuert und hat, wenn sie ausgeschaltet ist, aufgrund der Verwendung von statischen Verzweigungen (siehe JUMP\_LABEL) keinen Overhead.\\ Wenn Sie unsicher sind, sagen Sie Y. \subsubsection{Default state of kernel stack offset randomization} CONFIG\_RANDOMIZE\_KSTACK\_OFFSET\_DEFAULT [=y] \textbf{[Y]}\\ Die Randomisierung des Kernel-Stack-Offsets wird durch den Kernel-Boot-Parameter\\ \texttt{randomize\_kstack\_offset=on/off} gesteuert, und diese Konfiguration wählt den Standard-Boot-Status. \subsection{Locking event counts collection} CONFIG\_LOCK\_EVENT\_COUNTS [=y] \textbf{[Y]}\\ Ermöglicht eine leichtgewichtige Zählung verschiedener sperrungsbezogener Ereignisse im System mit minimalen Auswirkungen auf die Leistung. Dies verringert die Wahrscheinlichkeit, dass sich das Anwendungsverhalten aufgrund von Zeitunterschieden ändert. Die Zählungen werden über debugfs gemeldet. \subsection{GCOV-based kernel profiling \texorpdfstring{$\rightarrow$}{->}} (GCOV-basierte Kernel-Profilierung) \subsubsection{Enable gcov-based kernel profiling} CONFIG\_GCOV\_KERNEL [=n] \textbf{[N]}\\ Diese Option aktiviert die gcov-basierte Code-Profilierung (z.~B. für Code-Abdeckungsmessungen). Wenn Sie unsicher sind, sagen Sie N.\\[.5em] Geben Sie zusätzlich CONFIG\_GCOV\_PROFILE\_ALL=y an, um Profilerstellungsdaten für den gesamten Kernel zu erhalten. Um die Profilerstellung für bestimmte Dateien oder Verzeichnisse zu aktivieren, fügen Sie eine Zeile ähnlich der folgenden in das jeweilige Makefile ein:\\[.5em] Für eine einzelne Datei (z.~B. main.o):\\ \indent \texttt{GCOV\_PROFILE\_main.o := y}\\[.5em] Für alle Dateien in einem Verzeichnis:\\ \indent \texttt{GCOV\_PROFILE := y}\\[.5em] Um Dateien von der Profilerstellung auszuschließen, auch wenn CONFIG\_GCOV\_PROFILE\_ALL angegeben ist, verwenden Sie:\\ \indent \texttt{GCOV\_PROFILE\_main.o := n}\\[.5em] und:\\ \indent \texttt{GCOV\_PROFILE := n}\\[.5em] Beachten Sie, dass das debugfs-Dateisystem gemountet sein muss, um auf die Profilerstellungsdaten zugreifen zu können. \subsection{GCC plugins \texorpdfstring{$\rightarrow$}{->}} CONFIG\_GCC\_PLUGINS [=y] \textbf{[Y]}\\ GCC-Plugins sind ladbare Module, die zusätzliche Funktionen für den Compiler bereitstellen. Sie sind nützlich für die Laufzeitinstrumentierung und die statische Analyse.\\ Siehe Documentation/kbuild/gcc-plugins.rst für Details. \subsubsection{Generate some entropy during boot and runtime} CONFIG\_GCC\_PLUGIN\_LATENT\_ENTROPY [=n] \textbf{[N]}\\ Mit der Eingabe von Y wird der Kernel einen Teil des Kernel-Codes instrumentieren, um sowohl aus dem ursprünglichen als auch aus dem künstlich erzeugten Programmzustand etwas Entropie zu gewinnen. Dies ist insbesondere bei eingebetteten Systemen hilfreich, bei denen es normalerweise wenig \glqq natürliche\grqq{} Entropiequellen gibt. Der Preis ist eine gewisse Verlangsamung des Boot-Prozesses (etwa 0,5~\%) und der fork- und irq-Verarbeitung. Beachten Sie, dass die auf diese Weise extrahierte Entropie nicht kryptografisch sicher ist!\\ Dieses Plugin wurde von grsecurity/PaX portiert. Mehr Informationen unter: \begin{itemize} \item[] \url{https://grsecurity.net/} \item[] \url{https://pax.grsecurity.net/} \end{itemize}