¿Por qué un usuario no root puede eliminar archivos creados por root?

24

Dado un usuario no root "joshua", como root creé un archivo llamado "foo" en el directorio de inicio de joshua (/ home / johsua /); se ve así:

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

y luego eliminarlo como joshua, puedo eliminarlo con éxito.

Esperaría que Joshua no tenga suficiente permiso para eliminarlo. ¿Es algún tipo de 'Herencia de permisos'? Mi plataforma es Debian 5.0.7.

Joshua
fuente
1) Esto está fuera de tema. 2) Dudo mucho que haya podido eliminar eso como usuario no root sin sudou otra escalada de privilegios. Probablemente pasaste por alto algo.
DarkDust
16
@DarkDust Un archivo es una entrada en su directorio padre. Si tiene derechos de escritura en un directorio, puede eliminar archivos independientemente de quién sea el propietario de los archivos (a menos que el bit adhesivo también esté configurado en el directorio)
nos
@nos: tonto, tienes razón.
DarkDust
1
Una entrada en su directorio padre es una referencia a un archivo. No es el archivo en sí. (De lo contrario, ¿cómo podría un archivo estar vinculado a más de un directorio?)
David Schwartz
@DavidSchwartz es cierto, pero eliminar el archivo del directorio se trata de eliminar la referencia en la estructura del directorio.
mc0e

Respuestas:

43

El usuario no eliminó el archivo, el sistema sí. El usuario simplemente eliminó el archivo de su propio directorio. El sistema eliminó el archivo porque su recuento de referencias cayó a cero. Es solo casualidad que el usuario que elimina el archivo del directorio bajó su recuento de referencia a cero. (Si el archivo se vinculó a otro directorio o se abrió un identificador en el archivo, no se habría eliminado).

El sistema elimina archivos automáticamente cuando su recuento de referencias cae a cero. El propietario del archivo no importa. Hay muchas formas en que alguien que no sea el propietario de un archivo puede reducir el recuento de referencias del archivo a cero.

Eliminar un archivo de un directorio (llamado 'desvinculación') es una operación en el directorio. Desvincular un archivo reduce su recuento de referencias.

Del mismo modo, un usuario que no sea el propietario podría cerrar el último identificador de un archivo que no está vinculado a ningún directorio. Cerrar ese identificador también eliminaría el archivo, ya que nuevamente el recuento de referencias se reduciría a cero.

David Schwartz
fuente
1
Y, por supuesto, el rmcomando enturbia un poco las aguas, porque rmes una abreviatura de "eliminar", y los usuarios están capacitados para pensar rmen una operación de "eliminación". Muchos usuarios lo usan rmtodos los días sin saber que la operación que realmente realiza es un "desvinculado", no un "borrado". Como resultado, no debería sorprender que muchos usuarios encuentren este comportamiento sorprendente cuando lo encuentran por primera vez.
Daniel Pryden
Definitivamente es sorprendente para muchas personas. Al menos el rmcomando de hecho elimina un archivo o directorio de un directorio. Es peor en Windows donde se llama al comando del, porque solía eliminar un archivo pero en máquinas Windows modernas (desde NT4), también es una operación de desvinculación.
David Schwartz
"El usuario no eliminó el archivo, el sistema sí" Esto no tiene sentido. El "sistema" no puede realizar cambios que requieran acceso privilegiado en nombre de un usuario no privilegiado. Como tal, esta respuesta no podrá explicar por qué el mismo usuario no puede hacer lo mismo si el directorio actual era propiedad + escribible solo por root. La respuesta a continuación por @kerrek es precisa y concisa.
FractalSpace
@FractalSpace ¿Eh? El sistema puede realizar cambios que requieren acceso privilegiado en nombre de un usuario no privilegiado y lo hace todo el tiempo. Por ejemplo, cambiar los bytes en un disco requiere acceso privilegiado. Sin embargo, si un usuario puede modificar un archivo, el sistema decidirá modificar algunos bytes en el disco a pesar de que el usuario no tiene permiso para modificar esos bytes. Un usuario no puede modificar la memoria del núcleo, pero el núcleo puede hacerlo cuando se ejecuta en nombre de un usuario. Los sistemas operan decidiendo realizar operaciones que sus usuarios no pueden autorizar directamente.
David Schwartz el
Sí. Y eventualmente todo lo hace el "sistema". Pero no antes de pasar por estrictas reglas de separación de privilegios establecidas para ese "espacio de usuario" en particular. En este escenario, por ejemplo, "sistema" no está realizando acciones como regla general, sino que está siguiendo los permisos establecidos en el "directorio padre". La parte clave de este problema en la pregunta OP.
FractalSpace
0

Primera aproximación: para eliminar un archivo necesita permisos de escritura en la carpeta que lo contiene. Así que prueba / home / johsua / foo / bar, da 755 a foo y 644 a bar.

Eugen Rieck
fuente