Le dossier /tmp est l'un des rares dossier du système qui soit accessible en écriture par tout le monde. Les utilisateur comme les services. Cependant beaucoup de vers utilisent des failles des application web pour déposer un fichier sur le serveur et arrive donc dans ce fameux dossier temporaire d'où le fichier peut être exécuter.

Afin de s'en prémunir il suffit de rendre le dossier temporaire non exécutable.

Monage du dossier /tmp en lecture/écriture seules

Pour inactivé l'exécution globalement dans un répertoire, il faut que cela concerne toute une partition. Il y a donc deux possibilité: soit le répertoire /tmp est déjà une partition à part soit il faut en crée une pour lui. Plutôt que de reformater complètement le disque pour créer cette partition, il est possible de transformer un fichier en partition loopback.

Pour cela il faut d'abord créer ce fichier comme dans l'article Création de fichier image disque et montage.

Pour monter le fichier automatiquement au démarrage il suffit d'ajouter la ligne suivante:

/fichier_temporaire /tmp ext3 loop,noexec,nosuid,nodev,rw 0 0

fichier_temporaire est le chemin complet vers le fichier contenant la partition destiné au répertoire temporaire. Les options noexec,nosuid,nodev permettent de bloquer l'exécution sur cette partition.

Dans le cas ou le dossier temporaire serait déjà sur une partition séparée, l'ajout des options noexec,nosuid,nodev pour l'entrée du fichier /etc/fstab correspondante permettra de bloquer l'exécution sur cette partition.

DPKG et erreur d'exécution

Lors de l'installation de paquets, les scripts de configurations sont placé dans le répertoire /tmp et exécutés. Cependant comme l'exécution est bloqué il ne peuvent pas se configurer renvoyant une erreur semblable à la suivante:

Can't exec "/tmp/quota.config.26141": Permission non accordée at /usr/share/perl/5.8/IPC/Open3.pm line 168

Lors de l'installation de paquets il faut donc rendre exécutable le répertoire temporaire via la commande suivante:

# mount -o remount,exec /tmp

Enfin, une fois les paquets installé la partition est de nouveau rendue non exécutable via la commande:

# mount -o remount,noexec /tmp

Il est possible de demander à dpkg de se débrouiller tout seul pour faire ce changement de permission sur le répertoire /tmp via un petit script de . Pour cela il suffit de modifier le fichier /etc/apt/apt.conf.d/70debconf pour qu'il ressemble à ceci:

//changement des permission d'exécution du répertoire /tmp
DPkg::Pre-Install-Pkgs {"mount -o remount,exec /tmp; /usr/sbin/dpkg-preconfigure --apt || true";};
DPkg::Post-Invoke {"mount -o remount,noexec /tmp";};

Une configuration analogue peut être effectuée avec le répertoire /var. Cependant vue la taille que ce répertoire peut atteindre lors de l'utilisation d'un serveur web il est conseillé d'utiliser une vraie partition et non un fichier loopback. Il faut également modifier le fichier /etc/apt/apt.conf.d/70debconf, dpkg utilisant le répertoire /var/cache/apt/ pour dépaqueter les paquets:

//changement des permission d'exécution du répertoire /tmp
DPkg::Pre-Install-Pkgs {"mount -o remount,exec /tmp; mount -o remount,exec /var; /usr/sbin/dpkg-preconfigure --apt || true";};
DPkg::Post-Invoke {"mount -o remount,noexec /tmp; mount -o remount,noexec /var;";};