← Toutes les règles
SOCLE-CLD-GEN-062// Hardening (posture)moyenneétat d’inventaire

Aucun compilateur disponible (surface d'attaque)

Garantit qu'aucun compilateur C/C++ (gcc, cc, clang, g++, tcc) n'est présent sur un hôte de production, réduisant la surface d'attaque disponible pour un intrus.

Vérifié sur ce qui est installé ou enregistré, paquets présents/absents, bases de comptes.

Un PASS prouve✓ actif maintenant✓ sur disque✓ survit au rebootle verdict qualifié →
Debian 12CIS 1.1.0Debian 13CIS 1.0.0FedoraRHEL 10 / Rocky 10 / AlmaLinux 10RHEL 8 / Rocky 8 / AlmaLinux 8CIS 4.0.0RHEL 9 / Rocky 9 / AlmaLinux 9CIS 2.0.0Ubuntu 22.04CIS 3.0.0Ubuntu 24.04CIS 1.0.0Ubuntu 26.04

Pourquoi cette règle

Un compilateur sur un serveur de production est un cadeau pour un attaquant : il lui permet de compiler des exploits d'élévation de privilèges, des modules noyau, des rootkits ou des outils sur mesure directement sur la cible, transformant du code source introduit en binaires fonctionnels qui contournent les listes d'autorisation. Les hôtes de production n'ont quasiment jamais besoin de compiler localement, les logiciels devraient être construits ailleurs et déployés sous forme de paquets. Retirer les compilateurs oblige l'attaquant à apporter des outils précompilés, ce qui est plus bruyant et plus facile à bloquer.

Ce que vérifie Pavois

Pavois contrôle l'état effectif en sondant le PATH (command -v) pour chaque binaire de compilateur connu et attend un résultat vide. Résoudre le PATH réel est plus fiable que d'inspecter un manifeste de paquets : cela détecte un compilateur installé à la main, lié par symlink ou embarqué dans un autre paquet.

describe command('for c in gcc cc c++ g++ cpp make; do p=$(command -v $c 2>/dev/null) || continue; p=$(readlink -f \"$p\"); find \"$p\" -perm -o+x 2>/dev/null; done') do
  its('stdout.strip') { should eq '' }
end

Comment vérifier qu’elle est appliquée

Lancez for c in gcc cc clang g++ tcc; do command -v $c; done, il ne doit rien afficher. Chaque binaire manquant confirme qu'aucun compilateur n'est accessible dans le PATH.

Inspecter et investiguer

Il n'existe pas de journal d'exécution pour cette règle. Confirmez l'absence avec command -v gcc cc clang g++ tcc (vide) et dpkg -l gcc 'g++' clang / rpm -q gcc pour vérifier que les paquets ne sont pas installés.

Remédiation

Aucune remédiation automatisée n'est fournie, appliquez-la donc manuellement : supprimez les paquets de compilateur (apt purge gcc g++ clang / dnf remove gcc gcc-c++ clang) ainsi que tout binaire de compilateur autonome. Restreignez les droits d'exécution de tout compilateur devant rester (par ex. pour DKMS) au seul utilisateur root.

Pavois applique ceci avec son propre moteur harden, le plan ci-dessous, pas un script shell :

commandfor p in gcc cpp g++ gcc-12 g++-12 cpp-12 clang tcc tcc-dev; do dpkg -l "$p" 2>/dev/null | grep -q '^ii' && DEBIAN_FRONTEND=noninteractive apt-get purge -y "$p" >/dev/null 2>&1; done; true; for c in gcc cc c++ g++ cpp make; do p=$(command -v $c 2>/dev/null) || continue; chmod o-x "$p" 2>/dev/null; don; for c in gcc cc c++ g++ cpp make; do p=$(command -v $c 2>/dev/null) || continue; chmod o-x "$(readlink -f "$p")" 2>/dev/null; done; true
namepurge-compilers
not_iftest -z "$(for c in gcc cc c++ g++ cpp make; do p=$(command -v $c 2>/dev/null) || continue; p=$(readlink -f \"$p\"); find \"$p\" -perm -o+x 2>/dev/null; done)"
resourceexec
pavois harden plan local

où la cible est local, un alias SSH user@hôte, ou un conteneur , Docs

Impact & précautions

Retirer les compilateurs peut casser les compilations et outils qui compilent à l'installation ou à l'exécution : modules noyau DKMS, installeurs basés sur make, certains gestionnaires de paquets de langage (gems/wheels/addons npm natifs) et la gestion de configuration compilant depuis les sources. Avant d'appliquer, vérifiez que l'hôte n'en dépend pas, si c'est le cas, conservez le compilateur avec des droits restreints ou déportez cette étape vers un serveur de build dédié. Les serveurs purement d'exécution/production sont sûrs.

0