Avoir la permission d’écriture sur un répertoire suffit, par défaut, à supprimer n’importe quel fichier à l’intérieur, y compris un fichier appartenant à un autre utilisateur : la permission qui compte pour une suppression est celle du répertoire, jamais celle du fichier lui-même. /tmp, partagé par tous les utilisateurs d’une machine, casse délibérément cette règle grâce au sticky bit.

La règle par défaut, souvent mal comprise

Supprimer un fichier consiste, du point de vue du kernel, à retirer une entrée de répertoire, une opération qui ne touche jamais directement le fichier ou ses propres permissions. C’est pour cette raison qu’un fichier en lecture seule (chmod 444) peut malgré tout être supprimé par n’importe qui ayant l’accès en écriture sur le répertoire parent, une surprise fréquente pour qui raisonne uniquement en termes de permissions du fichier lui-même.

# Un fichier en lecture seule, protégé en apparence...
chmod 444 fichier.txt
# ... mais supprimable si le répertoire parent
# est ouvert en écriture, malgré les permissions du fichier
rm fichier.txt

Ce que le sticky bit change concrètement

Le sticky bit (chmod +t, visible comme un t à la place du x dans les permissions « autres ») restreint la suppression d’un fichier dans un répertoire au propriétaire du fichier, au propriétaire du répertoire, ou à root, indépendamment des permissions d’écriture accordées à tout le monde sur ce répertoire.

# /tmp porte le sticky bit sur la quasi-totalité
# des distributions modernes, par défaut
ls -ld /tmp
# drwxrwxrwt 20 root root ... /tmp
#          ^ le "t" remplace le "x" des "autres"

Sans ce bit, /tmp en écriture pour tous (nécessaire pour que chaque utilisateur puisse y créer ses propres fichiers temporaires) permettrait à n’importe qui de supprimer les fichiers temporaires de n’importe qui d’autre, un problème de sécurité évident sur une machine partagée entre plusieurs utilisateurs ou services.

Le lien avec la même famille de bits spéciaux

Le sticky bit appartient à la même famille que le setuid déjà couvert et le setgid moins connu (qui fait hériter les nouveaux fichiers d’un répertoire du groupe de ce répertoire plutôt que du groupe primaire de l’utilisateur créateur) : les trois bits modifient un comportement par défaut du système de fichiers pour des raisons de sécurité ou de collaboration, chacun sur un axe différent (élévation de privilège pour setuid, héritage de groupe pour setgid, protection contre suppression pour le sticky bit).

À retenir

La permission de suppression d’un fichier dépend du répertoire parent, pas du fichier lui-même, une règle par défaut qui autoriserait n’importe qui à supprimer les fichiers temporaires des autres sur un répertoire partagé comme /tmp. Le sticky bit restreint cette suppression au propriétaire du fichier, au propriétaire du répertoire, ou à root, un réglage visible via le t dans ls -ld et actif par défaut sur /tmp de la quasi-totalité des distributions modernes. Il complète, avec setuid et setgid, la famille des bits de permission spéciaux qui modifient chacun un comportement par défaut du système de fichiers Linux pour un besoin de sécurité ou de collaboration précis.