165 lines
9.7 KiB
TeX
165 lines
9.7 KiB
TeX
\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}
|