[LINUX] Auto-protection du noyau (2/2)

À l'origine, il fait partie du code source du noyau Linux, il sera donc traité comme GPLv2 (reconnaissance qu'il devrait l'être).

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

Autoprotection du noyau (suite)

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.

De nombreuses protections sont décisives (par exemple, vous ne pouvez pas écrire en mémoire morte), mais certaines protections sont des protections statistiques. Cela permet à l'attaquant d'obtenir suffisamment d'informations du système en cours d'exécution pour abandonner la défense.

While not perfect, these do provide meaningful defenses.

Ce n'est pas parfait, mais c'est une défense précieuse.

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.

Quelque chose comme le canari de pile dont nous avons discuté jusqu'à présent est une technique de défense statistique. Il est associé à des valeurs cachées et peut être découvert par des failles dans les fuites d'informations.

.

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

Les valeurs masquées sont également nécessaires pour rendre les valeurs littérales invisibles, comme dans JIT, où un contenu exécutable peut exister en raison du contrôle de l'espace utilisateur.

.

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.

Il est important que les valeurs cachées soient séparées (par exemple, différents canaris pour les éléments de pile) ou aient une entropie élevée (exécutez en fait le RNG). Pour maximiser ce résultat.

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.

L'emplacement de la mémoire du noyau est souvent un moyen de réussir une attaque. En rendant l'emplacement non spécifique, vous pouvez augmenter la difficulté de l'attaque.

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

(Notez que cela augmente la probabilité de violations d'informations. Les violations d'informations sont également utilisées pour trouver la ville mémoire dont vous avez besoin).

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.

Redéfinir le physique et le virtuel pour le noyau au moment du démarrage frustrera les attaques sur le code du noyau (CONFIG_RANDOMIZE_BASE). ,

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.

De plus, en décalant l'adresse de base qui charge le module, même si le même jeu de modules est chargé dans le même ordre au démarrage, il ne partagera pas l'adresse de base commune avec la zone de texte du noyau.

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.

Si l'adresse de base de la pile du noyau ne correspond pas entre les processus, il sera encore plus difficile de trouver des cibles sur ou entre les piles, même si elles sont similaires ou différentes dans le même bâtiment d'appels système.

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.

Une grande partie de la mémoire allouée dynamiquement dans le noyau a une disposition relativement déterministe (kmalloc, vmalloc, etc.) en fonction de l'ordre initial souhaité.

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.

Si les adresses de base de ces zones ne correspondent pas au démarrage, il sera difficile de les cibler et des informations seront nécessaires pour les zones.

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.

En randomisant la disposition de la structure d'informations sensibles d'une construction à l'autre, vous devez ajuster l'attaque pour une construction de noyau connue ou exposer suffisamment de mémoire du noyau pour déterminer la structure avant de la manipuler.

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

Il est important d'éviter l'exposition à la fois de l'adresse mémoire du noyau et du contenu de la mémoire du noyau, car l'emplacement de la structure d'informations sensibles est la principale cible des attaques.

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

(Peut contenir d'autres informations sensibles telles que l'adresse du noyau et la valeur canary)

Kernel addresses

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

L'affichage de l'adresse du noyau dans l'espace utilisateur perd des informations sensibles sur la disposition de la mémoire du noyau.

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

Il faut faire très attention lors de l'utilisation de descripteurs printk qui affichent des adresses brutes (actuellement% px,% p [ad],% p [sSb] dans certaines situations [*]. référence).

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

Les fichiers écrits à l'aide de ces descripteurs ne doivent être lisibles que par des processus privilégiés. .

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

Dans les noyaux 4.14 et antérieurs,% p était utilisé pour l'affichage des adresses brutes.

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

Dans la version 4.15-rc1 et versions ultérieures, le descripteur% p est haché par masque avant que l'adresse ne soit affichée.

.

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

Si KALLSYMS est activé et que la recherche de symboles échoue, une adresse brute sera affichée.

If KALLSYMS is not enabled the raw address is printed.

Si KALLSMYS n'est pas activé, une adresse brute sera affichée.

.

Unique identifiers

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

N'utilisez pas l'adresse mémoire du noyau comme identifiant exposé à l'espace utilisateur.

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

À la place, utilisez un compteur atomique, un idr ou un identifiant unique similaire.

Memory initialization

Memory copied to userspace must always be fully initialized.

La mémoire copiée dans l'espace utilisateur doit toujours être entièrement initialisée.

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

Si memset () n'est pas fait explicitement, le compilateur doit le changer pour éviter les trous dans la structure.

Memory poisoning

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

Il est préférable de polluer le contenu pour éviter les attaques qui réutilisent l'ancien contenu en mémoire lorsque la mémoire est libérée.

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

Par exemple, l'effacement de la pile lors du retour de l'appel système (CONFIG_GCC_PLUGIN_STACKLEAK) peut effacer la mémoire de tas libérée.

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

Cela peut empêcher de nombreuses attaques de variables non initialisées, des expositions de contexte de pile, des expositions de contenu de tas et des attaques de mémoire inédites.

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.

Pour arrêter la classe qui provoque l'écriture de l'adresse du noyau dans l'espace utilisateur, vous devez suivre où elle a été écrite.

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

Les valeurs sensibles sont automatiquement censurées si le tampon génère l'espace utilisateur (par exemple, seq_file avec les fichiers / proc en arrière-plan).

Recommended Posts

Auto-protection du noyau (1/2)
Auto-protection du noyau (2/2)
k-means et kernel k-means
Mode noyau NEON
SVM du noyau (make_circles)