[LINUX] Kernel-Selbstschutz (2/2)

Ursprünglich ist es Teil des Quellcodes des Linux-Kernels, daher wird es als GPLv2 behandelt (Anerkennung, dass es sein sollte).

https://www.kernel.org/doc/html/latest/index.html

Licensing documentation

The following describes the license of the Linux kernel source code (GPLv2), how to properly mark the license of individual files in the source tree, as well as links to the full license text.

https://www.kernel.org/doc/html/latest/process/license-rules.html#kernel-licensing

https://www.kernel.org/doc/html/latest/security/self-protection.html

Kernel-Selbstschutz (Fortsetzung)

Probabilistic defenses

While many protections can be considered deterministic (e.g. read-only memory cannot be written to), some protections provide only statistical defense, in that an attack must gather enough information about a running system to overcome the defense.

Viele Schutzmaßnahmen sind entscheidend (zum Beispiel können Sie nicht schreiben, um nur den Speicher zu lesen), aber einige Schutzmaßnahmen sind statistische Schutzmaßnahmen. Dadurch kann der Angreifer genügend Informationen vom laufenden System abrufen, um die Verteidigung aufzugeben.

While not perfect, these do provide meaningful defenses.

Das ist nicht perfekt, aber es ist eine wertvolle Verteidigung.

Canaries, blinding, and other secrets

It should be noted that things like the stack canary discussed earlier are technically statistical defenses, since they rely on a secret value, and such values may become discoverable through an information exposure flaw.

So etwas wie Stapelkanarienvogel, das wir bisher besprochen haben, ist eine statistische Verteidigungstechnik. Es ist mit einem versteckten Wert verbunden und kann durch einen Fehler im Informationsverlust entdeckt werden.

.

Blinding literal values for things like JITs, where the executable contents may be partially under the control of userspace, need a similar secret value.

Versteckte Werte werden auch benötigt, um Literalwerte unsichtbar zu machen, z. B. JIT, wo ausführbarer Inhalt aufgrund der Kontrolle des Benutzerbereichs vorhanden sein kann.

.

It is critical that the secret values used must be separate (e.g. different canary per stack) and high entropy (e.g. is the RNG actually working?) in order to maximize their success.

Es ist wichtig, dass die verborgenen Werte getrennt werden (z. B. verschiedene Kanarienvögel für Stapelsachen) oder eine hohe Entropie aufweisen (das RNG tatsächlich ausführen). Um dieses Ergebnis zu maximieren.

Kernel Address Space Layout Randomization (KASLR)

Since the location of kernel memory is almost always instrumental in mounting a successful attack, making the location non-deterministic raises the difficulty of an exploit.

Der Speicherort des Kernelspeichers ist häufig ein Mittel für einen erfolgreichen Angriff. Indem Sie den Ort unspezifisch machen, können Sie die Schwierigkeit des Angriffs erhöhen.

(Note that this in turn makes the value of information exposures higher, since they may be used to discover desired memory locations.)

(Beachten Sie, dass dies die Wahrscheinlichkeit von Informationsverletzungen erhöht. Informationsverletzungen werden auch verwendet, um die von Ihnen benötigte Speicherstadt zu finden.)

Text and module base

By relocating the physical and virtual base address of the kernel at boot-time (CONFIG_RANDOMIZE_BASE), attacks needing kernel code will be frustrated.

Durch die Neudefinition von physisch und virtuell für den Kernel beim Booten werden Angriffe auf den Kernelcode (CONFIG_RANDOMIZE_BASE) vereitelt. ,

Additionally, offsetting the module loading base address means that even systems that load the same set of modules in the same order every boot will not share a common base address with the rest of the kernel text.

Durch Versetzen der Basisadresse, die das Modul lädt, wird die gemeinsame Basisadresse nicht mit dem Textbereich des Kernels geteilt, auch wenn derselbe Modulsatz beim Booten in derselben Reihenfolge geladen wird.

Stack base

If the base address of the kernel stack is not the same between processes, or even not the same between syscalls, targets on or beyond the stack become more difficult to locate.

Wenn die Basisadresse des Kernel-Stacks nicht zwischen den Prozessen übereinstimmt, ist es noch schwieriger, Ziele auf oder zwischen Stacks zu finden, selbst wenn sie im selben Systemaufrufgebäude ähnlich oder unterschiedlich sind.

Dynamic memory base

Much of the kernel’s dynamic memory (e.g. kmalloc, vmalloc, etc) ends up being relatively deterministic in layout due to the order of early-boot initializations.

Ein Großteil des dynamisch zugewiesenen Speichers im Kernel weist abhängig von der ursprünglich gewünschten Reihenfolge ein relativ deterministisches Layout (kmalloc, vmalloc usw.) auf.

If the base address of these areas is not the same between boots, targeting them is frustrated, requiring an information exposure specific to the region.

Wenn die Basisadressen dieser Bereiche beim Start nicht übereinstimmen, ist es schwierig, sie anzuvisieren, und es werden Informationen für die Bereiche benötigt.

Structure layout

