UPD Chapter 17 Security Options, UPD PKGBUILD: installing unstripped VDSO

This commit is contained in:
2025-03-23 18:02:15 +01:00
parent 203427b3e0
commit cbeba8abf3
4 changed files with 265 additions and 6 deletions

View File

@@ -775,3 +775,257 @@ Wenn diese Option aktiviert ist, werden nur CA-Schlüssel zum Maschinenschlüsse
By default no restrictions are in place and all Machine Owner Keys (MOK) are added to the machine keyring.
If enabled only CA keys are added to the machine keyring, all other MOK keys load into the platform keyring.}
\subsubsection{Enables integrity auditing support}
CONFIG\_INTEGRITY\_AUDIT [=y] \textbf{[Y]}\\*
Zusätzlich zum Aktivieren der Unterstützung für Integritätsprüfungen fügt diese Option einen Kernelparameter \texttt{integrity\_audit}
hinzu, der den Grad der Integritätsprüfungsmeldungen steuert.\\*
0 -- einfache Integritätsprüfungsmeldungen (Standard)\\*
1 -- zusätzliche Integritätsprüfungsmeldungen\\\
Zusätzliche Informationsmeldungen zur Integritätsprüfung können durch die Angabe von\\\texttt{integrity\_audit=1}
in der Kernel-Befehlszeile aktiviert werden.
\english{In addition to enabling integrity auditing support, this option adds a kernel parameter `integrity\_audit', which
controls the level of integrity auditing messages.\\*
0 -- basic integrity auditing messages (default)\\*
1 -- additional integrity auditing messages\\
Additional informational integrity auditing messages would be enabled by specifying `integrity\_audit=1' on the kernel command line.}
\subsubsection{Integrity Measurement Architecture(IMA)}
CONFIG\_IMA [=n] \textbf{[N]}\\
Die Laufzeit-Integritätsmessarchitektur (IMA) der Trusted Computing Group (TCG) verwaltet eine Liste von Hash-Werten ausführbarer
Dateien und anderer sensibler Systemdateien, wenn diese gelesen oder ausgeführt werden.
Wenn es einem Angreifer gelingt, den Inhalt einer wichtigen Systemdatei, die gemessen wird, zu ändern, können wir das feststellen.\\
Wenn Ihr System mit einem TPM-Chip ausgestattet ist, verwaltet IMA auch einen aggregierten Integritätswert über diese Liste innerhalb
der TPM-Hardware, so dass das TPM einem Dritten beweisen kann, ob kritische Systemdateien geändert wurden oder nicht.
Lesen Sie \url{https://www.usenix.org/events/sec04/tech/sailer.html}, um mehr über IMA zu erfahren.\\
Wenn Sie unsicher sind, sagen Sie N.
\english{The Trusted Computing Group(TCG) runtime Integrity Measurement Architecture(IMA) maintains a list of hash values of executables
and other sensitive system files, as they are read or executed.
If an attacker manages to change the contents of an important system file being measured, we can tell.
If your system has a TPM chip, then IMA also maintains an aggregate integrity value over this list inside the TPM hardware,
so that the TPM can prove to a third party whether or not critical system files have been modified.
Read \url{https://www.usenix.org/events/sec04/tech/sailer.html} to learn more about IMA.
If unsure, say N.}
\subsubsection{EVM support}
CONFIG\_EVM [=n] \textbf{[N]}\\
EVM schützt die erweiterten Sicherheitsattribute einer Datei vor Integritätsangriffen.\\
Wenn Sie unsicher sind, wie Sie diese Frage beantworten sollen, antworten Sie mit N.
\english{EVM protects a file's security extended attributes against integrity attacks.\\
If you are unsure how to answer this question, answer N.}
%17.26
\subsection{First legacy `major LSM' to be initialized () \texorpdfstring{$\longrightarrow$}{->}}
Diese Auswahl ist nur dazu da, CONFIG\_DEFAULT\_SECURITY in alten Kernelkonfigurationen in CONFIG\_LSM in neuen
Kernelkonfigurationen zu konvertieren.
Ändern Sie diese Auswahl nicht, es sei denn, Sie erstellen eine neue Kernelkonfiguration, denn diese Auswahl wird ignoriert,
nachdem CONFIG\_LSM gesetzt wurde.\\
Wählt das \texttt{major security module} aus, das zuerst initialisiert wird.
Überschrieben durch CONFIG\_LSM, das nicht standardmäßig gesetzt ist.
\english{This choice is there only for converting CONFIG\_DEFAULT\_SECURITY in old kernel configs to CONFIG\_LSM in new kernel configs.
Don't change this choice unless you are creating a fresh kernel config, for this choice will be ignored after CONFIG\_LSM has been set.\\
Selects the legacy ``major security module'' that will be initialized first.
Overridden by non-default CONFIG\_LSM.}
\subsubsection{SELinux}
CONFIG\_DEFAULT\_SECURITY\_SELINUX [=n] \textbf{[N]}\\
Für diese Option ist keine Hilfe verfügbar.
\english{There is no help available for this option.}
\subsubsection{Simplified Mandatory Access Control}
CONFIG\_DEFAULT\_SECURITY\_SMACK [=n] \textbf{[N]}\\
Für diese Option ist keine Hilfe verfügbar.
\english{There is no help available for this option.}
\subsubsection{TOMOYO}
CONFIG\_DEFAULT\_SECURITY\_TOMOYO [=n] \textbf{[N]}\\
Für diese Option ist keine Hilfe verfügbar.
\english{There is no help available for this option.}
\subsubsection{AppArmor}
CONFIG\_DEFAULT\_SECURITY\_APPARMOR [=n] \textbf{[N]}\\
Für diese Option ist keine Hilfe verfügbar.
\english{There is no help available for this option.}
\subsubsection{Unix Discretionary Access Controls}
CONFIG\_DEFAULT\_SECURITY\_DAC [=y] \textbf{[Y]}\\
Für diese Option ist keine Hilfe verfügbar.
\english{There is no help available for this option.}
\subsection{Ordered list of enabled LSMs}
CONFIG\_LSM [=landlock,lockdown,yama,integrity,bpf] \textbf{[landlock,lockdown,yama,integrity,bpf]}\\
Eine durch Kommata getrennte Liste von LSMs in der Reihenfolge der Initialisierung.
Alle LSMs, die in dieser Liste fehlen, mit Ausnahme derjenigen mit der Reihenfolge LSM\_ORDER\_FIRST und LSM\_ORDER\_LAST,
die immer aktiviert werden, wenn sie in der Kernelkonfiguration ausgewählt sind, werden ignoriert.
Dies kann beim Booten mit dem Parameter \texttt{lsm=} kontrolliert werden.\\
Wenn Sie unsicher sind, belassen Sie dies als Voreinstellung.
\english{A comma-separated list of LSMs, in initialization order.
Any LSMs left off this list, except for those with order LSM\_ORDER\_FIRST and LSM\_ORDER\_LAST, which are always enabled
if selected in the kernel configuration, will be ignored.
This can be controlled at boot with the ``lsm='' parameter.\\
If unsure, leave this as the default.}
%17.28
\subsection{Kernel hardening options \texorpdfstring{$\longrightarrow$}{->}}
\subsubsection{Memory initialization \texorpdfstring{$\longrightarrow$}{->}}
\paragraph{Initialize kernel stack variables at function entry () \texorpdfstring{$\longrightarrow$}{->}}\mbox{}\\
Diese Option ermöglicht die Initialisierung von Stack-Variablen zum Zeitpunkt des Funktionseintritts.
Dies hat die Möglichkeit, die größte Abdeckung zu haben (da alle Funktionen ihre Variablen initialisieren lassen können),
aber die Leistungsauswirkungen hängen von der Komplexität der Funktionsaufrufe eines bestimmten Workloads ab.\\
Damit wird der Abdeckungsgrad über Klassen von potenziell nicht initialisierten Variablen ausgewählt.
Die ausgewählte Klasse von Variablen wird vor der Verwendung in einer Funktion initialisiert.
\english{This option enables initialization of stack variables at function entry time.
This has the possibility to have the greatest coverage (since all functions can have their variables initialized),
but the performance impact depends on the function calling complexity of a given workload's syscalls.\\
This chooses the level of coverage over classes of potentially uninitialized variables.
The selected class of variable will be initialized before use in a function.}
\subparagraph{no automatic stack variable initialization (weakest)}\mbox{}\\
CONFIG\_INIT\_STACK\_NONE [=n] \textbf{[N]}\\
Deaktivieren der automatischen Initialisierung von Stack-Variablen.
Dies macht den Kernel anfällig für die Standardklassen der Ausnutzung nicht initialisierter Stack-Variablen
und der Preisgabe von Informationen.
\english{Disable automatic stack variable initialization.
This leaves the kernel vulnerable to the standard classes of uninitialized stack variable exploits and information exposures.}
\subparagraph{pattern-init everything (strongest)}\mbox{}\\
CONFIG\_INIT\_STACK\_ALL\_PATTERN [=n] \textbf{[N]}\\
Initialisiert alles auf dem Stack (einschließlich Padding) mit einem bestimmten Debug-Wert.
Auf diese Weise sollen alle Klassen von nicht initialisierten Stack-Variablen ausgenutzt und Informationen preisgegeben werden,
selbst Variablen, vor denen gewarnt wurde, weil sie nicht initialisiert wurden.
Es ist bekannt, dass die Initialisierung von Mustern viele bestehende Fehler im Zusammenhang mit nicht initialisierten Locals provoziert,
z.\,B. wenn Zeiger Nicht-NULL-Werte erhalten, Puffergrößen und Indizes sehr groß sind.
Das Muster ist situationsabhängig; Clang auf 64-Bit verwendet \texttt{0xAA}-Wiederholungen für alle Typen und Padding außer float und double,
die \texttt{0xFF}-Wiederholungen (-NaN) verwenden.
Clang auf 32-Bit verwendet \text{0xFF}-Wiederholungen für alle Typen und Auffüllungen.
\english{Initializes everything on the stack (including padding) with a specific debug value.
This is intended to eliminate all classes of uninitialized stack variable exploits and information exposures,
even variables that were warned about having been left uninitialized.\\
Pattern initialization is known to provoke many existing bugs related to uninitialized locals, e.g. pointers receive non-NULL values,
buffer sizes and indices are very big.
The pattern is situation-specific; Clang on 64-bit uses 0xAA repeating for all types and padding except float and double which use 0xFF
repeating (-NaN).
Clang on 32-bit uses 0xFF repeating for all types and padding.}
\subparagraph{zero-init everything (strongest and safest)}\mbox{}\\
CONFIG\_INIT\_STACK\_ALL\_ZERO [=y] \textbf{[Y]}\\
Initialisiert alles auf dem Stack (einschließlich Padding) mit einem Nullwert.
Damit sollen alle Arten von Exploits für nicht initialisierte Stack-Variablen und die Preisgabe von Informationen verhindert werden,
selbst bei Variablen, vor denen gewarnt wurde, dass sie nicht initialisiert wurden.
Die Nullinitialisierung bietet sichere Standardwerte für Strings (sofort NUL-terminiert), Zeiger (NULL), Indizes (Index 0)
und Größen (0 Länge) und ist daher als Sicherheitsmaßnahme für die Produktion besser geeignet als die Musterinitialisierung (pattern init).
\english{Initializes everything on the stack (including padding) with a zero value.
This is intended to eliminate all classes of uninitialized stack variable exploits and information exposures,
even variables that were warned about having been left uninitialized.\\
Zero initialization provides safe defaults for strings (immediately NUL-terminated), pointers (NULL), indices (index 0),
and sizes (0 length), so it is therefore more suitable as a production security mitigation than pattern initialization.}
\paragraph{Enable heap memory zeroing on allocation by default}\mbox{}\\
CONFIG\_INIT\_ON\_ALLOC\_DEFAULT\_ON [=y] \textbf{[Y]}\\
Dies hat den Effekt, dass \texttt{init\_on\_alloc=1} auf der Kernel-Kommandozeile gesetzt wird.
Dies kann mit \texttt{init\_on\_alloc=0} deaktiviert werden.
Wenn \texttt{init\_on\_alloc} aktiviert ist, wird der gesamte Speicher des Page Allocators und des Slab Allocators bei
der Allokation auf Null gesetzt, wodurch viele Arten von \glqq uninitialisiertem Heap-Speicher\grqq{} vermieden werden,
insbesondere die Gefährdung des Heap-Inhalts.
Die Auswirkungen auf die Leistung variieren je nach Arbeitslast, aber in den meisten Fällen sind \qty{<1}{\percent} Auswirkungen zu verzeichnen.
Bei einigen synthetischen Workloads wurden sogar bis zu \qty{7}{\percent} gemessen.
\english{This has the effect of setting ``init\_on\_alloc=1'' on the kernel command line.\\
This can be disabled with ``init\_on\_alloc=0''.
When ``init\_on\_alloc'' is enabled, all page allocator and slab allocator memory will be zeroed when allocated, eliminating
many kinds of ``uninitialized heap memory'' flaws, especially heap content exposures.
The performance impact varies by workload, but most cases see $<1\%$ impact.
Some synthetic workloads have measured as high as $7\%$.}
\paragraph{Enable heap memory zeroing on free by default}\mbox{}\\
CONFIG\_INIT\_ON\_FREE\_DEFAULT\_ON [=y] \textbf{[Y]}\\
Dies hat den Effekt, dass \texttt{init\_on\_free=1} auf der Kernel-Kommandozeile gesetzt wird.\\
Dies kann mit \texttt{init\_on\_free=0} deaktiviert werden.
Ähnlich wie bei \texttt{init\_on\_alloc} wird bei der Aktivierung von \texttt{init\_on\_free} der gesamte Speicher des Page Allocators
und des Slab Allocators beim Freigeben auf Null gesetzt, wodurch viele Arten von \glqq uninitialisiertem Heap-Speicher\grqq{} vermieden werden,
insbesondere die Aufdeckung von Heap-Inhalten.
Der Hauptunterschied zu \texttt{init\_on\_free} besteht darin, dass die Lebensdauer der Daten im Speicher verkürzt wird,
da alles, was freigegeben wird, sofort gelöscht wird, so dass Live-Forensik oder Cold-Boot-Speicherangriffe nicht in der Lage sind,
freigegebene Speicherinhalte wiederherzustellen.
Die Auswirkung auf die Leistung variiert je nach Arbeitslast, ist aber teurer als \texttt{init\_on\_alloc} aufgrund
der negativen Cache-Effekte beim Berühren von \glqq kalten\grqq{} Speicherbereichen.
In den meisten Fällen sind die Auswirkungen \qtyrange{3}{5}{\percent}.
Bei einigen synthetischen Workloads wurden bis zu \qty{8}{\percent} gemessen.
\english{This has the effect of setting ``init\_on\_free=1'' on the kernel command line.
This can be disabled with ``init\_on\_free=0''.
Similar to ``init\_on\_alloc'', when ``init\_on\_free'' is enabled, all page allocator and slab allocator memory will be zeroed
when freed, eliminating many kinds of ``uninitialized heap memory'' flaws, especially heap content exposures.
The primary difference with ``init\_on\_free'' is that data lifetime in memory is reduced, as anything freed is wiped immediately,
making live forensics or cold boot memory attacks unable to recover freed memory contents.
The performance impact varies by workload, but is more expensive than ``init\_on\_alloc'' due to the negative cache effects of
touching ``cold'' memory areas. Most cases see 3-5\% impact.
Some synthetic workloads have measured as high as 8\%.}
\paragraph{Enable register zeroing on function exit}\mbox{}\\
CONFIG\_ZERO\_CALL\_USED\_REGS [=n] \textbf{[N]}\\
Am Ende von Funktionen sollten alle vom Aufrufer verwendeten Registerinhalte immer auf Null gesetzt werden.
Dies trägt dazu bei, dass temporäre Werte nicht über die Funktionsgrenze hinaus durchsickern.
Dies bedeutet, dass Registerinhalte weniger wahrscheinlich für Seitenkanäle und Informationsoffenlegung zur Verfügung stehen.
Außerdem wird dadurch die Anzahl der nützlichen ROP-Gadgets im resultierenden Kernel-Image um etwa \qty{20}{\percent}
reduziert (und die vom Compiler erzeugten \texttt{write-what-where}-Gadgets werden entfernt).
Dies hat bei den meisten Workloads einen Leistungseinfluss von weniger als \qty{1}{\%}.
Das Wachstum der Abbildgröße hängt von der Architektur ab und sollte auf seine Eignung geprüft werden.
Zum Beispiel wächst x86\_64 um weniger als \qty{1}{\%}, und arm64 wächst um etwa \qty{5}{\%}.
\english{At the end of functions, always zero any caller-used register contents.
This helps ensure that temporary values are not leaked beyond the function boundary.
This means that register contents are less likely to be available for side channels and information exposures.
Additionally, this helps reduce the number of useful ROP gadgets by about 20\% (and removes compiler
generated ``write-what-where'' gadgets) in the resulting kernel image.
This has a less than 1\% performance impact on most workloads.
Image size growth depends on architecture, and should be evaluated for suitability.
For example, x86\_64 grows by less than 1\%, and arm64 grows by about 5\%.}
\subsubsection{Hardening of kernel data structures \texorpdfstring{$\longrightarrow$}{->}}
\paragraph{Check integrity of linked list manipulation}\mbox{}\\
CONFIG\_LIST\_HARDENED [=y] \textbf{[Y]}\\
Minimale Integritätsprüfung in den Routinen zur Manipulation von verknüpften Listen, um Speicherbeschädigungen abzufangen,
bei denen nicht garantiert ist, dass sie zu einem sofortigen Zugriffsfehler führen.\\
Wenn Sie unsicher sind, sagen Sie N.
\english{Minimal integrity checking in the linked-list manipulation routines to catch memory corruptions that are not
guaranteed to result in an immediate access fault.\\
If unsure, say N.}
\paragraph{Trigger a BUG when data corruption is detected}\mbox{}\\
CONFIG\_BUG\_ON\_DATA\_CORRUPTION [=n] \textbf{[N]}\\
Wählen Sie diese Option, wenn der Kernel einen BUG auslösen soll, wenn er bei der Überprüfung der Gültigkeit von
Kernel-Speicherstrukturen auf beschädigte Daten stößt.\\
Wenn Sie unsicher sind, wählen Sie N.
\english{Select this option if the kernel should BUG when it encounters data corruption in kernel memory structures
when they get checked for validity.\\
If unsure, say N.}
\subsubsection{Randomize layout of sensitive kernel structures \texorpdfstring{$\longrightarrow$}{->}}
Wenn Sie dies aktivieren, werden die Layouts von Strukturen, die ausschließlich Funktionszeiger sind
(und nicht manuell mit \_\_no\_randomize\_layout annotiert wurden), oder Strukturen, die explizit mit \_\_randomize\_layout markiert
wurden, zur Kompilierungszeit randomisiert.
Dies kann eine zusätzliche Schwachstelle für Exploits darstellen, die auf diese Strukturtypen abzielen.\\
Die Aktivierung dieser Funktion führt zu einigen Leistungseinbußen, erhöht die Speichernutzung geringfügig und verhindert die
Verwendung von forensischen Tools wie Volatility gegen das System (es sei denn, der Kernel-Quellbaum wird nach der Kernel-Installation
nicht bereinigt).\\
Der für die Kompilierung verwendete Seed befindet sich in scripts/basic/randomize.seed.
Er verbleibt nach einem \texttt{make clean}, damit externe Module mit dem vorhandenen Seed kompiliert werden können und wird durch
ein \texttt{make mrproper} oder \texttt{make distclean} entfernt.
Diese Datei sollte nicht veröffentlicht werden, da sonst das Strukturlayout ermittelt werden kann.
\english{If you enable this, the layouts of structures that are entirely function pointers (and have not been manually annotated with
\_\_no\_randomize\_layout), or structures that have been explicitly marked with \_\_randomize\_layout, will be randomized at compile-time.
This can introduce the requirement of an additional information exposure vulnerability for exploits targeting these structure types.\\
Enabling this feature will introduce some performance impact, slightly increase memory usage, and prevent the use of forensic tools
like Volatility against the system (unless the kernel source tree isn't cleaned after kernel installation).\\
The seed used for compilation is in scripts/basic/randomize.seed.
It remains after a ``make clean'' to allow for external modules to be compiled with the existing seed and will be removed by a
``make mrproper'' or ``make distclean''.
This file should not be made public, or the structure layout can be determined.}
\paragraph{Disable structure layout randomization}\mbox{}\\
CONFIG\_RANDSTRUCT\_NONE [=y] \textbf{[Y]}\\
Normaler Aufbau: keine Randomisierung des Strukturlayouts.
\english{Build normally: no structure layout randomization.}