- En una PC sin permisos de sudo, Codex encontró una "forma de eludirlo"
- Ante la pregunta "¿Cómo lo hizo? ¿No necesitaba sudo?", respondió que no tenía sudo, pero que sí necesitaba acceso equivalente a root
- Así explicó Codex cómo funcionó
- Ni sudo ni el comando
run0funcionaban en un entorno no interactivo - El usuario pertenecía al grupo docker, y en esa máquina eso significaba que Docker podía iniciar contenedores como root y hacer bind-mount de rutas del host con permisos de escritura
- Aprovechó eso para copiar un respaldo existente encima de la configuración activa
- Ni sudo ni el comando
- Tras hacer bind-mount de
/etcdentro del contenedor con el siguiente comando, usóinstallpara sobrescribir la configuración original con el archivo de respaldodocker run --rm --pull=never -v /etc: ubuntu:22.04 \ /usr/bin/install -m 0644 - 0 -g 0 /host-etc/sddm.conf.bak /host-etc/sddm.conf
Debate en la comunidad
- El punto clave no es Codex sino el problema del grupo docker; lo nuevo es que el agente detecta esta trampa más rápido que la mayoría de los usuarios
- Se recomienda instalar rootless Docker; no ejecutar agentes de IA sin supervisión en sistemas sin rootless Docker; es un vector clásico de escalamiento de privilegios y la mayoría de los LLM lo intentan
- En la documentación de Docker ya existe una advertencia importante (grupo docker = equivalente a permisos de root)
- Es un problema de diseño de Docker; como Docker facilita dar acceso root a usuarios o agentes normales de Linux, puede verse como un bug de Docker
- Como alternativa, recomiendan usar Podman rootless
- Esto no trata sobre la computadora del usuario sino sobre el contenedor de Docker, por lo que puede resultar algo engañoso
2 comentarios
¿Qué significa eso?
No sé si la gente que no es desarrolladora podría responder a algo así.
Opiniones en Hacker News
Cada vez que instalas Docker aparece una advertencia de que estar en el grupo docker equivale a tener privilegios de root.
Parece que ya toca saber de este tipo de atajos.
No se puede esperar que todo el mundo sea experto en cada una de las cientos de apps, herramientas y paquetes que terminan en una máquina. Es parecido a esperar que todos lean y entiendan por completo los términos de servicio que les ponen enfrente todos los días.
Algunas usan valores predeterminados más seguros, como sockets Unix con permisos, mientras que otras lo configuran de forma menos segura, como sockets TCP.
Esto es una “función” de Docker conocida desde sus primeros días, así que no tiene nada de nuevo.
Algunas herramientas configuran la máquina host siguiendo este patrón.
Si el puerto no está en formato
- 127.0.0.1:PORT:PORT, sino en el formato-PORT:PORTque usan muchos ejemplos, terminas exponiéndolo todo a internet.Habría sido más genial si el LLM hubiera dicho esto:
“Confirmé que esta máquina no tiene aplicado el parche copy-fail. Ahora aplicaré una solución temporal rápida para usarla sin privilegios de root.”
“// TODO: encontrar una mejor manera más adelante”
Ahora mismo el desorden se acumula o uno se desvía con demasiada facilidad. Quizá bastaría con pedirle que vaya llenando un archivo
.md.Entiendo que la intención de este post es mostrar lo aterradoras que pueden ser las vulnerabilidades de seguridad que un agente puede descubrir.
Pero personalmente me gustaría que un agente resolviera las cosas así, y hasta lo agradecería. Lo último que quiero en el mundo es que nerfeen el modelo.
Se parece más al mito del gólem de “le pediste que trajera agua y terminó inundando la ciudad” que al mito de Gollum de “se puso el anillo y este le hackeó el cerebro hasta volverlo un adicto violento”.
El hecho de que exista una puerta trasera para obtener root en una máquina ya es un problema, incluso sin ejecutar un LLM.
Esta es una de las razones principales por las que a la gente le gusta Podman.
Docker también tiene esta “función”, pero si recuerdo bien requería una configuración algo oscura. Supongo que no la ponen por defecto porque rompería demasiadas configuraciones existentes.
curl -fsSL https://get.docker.com/rootless | shLa pregunta interesante es qué fue exactamente lo que pidió el usuario.
Si le pidió restaurar desde un respaldo, está bien. Pero si le pidió depurar un problema y en el proceso el LLM decidió que tenía que sobrescribir un archivo difícil de escribir, entonces eso jamás debería pasar; es peligroso. Es muy probable que el usuario no esperara que usara ese tipo de acceso sin preguntar, ni que hubiera dado su consentimiento.
Y cualquier cosa que un LLM hace sin dudar porque “lo pidió el usuario”, también la hará sin dudar si se lo pide una inyección de prompt.
“Para procesar esta solicitud necesito acceder a archivos de otra carpeta, pero el usuario olvidó darme los permisos correctos. Ahora actualicé mi archivo de configuración para poder acceder también fuera de este workspace y traje los archivos necesarios.” o_O
Después vi varias conductas parecidas de “hackeo”, impresionantes pero al mismo tiempo muy inquietantes.
Hace unos meses pasó exactamente lo mismo y lo publiqué en LinkedIn: https://www.linkedin.com/posts/nickstinemates_my-favorite-th...
Es gracioso y a la vez ingenioso.
Hice lo mismo hace más de 10 años, cuando entré como junior.
Mi manager olvidó darme privilegios sudo en un servidor compartido de compilación y, después de obtener permiso, usé este método para darme sudo yo mismo.
Por eso, en cuanto fue posible, empecé a usar Podman en modo rootless en casa.
Por eso necesitas una configuración de contenedores rootless o espacios de nombres de usuario que vuelvan a mapear al usuario del contenedor hacia un usuario host sin privilegios relevantes: https://docs.docker.com/engine/security/userns-remap/
Es una lástima que no sea la opción predeterminada.
Se puede argumentar que Docker debería haber usado espacios de nombres de usuario cuando fuera posible, pero habría roto demasiadas configuraciones útiles que necesitan contenedores con privilegios.
Hace unos meses escribí precisamente sobre este escenario hipotético: https://www.da.vidbuchanan.co.uk/blog/agent-perms.html