Sections du handbook

Durcir les montages et le système de fichiers

Revu le

Isolez les répertoires à risque sur leurs propres montages et bridez-les avec nodev, nosuid, noexec pour qu'un coin inscriptible du disque ne devienne pas une rampe de lancement.

La menace : écrire une charge, puis l'exécuter

Un attaquant a presque toujours besoin d'un endroit pour écrire une charge utile puis l'exécuter. Les répertoires accessibles en écriture à tous comme /tmp et /dev/shm, ou les arborescences très mouvantes comme /var, sont les candidats évidents : binaire malveillant déposé, étape d'exploitation, boîte à outils téléchargée, ou charge « fileless » en mémoire partagée. Deux faiblesses au niveau des montages rendent cela trivial :

  • Exécution depuis un stockage inscriptible : si n'importe quel utilisateur non privilégié peut déposer un fichier sous /tmp et l'exécuter, un seul service compromis devient une exécution de code arbitraire.
  • Abus setuid/périphérique : un binaire setuid ou un nœud de périphérique placé sur un montage inscriptible peut servir à une élévation de privilèges ou à accéder aux périphériques bruts et contourner les permissions du système de fichiers.

Quand tout réside sur une unique partition /, aucun de ces répertoires ne peut porter de restrictions indépendantes : tout le disque partage un seul jeu d'options de montage, et il n'existe aucune frontière à imposer.

Pourquoi le durcir

Les options de montage sont un contrôle peu coûteux, appliqué par le noyau : c'est le noyau, pas une application, qui décide de ce qui est autorisé. Trois drapeaux neutralisent les principaux abus :

  • noexec : le noyau refuse d'exécuter tout programme stocké sur le montage, supprimant le terrain de jeu de l'attaquant.
  • nosuid : les bits setuid/setgid sont ignorés ; un binaire setuid-root déposé s'exécute avec les privilèges de l'appelant, pas ceux de root.
  • nodev : les nœuds de périphérique sur le montage ne sont pas pris en compte, bloquant un nœud pirate de type /dev/sda utilisé pour lire le disque brut.

Mais un drapeau ne peut s'appliquer qu'à un montage qui existe. C'est pourquoi le durcissement associe ces options à des partitions séparées (ou des tmpfs/unités de montage systemd) pour les arborescences sensibles : /tmp, /var, /var/tmp, /var/log, /var/log/audit, /home, /dev/shm, /boot, /srv, /opt, /usr. Un /var/log séparé empêche aussi un afflux de logs de saturer /, et une partition d'audit dédiée protège la piste de preuves.

Principes de défense appliqués

  • Réduction de la surface d'attaque : désactiver les pilotes de systèmes de fichiers inutilisés (cramfs, freevxfs, jffs2, hfs, udf, usb-storage) pour qu'un attaquant ne puisse pas auto-monter un système de fichiers exotique ou amovible afin de contourner vos options.
  • Moindre privilège : nosuid et nodev refusent les deux primitives classiques d'élévation sur les partitions de données, qui n'en ont jamais besoin.
  • Défense en profondeur : les options de montage s'ajoutent aux permissions et au MAC ; même si les permissions sont mauvaises, noexec bloque encore l'étape d'exécution.
  • Confinement : des partitions séparées empêchent un répertoire d'épuiser l'espace partout et isolent la piste d'audit de toute altération ou débordement.

Le piège dpkg/noexec

noexec sur /var et /tmp a un coût concret sous Debian/Ubuntu. APT et dpkg déposent et exécutent les scripts de mainteneur (preinst, postinst) depuis des emplacements temporaires, et certaines opérations exécutent des utilitaires depuis /var ou /tmp : sous un noexec strict, elles peuvent échouer en pleine mise à jour, laissant des paquets à moitié configurés. Cela vaut aussi pour les outils de build, certains plugins pip/dnf, les auto-updaters, et les navigateurs en bac à sable qui s'exécutent depuis /dev/shm. Ce n'est pas une raison d'abandonner le contrôle : redirigez l'outillage avec $TMPDIR/APT::ExtractTemplates::TempDir vers une zone autorisant l'exécution, accordez une exception temporaire et délimitée pendant la maintenance, ou utilisez des hooks dpkg qui remontent brièvement, ne retirez jamais silencieusement noexec de /tmp à l'échelle du système. Testez en pré-production avant d'appliquer.

