Pourquoi un utilisateur non root peut supprimer des fichiers créés par root?

24

Étant donné un utilisateur non root "joshua", en tant que root, j'ai créé un fichier appelé "foo" dans le répertoire personnel de joshua (/ home / johsua /); cela ressemble à ceci:

-rw-r--r--  1 root   root       0 12-19 21:00 foo

puis supprimez-le en tant que joshua, je peux le supprimer avec succès.

Je m'attendrais à ce que joshua n'ait pas assez de permission pour le supprimer. Est-ce une sorte d'héritage des autorisations? Ma plateforme est Debian 5.0.7.

Joshua
la source
1) C'est hors sujet. 2) Je doute fort que vous ayez pu supprimer cela en tant qu'utilisateur non root sans sudoou autre élévation de privilèges. Vous avez probablement oublié quelque chose.
DarkDust
16
@DarkDust Un fichier est une entrée dans son répertoire parent. Si vous avez des droits d'écriture dans un répertoire, vous pouvez y supprimer des fichiers, quel que soit le propriétaire des fichiers (sauf si le bit collant est également défini dans le répertoire)
nos
@nos: idiot, tu as raison.
DarkDust
1
Une entrée dans son répertoire parent est une référence à un fichier. Ce n'est pas le fichier lui-même. (Sinon, comment un fichier peut-il être lié à plusieurs répertoires?)
David Schwartz
@DavidSchwartz c'est vrai, mais la suppression du fichier du répertoire consiste à supprimer la référence dans la structure du répertoire.
mc0e

Réponses:

43

L'utilisateur n'a pas supprimé le fichier, le système l'a fait. L'utilisateur a simplement supprimé le fichier de son propre répertoire. Le système a supprimé le fichier car son nombre de références est tombé à zéro. Il se trouve juste que l'utilisateur supprimant le fichier du répertoire tombe à zéro son nombre de références. (Si le fichier était lié à un autre répertoire en dur ou si un descripteur avait été ouvert sur le fichier, il n'aurait pas été supprimé.)

Le système supprime automatiquement les fichiers lorsque leur nombre de références tombe à zéro. Le propriétaire du fichier n'a pas d'importance. Il existe de nombreuses façons pour une personne autre que le propriétaire d'un fichier de ramener le nombre de références du fichier à zéro.

La suppression d'un fichier d'un répertoire (appelée «dissociation») est une opération sur le répertoire. La dissociation d'un fichier réduit son nombre de références.

De même, un utilisateur autre que le propriétaire peut fermer la dernière poignée d'un fichier qui n'est lié à aucun répertoire. La fermeture de cette poignée supprimerait également le fichier, car le nombre de références tomberait à nouveau à zéro.

David Schwartz
la source
1
Et bien sûr, la rmcommande brouille un peu les eaux, car il rms'agit d'une abréviation de "supprimer", et les utilisateurs sont formés à penser rmcomme une opération de "suppression". De nombreux utilisateurs l'utilisent rmtous les jours sans savoir que l'opération qu'ils effectuent réellement est un "dissociation" et non une "suppression". Par conséquent, il n'est pas vraiment surprenant que de nombreux utilisateurs trouvent ce comportement surprenant lorsqu'ils le rencontrent pour la première fois.
Daniel Pryden
C'est certainement surprenant pour beaucoup de gens. Au moins, la rmcommande supprime en fait un fichier ou un répertoire d'un répertoire. C'est pire sur Windows où la commande est appelée del, car elle supprimait un fichier mais sur les machines Windows modernes (depuis NT4), c'est aussi une opération de dissociation.
David Schwartz
"L'utilisateur n'a pas supprimé le fichier, le système l'a fait" Cela n'a aucun sens. Le "système" ne peut pas apporter de modifications nécessitant un accès privilégié au nom d'un utilisateur non privilégié. En tant que telle, cette réponse ne parviendra pas à expliquer pourquoi le même utilisateur ne peut pas faire de même si le répertoire actuel était détenu + accessible en écriture uniquement par root. La réponse ci-dessous par @kerrek est exacte et concise.
FractalSpace
@FractalSpace Huh? Le système peut apporter des modifications qui nécessitent un accès privilégié au nom d'un utilisateur non privilégié et le fait tout le temps. Par exemple, la modification des octets sur un disque nécessite un accès privilégié. Cependant, si un utilisateur peut modifier un fichier, le système décidera de modifier certains octets sur le disque même si l'utilisateur n'a pas l'autorisation de modifier ces octets lui-même. Un utilisateur ne peut pas modifier la mémoire du noyau, mais le noyau peut le faire lors de l'exécution au nom d'un utilisateur. Les systèmes fonctionnent en décidant d'effectuer des opérations que leurs utilisateurs ne peuvent pas autoriser directement.
David Schwartz
Oui. Et finalement tout est fait par le "système". Mais pas avant de passer par des règles strictes de séparation des privilèges définies pour cet "espace utilisateur" particulier. Dans ce scénario, par exemple, "système" n'agit pas en règle générale, mais il suit les autorisations définies sur le "répertoire parent". La partie clé de cette question dans la question OP.
FractalSpace
0

Première supposition: pour supprimer un fichier, vous avez besoin d'autorisations d'écriture sur le dossier contenant. Essayez donc / home / johsua / foo / bar, donnez 755 à foo et 644 à bar.

Eugen Rieck
la source