Cada programa con uno de los conjuntos de bits de usuario / grupo sobre la ejecución 1 es un riesgo potencial para la seguridad. En el ejemplo dado en esta pregunta 2 , los permisos de script change-pass permiten la ejecución del script y el programa passwd con privilegios de raíz utilizando el espacio de nombres de entorno copiado de otros usuarios.
La contraseña del programa se está ejecutando en modo terminal, a diferencia del modo de entrada estándar, y no quiere que el terminal muestre caracteres de contraseña en la pantalla. Llama a ttyname para obtener el nombre del terminal de la variable de entorno TERM para apagar el eco y, de lo contrario, dirigir la entrada / salida.
Al sustituir un conjunto de comandos de shell entre comillas por el valor de TERM, es posible crear un shell sin restricciones para usuarios que no sean root. La comilla simple en el comando env garantiza que la evaluación se posponga, al menos en algunas implementaciones de shell 3 , hasta que se realice la llamada a getenv para TERM mediante ttyname.
El miembro desprevenido del servicio de asistencia técnica del grupo podría abrir una puerta trasera al atacante, simplemente restableciendo la contraseña de un cliente mediante el cambio de paso.
[1] El comando ls -l muestra esto como una 's' en los códigos de permiso. Es el '4' en los códigos de comando chmod del ejemplo. Las versiones de usuario y grupo de estos bits se abrevian SUID y SGID.
[2] Se informa que este mismo exploit es efectivo con la variable de entorno MAIL_CONFIG y el ejecutable que lo adquiere del entorno, sudo, de la misma manera. (Crédito a @ adam-shostack por este ejemplo alternativo).
[3] Puede haber implementaciones que pospongan la evaluación de TERM hasta que se realice la copia del entorno para el proceso hijo, el script de cambio de paso. Es más probable que POSIX o algún otro estándar gobierne cuando se realiza la evaluación y que siempre difiera hasta que se solicite el valor.