He leído varias veces su libro El lenguaje de programación C, escrito junto con otro de los grandes, Brian W. Kernighan, auténtica biblia del programador, en donde de modo claro, breve y elegante, se exponen muchos ejemplos para facilitar la comprensión del lenguaje y de la programación en general. El estilo del texto ha influído en toda una generación, en la cual me incluyo.
Lo que pretendo en estas notas es recordarlo comentando una de sus aportaciones al sistema Unix. En este sistema, a cada archivo ordinario hay asociados una serie de permisos, agrupados en tres bloques de tres cada uno, en total, 9 bits. Cada uno de los tres bits significa lo siguiente:
- Bit 1º, permiso de lectura. Si es 1, el archivo se puede leer, en caso contrario, es decir, si vale 0, el archivo no se puede leer.
- Bit 2º, permiso de escritura. Si es 1, el archivo se puede modificar, en caso contrario, no.
- Bit 3º, permiso de ejecución. Si es 1, el archivo se puede ejecutar, en caso contrario, no.
El bloque primero son los permisos del usuario, el bloque segundo los del grupo y el bloque tercero, los de los demás. Lo habitual es que un archivo ordinario, no programa, sea de la forma: rw- r-- r--. El guión - indica que el bit vale 0. El primer bloque rw- son los del usuario, el cual puede leer y modificar el archivo, pero no ejecutarlo. El segundo bloque r-- es el grupo del usuario, los cuales pueden leer el archivo pero no modificarlo ni ejecutarlo, y por último, el tercer bloque, el de los demás, r--, con idénticas posibilidades al grupo.
Hay un usuario en el sistema, de nombre root, al que todas estas cosas no le afectan. Puede leer, modificar y borrar cualquier archivo, independientemente de los permisos que tenga asignados. Es una especie de Gran hermano, cuya misión es el mantenimiento del sistema. El poder de root es enorme, razón por la cual, su responsabilidad también lo es, ya que puede inutilizar el sistema con una mala gestión. Sin embargo, un usuario normal, puede originar un destrozo en su espacio, pero no en el resto.
Vista la introducción, vayamos al grano. En el archivo /etc/shadow se encuentran las contraseñas encriptadas de los usuarios (en el Unix original, se encontraban en /etc/passwd). Es un archivo de texto normal y corriente, con la información organizada en columnas. Su propietario es root, y como es evidente, nadie, salvo él puede modificar su contenido. En efecto, lo listamos:
pedro@servidor2:~> ls -al /etc/shadowEsto origina un problema: ¿qué ocurre si un determinado usuario quiere modificar su contraseña?. La solución es, aparentemente trivial, en concreto, mediante el programa passwd se le pide al usuario que escriba la vieja contraseña, con lo cual nos aseguramos que el auténtico dueño no se ha ido a tomar un café, y el compañero de la mesa de al lado, le quiere gastar una broma. Después la nueva un par de veces para evitar errores al teclear y finalmente se sustituye la antigua entrada en /etc/shadow por la nueva. Y aquí está el problema, ya que esto obliga a modificar el archivo, es decir, a escribir en él, lo cual el sistema no lo permite debido a la restricción de escritura antes comentada.
-rw-r----- 1 root shadow 665 oct 7 13:39 /etc/shadow
En conclusión, si quiero cambiar mi contraseña, no puedo, ya que eso implica modificar un archivo sobre el cual no tengo permiso.
Dennis Ritchie solucionó el problema (hasta patentó la idea) creando un bit adicional a cualquier programa, de forma que si está activado, cualquier usuario que ejecute dicho programa adquiere momentáneamente los derechos del propietario del programa, en este caso root, y sólo mientras el programa se mantiene en ejecución. Como el propietario del programa passwd es root, cualquier persona que quiera cambiar su contraseña mediante el programa anterior, se convierte en root, con lo cual puede modificar el contenido del archivo y lograr su propósito.
Como es evidente, esto origina un grave peligro, ya que si el programa no funciona bien, puede dañar al sistema, razón por la cual, este tipo de programas deben estar muy depurados para evitar conflictos.
Por último, veamos un listado de dos programas, el primero es el familiar grep y el segundo passwd, donde observamos la diferencia entre uno y otro:
pedro@servidor2:~> ls -al /bin/grep
-rwxr-xr-x 1 root root 130664 feb 18 2011 /bin/grep
pedro@servidor2:~> ls -al /usr/bin/passwd
-rwsr-xr-x 1 root shadow 81856 feb 19 2011 /usr/bin/passwd
En grep, el tercer bit comenzando por la izquierda es x, mientras que en passwd, este mismo bit es s, lo cual nos indica lo explicado anteriormente.
Pedro González