By performing a per-build randomization of the layout of sensitive structures, attacks must either be tuned to known kernel builds or expose enough kernel memory to determine structure layouts before manipulating them.

Indem Sie das Layout der vertraulichen Informationsstruktur von Build zu Build randomisieren, müssen Sie den Angriff für einen bekannten Kernel-Build anpassen oder genügend Kernel-Speicher bereitstellen, um die Struktur zu bestimmen, bevor Sie sie bearbeiten.

Preventing Information Exposures

Since the locations of sensitive structures are the primary target for attacks, it is important to defend against exposure of both kernel memory addresses and kernel memory contents

Es ist wichtig, die Offenlegung sowohl der Kernelspeicheradresse als auch des Kernelspeicherinhalts zu verhindern, da der Speicherort der vertraulichen Informationsstruktur das Hauptziel für Angriffe ist.

(since they may contain kernel addresses or other sensitive things like canary values).

(Kann andere vertrauliche Informationen wie Kerneladresse und Kanarienwert enthalten)

Kernel addresses

Printing kernel addresses to userspace leaks sensitive information about the kernel memory layout.

Durch das Anzeigen der Kerneladresse im Benutzerbereich werden vertrauliche Informationen zum Kernelspeicherlayout verloren.

Care should be exercised when using any printk specifier that prints the raw address, currently %px, %p[ad], (and %p[sSb] in certain circumstances [*]).

Bei der Verwendung von Printk-Deskriptoren, die Rohadressen drucken (derzeit% px,% p [ad],% p [sSb] in bestimmten Situationen [*], ist besondere Vorsicht geboten. Referenz).

Any file written to using one of these specifiers should be readable only by privileged processes.

Mit diesen Deskriptoren geschriebene Dateien sollten nur von privilegierten Prozessen gelesen werden können. .

Kernels 4.14 and older printed the raw address using %p.

In Kerneln mit 4.14 und früheren Versionen wurde% p für die Anzeige von Rohadressen verwendet.

As of 4.15-rc1 addresses printed with the specifier %p are hashed before printing.

In 4.15-rc1 und höher wird der% p-Deskriptor maskiert, bevor die Adresse angezeigt wird.

.

[*] If KALLSYMS is enabled and symbol lookup fails, the raw address is printed.

Wenn KALLSYMS aktiviert ist und die Symbolsuche fehlschlägt, wird eine Rohadresse angezeigt.

If KALLSYMS is not enabled the raw address is printed.

Wenn KALLSMYS nicht aktiviert ist, wird eine Rohadresse angezeigt.

.

Unique identifiers

Kernel memory addresses must never be used as identifiers exposed to userspace.

Verwenden Sie die Kernel-Speicheradresse nicht als Kennung für den Benutzerbereich.

Instead, use an atomic counter, an idr, or similar unique identifier.

Verwenden Sie stattdessen Atomzähler, IDR oder eine ähnliche eindeutige Kennung.

Memory initialization

Memory copied to userspace must always be fully initialized.

Der in den Benutzerbereich kopierte Speicher muss immer vollständig initialisiert sein.

If not explicitly memset(), this will require changes to the compiler to make sure structure holes are cleared.

Wenn memset () nicht explizit ausgeführt wird, muss der Compiler es ändern, um Löcher in der Struktur zu vermeiden.

Memory poisoning

When releasing memory, it is best to poison the contents, to avoid reuse attacks that rely on the old contents of memory.

Es ist am besten, den Inhalt zu verschmutzen, um Angriffe zu verhindern, bei denen alter Inhalt im Speicher wiederverwendet wird, wenn der Speicher freigegeben wird.

E.g., clear stack on a syscall return (CONFIG_GCC_PLUGIN_STACKLEAK), wipe heap memory on a free.

Wenn Sie beispielsweise den Stapel löschen, wenn Sie von syscall zurückkehren (CONFIG_GCC_PLUGIN_STACKLEAK), kann der freigegebene Heapspeicher gelöscht werden.

This frustrates many uninitialized variable attacks, stack content exposures, heap content exposures, and use-after-free attacks.

Dies kann viele nicht initialisierte variable Angriffe, Stapelkontext-Expositionen, Heap-Inhalts-Expositionen und unveröffentlichte Speicherangriffe verhindern.

Destination tracking

To help kill classes of bugs that result in kernel addresses being written to userspace, the destination of writes needs to be tracked.

Um die Klasse zu stoppen, die bewirkt, dass die Kerneladresse in den Benutzerbereich geschrieben wird, müssen Sie verfolgen, wo sie geschrieben wurde.

If the buffer is destined for userspace (e.g. seq_file backed /proc files), it should automatically censor sensitive values.

Sensible Werte werden automatisch zensiert, wenn der Puffer den Benutzerbereich ausgibt (z. B. seq_file mit / proc-Dateien im Hintergrund).

Recommended Posts

Kernel-Selbstschutz (1/2)
Kernel-Selbstschutz (2/2)
k-bedeutet und Kernel k-bedeutet
Kernel-Modus NEON
Kernel SVM (make_circles)