# Supervisor Mode Access Prevention

Supervisor Mode Access Prevention (SMAP) (prévention d'accès en mode superviseur) est une fonctionnalité de certaines implémentations de CPU telles que la microarchitecture d'Intel : Broadwell qui permet aux programmes en mode superviseur de définir éventuellement des mappages de mémoire dans l'espace utilisateur afin que l'accès à ces mappages à partir du mode superviseur provoque un piège. Cela a pour but de rendre plus difficile pour les programmes malveillants de "tromper" le noyau en utilisant des instructions ou des données d'un programme de l'espace utilisateur$^,$.

## Histoire

La prévention d'accès en mode superviseur est conçue pour compléter la prévention d'exécution en mode superviseur (SMEP). La SMEP peut être utilisée pour empêcher le mode superviseur d'exécuter involontairement le code de l'espace utilisateur tandis que SMAP étend cette protection aux lectures et aux écritures.

## Avantages

Sans la prévention d'accès en mode superviseur, le code superviseur a généralement un accès complet en lecture et en écriture aux mappages de mémoire de l'espace utilisateur (voir la capacité à en obtenir un accès complet). Cela a conduit au développement de plusieurs prouesses de sécurité, y compris dans l'élévation de privilèges qui fonctionnent en obligeant le noyau à accéder à la mémoire de l'espace utilisateur alors qu'il n'en avait pas l'intention.
Les systèmes d'exploitation peuvent bloquer ces avancées en utilisant la SMAP pour forcer les accès involontaires à la mémoire de l'espace utilisateur afin de déclencher des erreurs de page. De plus, la SMAP peut exposer un code de noyau défectueux qui ne suit pas les procédures prévues pour accéder à la mémoire de l'espace utilisateur.
Cependant, l'utilisation de SMAP dans un système d'exploitation peut entraîner une plus grande taille de noyau et des accès à la mémoire de l'espace utilisateur plus lents à partir du code superviseur. Le SMAP doit être temporairement désactivé chaque fois que le code superviseur a l'intention d'accéder à la mémoire de l'espace utilisateur ce qui induit des ralentissements.

## Détails techniques

Les processeurs indiquent le support de la prévention d'accès en mode superviseur via la feuille des fonctionnalités étendues CPUID.
SMAP est activé lorsque la pagination de la mémoire est active et que le bit SMAP dans le registre de contrôle CR4 est défini. SMAP peut être temporairement désactivé pour les accès mémoire explicites en définissant l'EFLAGS au flag AC : Auxiliary Carry (contrôle d'alignement). Les "stac" (Set AC Flag) et "clac" (Clear AC Flag) peuvent être utilisées pour définir ou effacer facilement le flag.
Lorsque le bit SMAP dans CR4 est défini, les lectures / écritures de mémoire explicite sur les pages en mode utilisateur effectuées par du code exécuté avec un niveau de privilège inférieur à 3 entraîneront toujours une erreur de page si le flag AC de l'EFLAGS n'est pas défini. Les lectures / écritures implicites (telles que celles effectuées dans les tables de descripteurs) sur les pages en mode utilisateur déclencheront toujours une erreur de page si SMAP est activé, quelle que soit la valeur du flag CA de EFLAGS.

## Prise en charge du système d'exploitation

La prise en charge du noyau Linux pour la prévention d'accès en mode superviseur a été implémentée par H. Peter Anvin. Il a été fusionné dans le noyau Linux 3.7 principal et il est activé par défaut pour les processeurs qui prennent en charge cette fonctionnalité.
FreeBSD prend en charge la prévention d'exécution en mode superviseur depuis 2012 et la prévention d'accès en mode superviseur depuis 2018.
OpenBSD prend en charge la prévention d'accès en mode superviseur et la prévention d'exécution en mode superviseur associée depuis 2012, avec OpenBSD 5.3 étant la première version avec la prise en charge de la fonctionnalité activée.
Le support NetBSD pour la prévention d'exécution en mode superviseur (SMEP) a été implémenté par Maxime Villard en décembre 2015. Le support de la prévention d'accès en mode superviseur (SMAP) a également été mis en place par Maxime Villard, en août 2017. NetBSD 8.0 était la première version avec les deux fonctionnalités prises en charge et activées.
Le support Haiku pour la Prévention d'Exécution en Mode Superviseur (SMEP) a été mis en place par Jérôme Duval en janvier 2018.
macOS prend en charge SMAP au moins depuis la sortie de macOS 10.13 en 2017.