User Namespace
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Un espacio de usuario es una característica del núcleo de Linux que proporciona aislamiento de las asignaciones de ID de usuario y grupo, permitiendo que cada espacio de usuario tenga su propio conjunto de IDs de usuario y grupo. Este aislamiento permite que los procesos que se ejecutan en diferentes espacios de usuario tengan diferentes privilegios y propiedad, incluso si comparten los mismos IDs de usuario y grupo numéricamente.
Los espacios de usuario son particularmente útiles en la contenedorización, donde cada contenedor debe tener su propio conjunto independiente de IDs de usuario y grupo, lo que permite una mejor seguridad y aislamiento entre los contenedores y el sistema host.
Cuando se crea un nuevo espacio de usuario, comienza con un conjunto vacío de asignaciones de ID de usuario y grupo. Esto significa que cualquier proceso que se ejecute en el nuevo espacio de usuario no tendrá inicialmente privilegios fuera del espacio.
Se pueden establecer asignaciones de ID entre los IDs de usuario y grupo en el nuevo espacio y aquellos en el espacio padre (o host). Esto permite que los procesos en el nuevo espacio tengan privilegios y propiedad correspondientes a los IDs de usuario y grupo en el espacio padre. Sin embargo, las asignaciones de ID pueden restringirse a rangos y subconjuntos específicos de IDs, lo que permite un control detallado sobre los privilegios otorgados a los procesos en el nuevo espacio.
Dentro de un espacio de usuario, los procesos pueden tener privilegios de root completos (UID 0) para operaciones dentro del espacio, mientras que aún tienen privilegios limitados fuera del espacio. Esto permite que los contenedores se ejecuten con capacidades similares a root dentro de su propio espacio sin tener privilegios de root completos en el sistema host.
Los procesos pueden moverse entre espacios utilizando la llamada al sistema setns()
o crear nuevos espacios utilizando las llamadas al sistema unshare()
o clone()
con la bandera CLONE_NEWUSER
. Cuando un proceso se mueve a un nuevo espacio o crea uno, comenzará a usar las asignaciones de ID de usuario y grupo asociadas con ese espacio.
Al montar una nueva instancia del sistema de archivos /proc
si usas el parámetro --mount-proc
, aseguras que el nuevo espacio de montaje tenga una vista precisa y aislada de la información del proceso específica de ese espacio de nombres.
Para usar el espacio de nombres de usuario, el daemon de Docker debe iniciarse con --userns-remap=default
(En ubuntu 14.04, esto se puede hacer modificando /etc/default/docker
y luego ejecutando sudo service docker restart
)
Es posible verificar el mapa de usuarios desde el contenedor de docker con:
O desde el host con:
También, solo puedes entrar en otro espacio de nombres de proceso si eres root. Y no puedes entrar en otro espacio de nombres sin un descriptor que apunte a él (como /proc/self/ns/user
).
En el caso de los espacios de nombres de usuario, cuando se crea un nuevo espacio de nombres de usuario, el proceso que entra en el espacio de nombres recibe un conjunto completo de capacidades dentro de ese espacio de nombres. Estas capacidades permiten al proceso realizar operaciones privilegiadas como montar sistemas de archivos, crear dispositivos o cambiar la propiedad de archivos, pero solo dentro del contexto de su espacio de nombres de usuario.
Por ejemplo, cuando tienes la capacidad CAP_SYS_ADMIN
dentro de un espacio de nombres de usuario, puedes realizar operaciones que normalmente requieren esta capacidad, como montar sistemas de archivos, pero solo dentro del contexto de tu espacio de nombres de usuario. Cualquier operación que realices con esta capacidad no afectará al sistema host ni a otros espacios de nombres.
Por lo tanto, incluso si obtener un nuevo proceso dentro de un nuevo espacio de nombres de usuario te dará todas las capacidades de vuelta (CapEff: 000001ffffffffff), en realidad solo puedes usar las relacionadas con el espacio de nombres (montar, por ejemplo) pero no todas. Así que, esto por sí solo no es suficiente para escapar de un contenedor Docker.
hacking tricks by submitting PRs to the** HackTricks and HackTricks Cloud github repos.
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)