# Grsecurity

grsecurity est une modification augmentant la sécurité pour le noyau Linux distribué sous la licence publique générale GNU version 2. Il inclut différents éléments, dont PaX, un système de contrôle d'accès à base de rôles et différents moyens de renforcer la sécurité générale du noyau.

## Histoire

Le projet grsecurity a vu le jour en février 2000, sous le nom de "GRKERNSEC", sous forme de mises a jour des modifications de sécurité du projet Openwall pour des noyaux Linux plus récents. En 2001, grsecurity se met à inclure PaX, puis se dote d'un système d'ACL nommé "Oblivion", écrit par Michael Dalton, qui fut amélioré pour se doter d'un mode d'auto-apprentissage, puis se transformera en Contrôle d'accès à base de rôles en 2003.
À la suite de la perte de son principal sponsor, Brad Spengler annonce, le 27 décembre 2008, que le développement du projet pourrait être arrêté$^,$. Toutefois, il semble que le développement continue à un rythme aussi soutenu qu'auparavant après une phase où les contributions se faisaient plus rares entre janvier et mars 2009.
Depuis aout 2015, à la suite de violations répétées de la license de grsecurity (GPLv2) ainsi que de sa marque déposée d'acteurs majeurs de l'industrie du Linux embarqué, la disponibilité des modifications en stables est devenue limitée aux clients commerciaux de la société. L'élément déclencheur fut l'utilisation de la marque "grsecurity" par WindRiver sur certains leurs produits en fin de vie, tirant profit de la notoriété du nom en matière de sécurité, sans contribuer en retour et en y intégrant des modifications à la qualité douteuse$^,$$^,$$^,$. Les versions de tests des correctifs de grsecurity et les correctifs sur des fonctionnalités des espaces utilisateurs, restent accessibles au public$^,$.
Depuis le 26 avril 2017, tous les correctifs sont distribués uniquement aux clients de la société. La licence du patch, GPLv2, reste inchangée.

## Fonctionnalités

