run0: la herramienta de systemd para reemplazar sudo
- Nueva herramienta incluida en la v256 (en realidad es un
symlink al systemd-run existente)
- Funciona de forma similar a sudo, pero no es SUID
- Le pide al gestor de servicios que invoque un comando o un shell con el UID del usuario objetivo
- Invoca el comando objetivo en un contexto de ejecución aislado, recién bifurcado desde PID 1, sin heredar el contexto del cliente
- run0 no implementa su propio lenguaje de configuración y usa polkit para la autorización.
- Durante la elevación de privilegios, cambia el fondo de la terminal a un tono rojo para indicar que está funcionando con privilegios. También muestra un punto rojo en el título de la ventana para indicar si hay elevación de privilegios.
- Soporta el switch
--property= de systemd-run, así que permite especificar la configuración de servicio deseada para el comando o sesión privilegiada invocada.
Problemas de sudo
- sudo es un binario SUID relativamente grande: código privilegiado que un usuario sin privilegios puede invocar desde su propio contexto.
- Tiene una superficie de ataque amplia por su lenguaje de configuración complejo, plugins cargables (LDAP, etc.) y coincidencia de nombres de host.
- El mayor problema es que sea un binario SUID. Es invocado por código sin privilegios y hereda un contexto de ejecución controlado por ese código sin privilegios (variables de entorno, propiedades de planificación de procesos, asignación de cgroups, contexto de seguridad, descriptores de archivo pasados, etc.). Los binarios SUID deben sanear todo eso con muchísimo cuidado, pero muchas veces no lo hacen bien.
Además
- Con run0 se pueden ejecutar no solo shells, sino también otros comandos con privilegios de root. Cuando el programa termina, el color de la terminal vuelve a su estado original.
- El cambio automático del color de fondo puede resultar incómodo, pero puede modificarse o desactivarse con el switch
--background=.
- Parece posible reemplazar por completo sudo con run0, aunque cada distribución puede tener preferencias distintas.
- El enfoque de plugins de sudo, incluido el soporte para LDAP, tiene muchos problemas. polkit puede ampliarse de una forma gestionada con seguridad dentro de systemd.
- Si un script de bash se está ejecutando con run0 puede comprobarse mediante las variables de entorno
SUDO_xxx, compatibles con sudo.
Opinión de GN⁺
- Resulta llamativo que se presente run0 como alternativa a sudo, una herramienta tan usada. Parece conservar las ventajas de sudo evitando a la vez los riesgos de SUID.
- Indicar visualmente de forma clara si hay elevación de privilegios puede ayudar a reducir daños por errores. Cambiar el color de fondo de la terminal podría molestar a algunas personas, pero como puede ajustarse por opción, no parece un gran problema.
- La configuración de permisos mediante polkit puede ser menos flexible que sudo, pero justamente eso podría simplificar el sistema y reducir la superficie de ataque. Parece importante documentar bien ejemplos de configuración de polkit.
- Para migrar scripts existentes y otros entornos que dependen de sudo, probablemente durante un tiempo siga siendo necesario ofrecer sudo junto con run0. Pero en entornos nuevos, sería preferible usar run0 desde el principio.
- A largo plazo, sería deseable que la adopción de run0 sirva como impulso para eliminar SUID de forma decidida y avanzar hacia una arquitectura donde los privilegios del sistema se administren de manera centralizada desde los servicios del sistema. Parece una dirección positiva en términos de seguridad y robustez.
1 comentarios
Opiniones de Hacker News
sudo, run0 invoca el comando objetivo en un contexto de ejecución aislado, recién bifurcado desde PID 1, sin heredar ningún contexto del cliente. Esto no encaja con los casos de uso habituales de los comandos de shell, así que en la práctica causará problemas y será difícil que se adopte ampliamente.sudo, y la gente terminaría usando siempre esa bandera. Cuando eso cause problemas, el proyecto systemd podría intentar eliminarsudo.sudoal tener límites estrictos de IPC entre niveles de privilegio. Para quienes quieren usar systemd, podría ser un buen método.sudoes mantenido en su mayor parte por una sola persona.sshque asudo. Se podría implementar una herramienta similar conectándose por SSH a localhost.sudoedit.sudoescritas en Rust que son memory-safe y tienen menos bugs.