Ce que Pavois audite : la table de montage effective

Pavois lit la table de montage effective, la vue en temps réel du noyau via /proc/self/mountinfo exposée par la ressource InSpec mount('<chemin>'), et non /etc/fstab. C'est tout l'intérêt : il voit un /tmp fourni à l'exécution par l'unité systemd tmp.mount, un /dev/shm absent de fstab, une partition remontée en silence sans un drapeau, ou une ligne fstab jamais prise en compte, autant de cas qu'un scanner basé sur les fichiers (OVAL/oscap) déclarerait conformes à tort. Concrètement, les règles du domaine Mounts vérifient :

  • noexec, nosuid, nodev sur /tmp, /var, /var/tmp, /var/log, /var/log/audit, /home, /dev/shm, /boot, /boot/efi, /srv, /opt, en s'assurant que chaque jeu d'options résolu contient le drapeau.
  • Des règles de partition séparée (be_mounted) confirmant que /tmp, /var, /var/tmp, /var/log, /var/log/audit, /home, /dev/shm, /boot, /srv, /opt, /usr sont sur leur propre système de fichiers plutôt que sur /.

Chaque règle porte ses correspondances de normes (CIS, ANSSI BP-028 R28, NIST) et une étape de vérification basée sur findmnt.

Comment vérifier et opérer ?

  • Voir les options effectives : findmnt /tmp ou findmnt -o TARGET,OPTIONS montre ce que le noyau applique réellement ; /proc/self/mountinfo est la vérité brute en vigueur. Ne vous fiez pas à /etc/fstab seul.
  • Appliquer sans redémarrer : mount -o remount,noexec,nosuid,nodev /tmp une fois la ligne fstab (ou l'unité systemd) en place, puis confirmez avec findmnt.
  • /tmp est souvent une unité systemd, pas fstab : systemctl enable --now tmp.mount (ou un drop-in tmp.mount) fournit /tmp en tmpfs ; éditez l'unité, pas seulement fstab.
  • Rendre persistant : les options nodev,nosuid,noexec vont dans l'entrée /etc/fstab (ou l'unité de montage systemd) pour survivre au redémarrage ; Pavois, qui lit le montage vivant, détecte l'écart quand ce n'est pas le cas.

Pièges

  • noexec peut casser les mises à jour de paquets et les outils de build (voir le piège dpkg) : délimitez un $TMPDIR autorisant l'exécution plutôt que de retirer le drapeau.
  • Un drapeau dans fstab jamais remonté n'est pas effectif : seul le montage vivant compte.
  • /tmp en tmp.mount systemd ignore la ligne fstab : durcissez l'unité.
  • Certaines applications s'exécutent depuis /dev/shm (Chrome, certains runtimes) : testez avant d'y imposer noexec.

FAQ

Pourquoi Pavois lit-il le montage vivant plutôt que /etc/fstab ? Parce que le noyau applique les options en vigueur ; une entrée fstab pas encore remontée, ou un /tmp fourni par tmp.mount, fait de fstab une source fausse. Pavois lit /proc/self/mountinfo.

noexec a cassé un apt upgrade. Que faire ? Redirigez l'exécution temporaire d'APT/dpkg vers une zone autorisant l'exécution ($TMPDIR, APT::ExtractTemplates::TempDir) ou remontez brièvement pendant la maintenance ; ne retirez jamais noexec de /tmp définitivement.

Faut-il des partitions séparées, ou juste les options ? Les deux : un drapeau ne peut s'appliquer qu'à un montage existant, donc isolez les arborescences sensibles puis bridez-les avec nodev,nosuid,noexec.