web-dev-qa-db-fra.com

Comment masquer les symboles du noyau dans l'image du noyau Linux? Recompliation?

Pourquoi masquer les symboles du noyau?

Citation

Toute personne ayant une connaissance de base de l'exploitation du noyau sait à quel point la collecte d'informations est importante pour une exploitation fiable. Cette protection masque les symboles du noyau à divers endroits qu'un attaquant pourrait utiliser lors de la collecte d'informations en phase de pré-exploitation. ... Cette option empêche également la fuite d'adresses du noyau via plusieurs entrées/proc.

classes de bogues/fuite de pointeur du noya

Certains endroits sont évidents. /proc/kallsyms peut être contraint via sysctl kernel.kptr_restrict=2. Accès au dossier /boot peut être restreint par les autorisations de fichiers linux à root uniquement et avec apparmor même être caché à root. AppArmor FullSystemPolicy ( apparmor-profile-everything ) Aussi d'autres endroits tels que /lib/modules, system.map, et le répertoire source du noyau.

Afin de poser une question très spécifique, veuillez ignorer les autres endroits où les symboles du noyau peuvent fuir. Si vous souhaitez les énumérer, posez votre propre question, attendez que je pose la question ou ajoutez un commentaire.

Ma question très spécifique est autour de ce qui suit Quote :

Le noyau n'est [...] pas précompilé par une distribution

C'est parce que les symboles du noyau peuvent être extraits de l'image du noya . Il existe des outils Open Source pour cela.

(Cette citation parle de grsecurity mais je pose des questions sur la non-grsecurity, c'est-à-dire le noyau régulier de kernel.org ici.)

Les images du noyau provenant de référentiels publics tels que packages.debian.org sont bien connues des attaquants. Les attaquants pouvaient simplement coder en dur les adresses des symboles et ainsi contrer les efforts tels que kernel.kptr_restrict=2.

Pour éviter les fuites du pointeur du noyau, l'image du noyau ne peut pas être dans un état public connu. Il doit être unique, privé pour autant que je sache. Il faut compiler soi-même le noyau.

Builds reproductibles sont un effort incroyable pour augmenter la sécurité de tout le monde. Cependant, dans ce cas, les versions reproductibles aboutiraient à nouveau à un noyau avec des adresses de symboles bien prévisibles par les attaquants car le noyau Linux Debian est déjà reproductible, principalement reproductible ou à l'avenir entièrement reproductible (je n'ai pas suivi le développement cette).

Comment cacher les symboles du noyau de l'image du noyau Linux (vmlinux) à un attaquant? Comment m'assurer que mon noyau possède des symboles de noyau uniques? Existe-t-il un paramètre de démarrage du noyau pour cela? Ou est-il possible de fournir en quelque sorte au noyau un fichier aléatoire afin qu'il puisse randomiser ses symboles? Ou existe-t-il un moyen de recompiler le noyau d'une manière qui aurait des adresses de symboles uniques?

5
adrelanos

La disposition d'un noyau précompilé de distribution est publique. KASLR tente de changer l'offset de base du noyau, en changeant toutes les adresses par un offset secret. Malheureusement, la fuite d'un seul symbole permettra de calculer le reste. Étant donné que KASLR n'est pas aussi sûr qu'il est supposé l'être, c'est un problème. Le danger de contournement KASLR par infofuites ne peut être que légèrement réduit en définissant le sysctl kernel.dmesg_restrict=1 Pour atténuer fuites de printk() . Même quand même, KASLR est une fonctionnalité de sécurité si médiocre que vous ne pouvez pas l'utiliser pour cacher de manière fiable ces informations aux attaquants locaux.

La compilation manuelle d'un noyau garantira que vous utiliserez des décalages de symboles uniques. Il est nécessaire de définir le sysctl kernel.kptr_restrict=2 Et de restreindre l'accès à l'image du noyau elle-même ainsi qu'aux fichiers associés comme la carte et les modules chargeables. Vous pouvez rendre les attaques basées sur la connaissance de la structure du noyau un peu plus difficiles si vous utilisez le plugin RANDSTRUCT de grsecurity, maintenant en amont.

1
forest