Grsecurity inclut PaX, une modification du noyau Linux renforçant significativement sa sécurité. PaX n'est plus disponible hors de grsecurity depuis 2017.
grsecurity offre différents moyens d'améliorer l'audit du noyau Linux. Il est ainsi possible d'auditer certains utilisateurs ou groupes, les opérations de montage (GRKERNSEC_AUDIT_MOUNT), l'exécution de binaires (GRKERNSEC_EXECLOG), la création de chroots (GRKERNSEC_CHROOT_EXECLOG), l'usage de ptrace (GRKERNSEC_AUDIT_PTRACE), …
L'option GRKERNSEC_CHROOT permet de durcir significativement la securité des chroots, qui n'ont pas été conçus comme un mécanisme de sécurité. Il existe aujourd'hui des solutions de sandboxing bien plus sûres, comme AppArmor par exemple.
L'option GRKERNSEC_TPE permet de définir un gid ne pouvant pas exécuter de binaires hors de dossiers en lecture seule pour les utilisateurs non-privilégiés, et appartenant à l'utilisateur root.
En 2002, GRKERNSEC_KMEM est implémenté, restreignant l'acces a /dev/kmem, /dev/mem, /dev/port, ... réduisant significativement la surface d'attaque du noyau. Cette fonctionnalité fut implémentée dans le noyau linux en 2019 par Matthew Garrett dans le cadre de l'option CONFIG_SECURITY_LOCKDOWN_LSM.
En 2004, GRKERNSEC_HIDESYM est implémenté, restreignant les informations disponibles aux utilisateurs non-privilégiés au sujet du noyau: symboles, modules chargés, adresses mémoires... Cette fonctionnalité fut partiellement implémentée en 2010 dans le noyau linux via l'option kptr_restrict.
En 2009, PAX_USERCOPY est intégré, ajoutant des vérifications lors de la copie (y compris partielle) d'objets présents sur le tas entre l'espace noyau et l'espace utilisateur: leurs tailles est vérifiée, et certains objets (contenant par exemple les informations utilisateur ou les droits de fichiers) ne peuvent tout simplement plus être copiés depuis/vers l'espace noyau. Cette fonctionnalité a pour effet de réduire les primitives de lecture du la mémoire du noyau par des utilisateurs, mais également d'écrasement de mémoire lors de copies vers l'espace noyau.
La même année, GRKERNSEC_MODHARDEN est également implémenté, interdisant le chargement de modules noyau aux utilisateurs non-privilégiés, ne leur permettant donc pas d'agrandir arbitrairement la surface d'attaque du noyau. Cette option fut proposé à l'adoption dans le noyau linux par Dan Rosenberg en novembre 2010, à la suite de la publication de l'élévation de privilèges nommée can-i-haz-modharden.c exploitant CVE-2010-2959 par Jon Oberheide, mais ne fut pas intégrée$^,$$^,$.
En 2010, GRKERNSEC_DMESG, restreignant l'accès au journal du noyau au utilisateurs privilégiés, fut proposé à l'adoption dans le noyau linux par Dan Rosenberg, sous forme d'une option nommée CONFIG_SECURITY_DMESG_RESTRICT.
En 2011, GRKERNSEC_BRUTE est ajouté, détectant et invalidant les tentatives d'attaques par recherche exhaustive. Cette option a pour effet de réduire l'efficacité d'exploits ayant une composante probabiliste, et de renforcer celle de l'ASLR: quand un processus fils d'un daemon est interrompu de maniere suspecte, le processus père ne pourra recréer de fils pendant une certaine durée$^,$. Cette fonctionnalité fut qualifiée dans Phrack de hautement efficace contre l'exploitation de certains types de bogues.
Une variante de GRKERNSEC_BRUTE est implémentée quelques mois plus tard: GRKERNSEC_KERN_LOCKOUT. Quand PaX détecte une activité suspecte, en plus d'immédiatement terminer le processus fautif, si ce dernier tourne en tant que root, le système est immédiatement arrêté. Si l'utilisateur n'est pas root, tous ses processus sont terminés, et la création de nouveaux processus lui sont interdits.
En avril 2011, Dan Rosenberg et Jon Oberheide publient "Stackjacking: your way grsec/pax to bypass" aux conférence Hackito Ergo Sum et Infiltrate, détaillant 4 techniques pour effectuer une élévation de privilèges sous grsecurity, en ne présupposant qu'une seule primitive d'écriture arbitraire:
* kstack self-discovery, consistant à tirer partie de la réutilisation de la pile entre chaque appel système pour fuiter du contenu présent en mémoire, permettant de retrouver l'adresse mémoire de la base de la pile.
* Rosengrope, abusant le membre addr_limit de la structure thread_info via la primitive d'écriture arbitraire afin de rendre floue la séparation entre l'espace mémoire utilisateur et l'espace noyau.
* Obergrope, une alternative a Rosengrope, utilisant la primitive d'écriture pour manipuler la pile d'un processus fils afin de générer une primitive de lecture pour obtenir d'adresse de la structure task_struct.
* Stackjacking, écrasant la structure task_struct présente sur la pile pour élever les privilèges du processus courant.
En réponse, plusieurs contre-mesures furent implémentées:
* thread_info fut déplacée dans sa propre zone mémoire isolée, en dehors de la pile.
* PAX_RANDKSTACK, effaçant les données présentes sur la pile de l'espace noyau entre chaque appel système.
* PAX_USERCOPY fut améliorié, afin de ne permettre qu'à une liste restreinte de structures de l'espace d'être exposées à l'espace utilisateur.
En 2012, GRKERNSEC_BPF_HARDEN est implémenté, masquant les constantes présentes dans le code eBPF, en réponse à un article détaillant comment contourner SMEP via ce dernier. Le noyau Linux utilise une protection différente, préférant décaler le début code eBPF de manière aléatoire, offrant une protection moins coûteuse en performances, mais également plus faibles, cette dernière étant facilement contournable par un attaquant possédant une primitive de lecture arbitraire$^,$. En 2016, l'approche choisit par grsecurity fut finalement adoptée par le noyaux Linux.
En fevrier 2012, afin de renforcer l'efficacité de l'ASLR fourni par PaX, GRKERNSEC_PROC_MEMMAP est ajoutée, interdisant l'accès aux fichiers présents dans le dossier /proc/pid contenant des informations sur la mémoire des processus, si l'accès est initié par un processus avec un pid différent$^,$.
En 2013, à la suite d'un article publié par Exodus Intelligence sur une exécution de code arbitraire sur le logiciel Asterisk, GRKERNSEC_RAND_THREADSTACK fut implémentée, ajoutant un décalage aléatoire de 8 bits a la pile des threads en espace utilisateur$^,$.
En juin 2013, GRKERNSEC_PERF_HARDEN est ajoutée, afin de réduire drastiquement la surface d'attaque du noyau, en interdisant l'usage de l'infrastructure d'observation des performances aux utilisateurs non-privilégiés.
En janvier 2014, GRKERNSEC_RANDSTRUCT est implémenté, changeant de manière aléatoire la représentation en mémoire de structures contenant exclusivement des pointeurs sur fonctions, ainsi que celle explicitement annotées comme sujettes à ce traitement. Cette fonctionnalité fut partiellement intégrée au noyau Linux en juin 2017 par Kees Cook$^,$.
En mars 2014, GRKERNSEC_JIT_HARDEN est ajoutée, améliorant la protection fournie par GRKERNSEC_BPF_HARDEN en utilisant une constante différente par instruction BPF contenant une value immédiate pour son masquage, empêchant un attaquant possédant une primitive de lecture arbitraire de lancer une attaque par recherche exhaustive de générer des instructions arbitraires.
Le 5 avril 2014, un hacker nommé "comex/PinkiePie" publia une vidéo démontrant une élévation de privilèges sous grsecurity. Grâce aux indices présents dans la vidéo quant-aux vecteurs utilisés (un dépassement de la pile d'un processus noyau, couplé à une attaque sur BPF fournissant une primitive de lecture/écriture arbitraire), l'attaque résultat en l'implémentation de deux nouvelles mesures de sécurité:
* GRKERNSEC_KSTACKOVERFLOW, ajoutant une page mémoire non-mappée sous le tas des piles des processus du noyau, rendant leurs possibles débordements inexploitables. Une approche similaire, nommée VMAP_STACK, fut adoptée dans le noyau Linux en 2017$^,$$^,$.
* L'interdiction de l'interpréteur BPF d'accéder à la mémoire en dehors de son tampon alloué, ainsi qu'une approche moins laxiste en cas de contenu invalide.
En octobre 2018, RESPECTRE est publié, détectant et neutralisant automatiquement via un plugin pour GCC les gadgets d'exploitation de la vulnérabilité Spectre et ses dérivés$^,$.
En 2021, AUTOSLAB est implémenté via un plugin gcc, isolant automatiquement les objets alloués sur le tas en espace noyau par types. Cette approche est similaire à celle utilisé par Apple en 2022 via kmalloc_type, ou encore PartitionaAlloc dans Chrome, qui sont elles manuelles. Cette isolation complexifie significativement l'exploitation de use-after-free et de confusion de types.
Divers bogues de sécurité sont également corrigés longtemps à l'avance, comme par exemple :
* L'utilisation de move_pages pour contourner l'ASLR d'executables suid, corrigé en 2009 dans grsecurity, mais seulement en 2017 dans le noyau Linux$^,$.
* L'abus de wchan pour lire la mémoire du noyau, corrigé en 2004 dans grsecurity, mais seulement en 2015 dans le noyau Linux$^,$.

### Contrôle d'accès à base de rôles

Il s'agit d'un système de contrôle d'accès obligatoire (de l'anglais, mandatory access control). Il est utilisé par exemple dans le cas où il est utile de restreindre l'accès à certaines ressources au seul utilisateur root (qui a normalement accès à toutes les ressources).
La politique de sécurisation de grsecurity se démarque des autres modèles de sécurité en cela qu'elle ne prétend pas trouver et retirer les failles existantes, mais les rendre inutiles. Ainsi, chaque processus d'un système peut être limité à ne pouvoir effectuer que les tâches pour lesquelles l'administrateur l'y autorise, espérant ainsi éviter qu'un attaquant puisse compromettre le système tout entier. Ce correctif de sécurité suppose donc que le noyau Linux est exempt de bug exploitable.

## Utilisateurs historiques notables

À la suite de l'indisponibilité publique de grsecurity, les utilisateurs cités ci-dessous n'en font plus usage, sans mention explicite.
* Skype

### Hebergeurs

* AtomiCorp
* Blinkenshell
* DreamHost
* Gandi
* OVH

### Distributions Linux

* Adamantix
* Alpine Linux
* Arch Linux, via le paquet linux-grsec
* DapperLinux$^,$
* Debian, via le paquet linux-image-grsec
* Funtoo
* Gentoo, dans sa variante "hardened"
* Subgraph OS
* Wind River Linux