El pasado 12 de octubre moría Dennis Ritchie, uno de los más grandes programadores, creador del lenguaje C y junto con otros, del sistema operativo Unix.
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 joya para el 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 bits cada uno, en total, 9 bits. Cada uno de los tres bits significa lo siguiente:
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/shadow -rw-r----- 1 root shadow 665 oct 7 13:39 /etc/shadow
Esto 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 quiera 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.
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.
Si desea hacer algún comentario, utilice la siguiente dirección de correo:
Pedro González Ruiz