La máscara no es una resta

(N.d.E.: Interrumpimos la programación habitual de la Black Hat para hablar de máscaras en su sentido menos erótico festivo. No obstante, que reine la calma, ya que mañana continuaremos con el día 2 de la BH a cargo de Roberto)

Como ustedes saben, los permisos en las máquinas Unix/Linux se dividen en tres dominios: usuario, grupo y otros. A cada uno de estos dominios se le puede aplicar tres permisos: ejecución (x o 1), escritura (w o 2) y lectura (r o 4). Cuando un usuario en Linux crea un fichero o un directorio, éstos deben tener unos permisos. Estos permisos por defecto se establecen mediante una máscara. Hasta aquí, nada nuevo bajo el sol.

El comando para listar los permisos por defecto, la máscara, es umask:

$ umask
0022
$ mkdir directorio
$ touch fichero
$ ls -l
total 4
drwxr-xr-x 2 moxilo moxilo 4096 2010-04-15 00:07 directorio
-rw-r--r-- 1 moxilo moxilo    0 2010-04-15 00:07 fichero

Como ven, para un directorio los permisos por defectos son 755, y para el fichero 644. Estos permisos por defecto son establecidos por la máscara del usuario, en nuestro caso 0022. Para nuestro ejemplo tomamos los tres últimos números (022). Pero, ¿por qué 022? Pese a que tradicionalmente se ha creído que estos permisos se obtienen por la resta del valor 777 menos la máscara en el caso de los directorios, y de 666 menos la máscara para los ficheros, ésta es una conclusión errónea. Lo que realmente ocurre no es la operación resta, sino la operación AND de la negación de la máscara.

En el caso de los directorios la operación es 777 (111 111 111) AND ~(valor mascara en binario), y para los ficheros es igual pero con 666. Veámoslo con un ejemplo:

1º) Dada una mascara con valor 136, su representación en binario es 001 011 110.
2º) La negación de la mascara es el valor 110 100 001.
3º) Para calcular los permisos de los directorios, se realiza la operación AND entre 777 y la negación de la mascara: 111 111 111 AND 110 100 001 dando como resultado 110 100 001, es decir 641.
4º) Para el caso de los ficheros sería la operación AND entre 666 y la negación de la mascara: 110 110 110 AND 110 100 001, dando como resultado 110 100 000, es decir 640.

Si hubiéramos hecho la operación resta para directorios, veríamos que: 777 – 136 = 641, es decir el mismo que con la operación «AND ~(Mascara)». En cambio, esto no sucede así con los ficheros, ya que 666 – 136 = 530, cuando su valor real es 640.

Por tanto, en caso de los ficheros, una máscara cuyo valor sea 136 estaría dando por defecto permisos de lectura y escritura al usuario (6), de lectura al grupo (4) y ninguno a otros (0). Pero no permisos de lectura y ejecución (5) al usuario y permiso de escritura y ejecución al grupo (3) que es el valor que obtendríamos si restáramos.

$ umask 0136
$ umask
0136
$ mkdir directorio
$ touch fichero
$ ls -l
total 4
drw-r----x 2 moxilo moxilo 4096 2010-04-21 22:09 directorio
-rw-r----- 1 moxilo moxilo    0 2010-04-21 22:10 fichero

Por tanto, recuerden que el método de la resta sirve únicamente para los directorios, pero no así para los ficheros. Es por ello que debemos tener precaución cuando realicemos una modificación sobre la máscara; mi recomendación, si me lo permiten, sería cambiar la mascara a 0027.

Comments

  1. Antonio Villalon says

    Tienes toda la razón Ximo. ¡Toda la vida pensando que era una resta! :)

    Saludos
    T

  2. Este artículo es en honor al artículo sobre ACLs de Javier Vela? :)

    NaCl u2

  3. Más vale tarde que nunca…. pero comento lo que no dije en su momento.

    ¡Gracias por la aclaración! Como dice Antonio Villalón: «toda la vida pensando que era una resta». De hecho desde el día que lo leí hasta ahora, me he encontrado a unas cuantas personas que siguen manteniendo que es una resta.

    Por otro lado decir que para ver los permisos que tiene un fichero después de aplicar el umask, nada más sencillo que: umask -S

    Es una forma rápida de que los que mantienen que es una resta vean que realmente no es así.

    Lo dicho, gracias por el aporte :)