Creación de enlaces duros: ¿permisos?

16

¿Qué permisos afectan la creación de enlaces duros? ¿Importa la propiedad del archivo?


Supongamos que el usuario alicedesea crear un enlace fijo al archivo target.txten un directorio target-dir.

  • ¿Qué permisos alicenecesita en ambos target.txty target-dir?
  • Si target.txtes propiedad del usuario billy target-dires propiedad del usuario chad, ¿cambia algo?

Intenté simular esta situación creando la siguiente estructura de carpetas / archivos en un ext4sistema de archivos:

#> ls -lh . *
.:
drwxr-xr-x 2 bill bill 60 Oct  1 11:29 source-dir
drwxrwxrwx 2 chad chad 60 Oct  1 11:40 target-dir

source-dir:
-r--r--r-- 1 bill bill 0 Oct  1 11:29 target.txt

target-dir:
-rw-rw-r-- 1 alice alice 0 Oct  1 11:40 dummy

Si bien alicepuede crear un enlace suave a target.txt, ella no puede crear un enlace duro:

#> ln source-dir/target.txt target-dir/
ln: failed to create hard link ‘target-dir/target.txt’ => ‘source-dir/target.txt’: Operation not permitted

Si aliceposee target.txty no se cambian los permisos, el enlace duro tiene éxito. ¿Que me estoy perdiendo aqui?

gcscaglia
fuente
¿Es esto para una tarea? Puede afectar el tipo de respuestas que algunos elegirán dar si es así (no es que fuera de límites hacer una pregunta sobre una tarea, por supuesto). De todos modos, ¿has intentado crear ese escenario y ver qué sucede?
Eric Renouf
No, no es para una tarea. Me enfrento a este escenario exacto y tengo algunas conjeturas, pero pensé que sería mejor preguntar desde un punto de vista teórico. En mi caso yo soy incapaz de crear el enlace duro sin tener en cuenta target.txty target-dirpermisos, a menos que sudocomo root.
gcscaglia
Los enlaces duros comparten la misma propiedad y permisos, por lo que es lo mismo que acceder al archivo original.
teppic 01 de
@teppic Mi dificultad es no acceder al enlace duro creado, está creando el enlace duro ya que alicepuedo acceder tanto al archivo original como a un enlace duro (creado con sudo), pero no puedo crear el enlace como el usuario a alicepesar de que todos estamos de acuerdo con estos permisos debería ser suficiente para ello.
gcscaglia

Respuestas:

18

Para crear el enlace duro alicenecesitará write+executepermisos target-diren todos los casos. Los permisos necesarios target.txtvariarán:

  • Si fs.protected_hardlinks = 1entonces alicenecesita propiedad target.txto al menos read+writepermisos sobre él.
  • Si fs.protected_hardlinks = 0entonces cualquier conjunto de permisos servirá; Incluso 000 está bien.

Esta respuesta a una pregunta similar tenía la información faltante para responder a esta pregunta.

De http://kernel.opensuse.org/cgit/kernel/commit/?id=800179c9b8a1 [énfasis mío]:

Enlaces duros:

En los sistemas que tienen directorios escribibles por el usuario en la misma partición que los archivos del sistema, una clase de problemas de seguridad de larga data es la carrera basada en el enlace de tiempo de verificación, tiempo de uso, más comúnmente vista en directorios de escritura mundial como / tmp. El método común de explotación de esta falla es cruzar los límites de privilegios cuando se sigue un enlace rígido dado (es decir, un proceso raíz sigue a un enlace rígido creado por otro usuario). Además, existe un problema en el que los usuarios pueden "anclar" un archivo setuid / setgid potencialmente vulnerable para que un administrador no actualice el sistema por completo.

La solución es permitir que los enlaces duros solo se creen cuando el usuario ya es el propietario del archivo existente o si ya tiene acceso de lectura / escritura al archivo existente .

gcscaglia
fuente
¡Gracias! ¡Esto es lo que he estado luchando por un día en Debian 9!
Arda
¿Por qué debería obtener "operación no permitida" incluso cuando tengo permisos rwx en el directorio y permisos rw en el archivo?
Michael
1

alicenecesita al menos permiso de lectura target.txty escritura + permiso de ejecución target-dir.

Ahora, la estructura de permisos funciona como un conjunto separado triple:

  1. Permisos de usuario: se aplican al usuario que posee el nodo.
  2. Permisos de grupo: se aplican a cualquier usuario que pertenezca al grupo propietario del nodo.
  3. Permisos de otros: se aplican a cualquier otro usuario / grupo que no sea propietario del nodo.

Por lo tanto, la pregunta de propiedad afecta solo en qué conjunto de permisos son los permisos requeridos alice, siendo:

  • Si alicees el usuario propietario, los permisos necesarios deben estar en la parte "usuario".
  • Si alicees parte del grupo que lo posee, los permisos requeridos deben estar en la parte "grupo".
  • Si aliceno lo posee y no forma parte del grupo que lo posee, los permisos necesarios deben estar en la "otra" parte.
dave_alcarin
fuente
Yo también lo pensé. Pero en mi situación target.txttiene 444 permisos y target-dirtiene 777 permisos, pero no puedo crear un enlace rígido a menos que lo haga como root o sea el propietario del archivo al que me estoy vinculando. Por extraño que parezca, un enlace suave funcionará como usted describe.
gcscaglia
Sería útil tener esa información en la pregunta en sí, le recomiendo que actualice. Por extraño que parezca, no lo pensé antes ... pero, ¿para empezar, el sistema de archivos en el que está trabajando admite propiedades / permisos similares a Unix?
dave_alcarin
Sí, es un ext4 listo para usar en un sistema fedora 21; El enlace funciona cuando soy el propietario del archivo.
gcscaglia