PID Namespace

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Informaci贸n B谩sica

El namespace PID (Identificador de Proceso) es una caracter铆stica en el n煤cleo de Linux que proporciona aislamiento de procesos al permitir que un grupo de procesos tenga su propio conjunto de PIDs 煤nicos, separado de los PIDs en otros namespaces. Esto es particularmente 煤til en la contenedorizaci贸n, donde el aislamiento de procesos es esencial para la seguridad y la gesti贸n de recursos.

Cuando se crea un nuevo namespace PID, el primer proceso en ese namespace se le asigna el PID 1. Este proceso se convierte en el proceso "init" del nuevo namespace y es responsable de gestionar otros procesos dentro del namespace. Cada proceso subsiguiente creado dentro del namespace tendr谩 un PID 煤nico dentro de ese namespace, y estos PIDs ser谩n independientes de los PIDs en otros namespaces.

Desde la perspectiva de un proceso dentro de un namespace PID, solo puede ver otros procesos en el mismo namespace. No es consciente de los procesos en otros namespaces y no puede interactuar con ellos utilizando herramientas tradicionales de gesti贸n de procesos (por ejemplo, kill, wait, etc.). Esto proporciona un nivel de aislamiento que ayuda a prevenir que los procesos interfieran entre s铆.

C贸mo funciona:

  1. Cuando se crea un nuevo proceso (por ejemplo, utilizando la llamada al sistema clone()), el proceso puede ser asignado a un nuevo namespace PID o a uno existente. Si se crea un nuevo namespace, el proceso se convierte en el proceso "init" de ese namespace.
  2. El n煤cleo mantiene un mapeo entre los PIDs en el nuevo namespace y los PIDs correspondientes en el namespace padre (es decir, el namespace del cual se cre贸 el nuevo namespace). Este mapeo permite que el n煤cleo traduzca PIDs cuando sea necesario, como al enviar se帽ales entre procesos en diferentes namespaces.
  3. Los procesos dentro de un namespace PID solo pueden ver e interactuar con otros procesos en el mismo namespace. No son conscientes de los procesos en otros namespaces, y sus PIDs son 煤nicos dentro de su namespace.
  4. Cuando un namespace PID es destruido (por ejemplo, cuando el proceso "init" del namespace sale), todos los procesos dentro de ese namespace son terminados. Esto asegura que todos los recursos asociados con el namespace se limpien adecuadamente.

Laboratorio:

Crear diferentes Namespaces

CLI

bash
sudo unshare -pf --mount-proc /bin/bash
Error: bash: fork: Cannot allocate memory

Cuando se ejecuta unshare sin la opci贸n -f, se encuentra un error debido a la forma en que Linux maneja los nuevos namespaces de PID (ID de Proceso). Los detalles clave y la soluci贸n se describen a continuaci贸n:

  1. Explicaci贸n del Problema:
  • El n煤cleo de Linux permite que un proceso cree nuevos namespaces utilizando la llamada al sistema unshare. Sin embargo, el proceso que inicia la creaci贸n de un nuevo namespace de PID (denominado el proceso "unshare") no entra en el nuevo namespace; solo lo hacen sus procesos hijos.
  • Ejecutar %unshare -p /bin/bash% inicia /bin/bash en el mismo proceso que unshare. En consecuencia, /bin/bash y sus procesos hijos est谩n en el namespace de PID original.
  • El primer proceso hijo de /bin/bash en el nuevo namespace se convierte en PID 1. Cuando este proceso sale, desencadena la limpieza del namespace si no hay otros procesos, ya que PID 1 tiene el papel especial de adoptar procesos hu茅rfanos. El n煤cleo de Linux deshabilitar谩 entonces la asignaci贸n de PID en ese namespace.
  1. Consecuencia:
  • La salida de PID 1 en un nuevo namespace lleva a la limpieza de la bandera PIDNS_HASH_ADDING. Esto resulta en que la funci贸n alloc_pid falla al intentar asignar un nuevo PID al crear un nuevo proceso, produciendo el error "Cannot allocate memory".
  1. Soluci贸n:
  • El problema se puede resolver utilizando la opci贸n -f con unshare. Esta opci贸n hace que unshare cree un nuevo proceso despu茅s de crear el nuevo namespace de PID.
  • Ejecutar %unshare -fp /bin/bash% asegura que el comando unshare mismo se convierta en PID 1 en el nuevo namespace. /bin/bash y sus procesos hijos est谩n entonces contenidos de manera segura dentro de este nuevo namespace, previniendo la salida prematura de PID 1 y permitiendo la asignaci贸n normal de PID.

Al asegurarse de que unshare se ejecute con la bandera -f, el nuevo namespace de PID se mantiene correctamente, permitiendo que /bin/bash y sus subprocesos operen sin encontrar el error de asignaci贸n de memoria.

Al montar una nueva instancia del sistema de archivos /proc si usas el par谩metro --mount-proc, aseguras que el nuevo namespace de montaje tenga una vista precisa y aislada de la informaci贸n del proceso espec铆fica para ese namespace.

Docker

bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash

Ver en qu茅 namespace est谩 tu proceso

bash
ls -l /proc/self/ns/pid
lrwxrwxrwx 1 root root 0 Apr  3 18:45 /proc/self/ns/pid -> 'pid:[4026532412]'

Encontrar todos los espacios de nombres PID

bash
sudo find /proc -maxdepth 3 -type l -name pid -exec readlink {} \; 2>/dev/null | sort -u

Tenga en cuenta que el usuario root del espacio de nombres PID inicial (predeterminado) puede ver todos los procesos, incluso los que est谩n en nuevos espacios de nombres PID, por eso podemos ver todos los espacios de nombres PID.

Entrar dentro de un espacio de nombres PID

bash
nsenter -t TARGET_PID --pid /bin/bash

Cuando entras dentro de un namespace PID desde el namespace por defecto, a煤n podr谩s ver todos los procesos. Y el proceso de ese namespace PID podr谩 ver el nuevo bash en el namespace PID.

Adem谩s, solo puedes entrar en otro namespace PID de proceso si eres root. Y no puedes entrar en otro namespace sin un descriptor que apunte a 茅l (como /proc/self/ns/pid)

Referencias

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks