hacktricks/linux-hardening/privilege-escalation/docker-security/namespaces/ipc-namespace.md
2023-06-03 01:46:23 +00:00

8.9 KiB

Espacio de nombres IPC

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Información básica

Un espacio de nombres IPC (Inter-Process Communication) es una característica del kernel de Linux que proporciona aislamiento de objetos IPC de System V, como colas de mensajes, segmentos de memoria compartida y semáforos. Este aislamiento asegura que los procesos en diferentes espacios de nombres IPC no puedan acceder o modificar directamente los objetos IPC de otros procesos, proporcionando una capa adicional de seguridad y privacidad entre grupos de procesos.

Cómo funciona:

  1. Cuando se crea un nuevo espacio de nombres IPC, comienza con un conjunto completamente aislado de objetos IPC de System V. Esto significa que los procesos que se ejecutan en el nuevo espacio de nombres IPC no pueden acceder o interferir con los objetos IPC en otros espacios de nombres o en el sistema host por defecto.
  2. Los objetos IPC creados dentro de un espacio de nombres son visibles y accesibles solo para los procesos dentro de ese espacio de nombres. Cada objeto IPC se identifica por una clave única dentro de su espacio de nombres. Aunque la clave puede ser idéntica en diferentes espacios de nombres, los objetos en sí están aislados y no se pueden acceder a través de espacios de nombres.
  3. Los procesos pueden moverse entre espacios de nombres utilizando la llamada al sistema setns() o crear nuevos espacios de nombres utilizando las llamadas al sistema unshare() o clone() con la bandera CLONE_NEWIPC. Cuando un proceso se mueve a un nuevo espacio de nombres o crea uno, comenzará a utilizar los objetos IPC asociados con ese espacio de nombres.

Laboratorio:

Crear diferentes espacios de nombres

CLI

sudo unshare -i [--mount-proc] /bin/bash

Al montar una nueva instancia del sistema de archivos /proc utilizando el parámetro --mount-proc, se asegura de que el nuevo espacio de nombres de montaje tenga una vista precisa y aislada de la información de proceso específica de ese espacio de nombres.

Error: bash: fork: Cannot allocate memory

Si ejecutas la línea anterior sin -f, obtendrás ese error.
El error es causado por el proceso PID 1 que sale en el nuevo espacio de nombres.

Después de que bash comience a ejecutarse, bifurcará varios nuevos subprocesos para hacer algunas cosas. Si ejecutas unshare sin -f, bash tendrá el mismo PID que el proceso "unshare" actual. El proceso "unshare" actual llama al sistema de llamadas unshare, crea un nuevo espacio de nombres de PID, pero el proceso "unshare" actual no está en el nuevo espacio de nombres de PID. Es el comportamiento deseado del kernel de Linux: el proceso A crea un nuevo espacio de nombres, el proceso A en sí mismo no se colocará en el nuevo espacio de nombres, solo los subprocesos del proceso A se colocarán en el nuevo espacio de nombres. Entonces, cuando ejecutas:

unshare -p /bin/bash

El proceso unshare ejecutará /bin/bash, y /bin/bash bifurcará varios subprocesos, el primer subproceso de bash se convertirá en PID 1 del nuevo espacio de nombres, y el subproceso saldrá después de completar su trabajo. Por lo tanto, el PID 1 del nuevo espacio de nombres sale.

El proceso PID 1 tiene una función especial: debe convertirse en el proceso padre de todos los procesos huérfanos. Si el proceso PID 1 en el espacio de nombres raíz sale, el kernel entrará en pánico. Si el proceso PID 1 en un subespacio de nombres sale, el kernel de Linux llamará a la función disable_pid_allocation, que limpiará la bandera PIDNS_HASH_ADDING en ese espacio de nombres. Cuando el kernel de Linux crea un nuevo proceso, llama a la función alloc_pid para asignar un PID en un espacio de nombres, y si la bandera PIDNS_HASH_ADDING no está establecida, la función alloc_pid devolverá un error -ENOMEM. Es por eso que aparece el error "Cannot allocate memory".

Puede resolver este problema utilizando la opción '-f':

unshare -fp /bin/bash

Si ejecutas unshare con la opción '-f', unshare bifurcará un nuevo proceso después de crear el nuevo espacio de nombres pid. Y ejecutará /bin/bash en el nuevo proceso. El nuevo proceso será el pid 1 del nuevo espacio de nombres pid. Luego, bash también bifurcará varios subprocesos para realizar algunas tareas. Como bash en sí mismo es el pid 1 del nuevo espacio de nombres pid, sus subprocesos pueden salir sin ningún problema.

Copiado de https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory

Docker

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

Verificar en qué espacio de nombres está su proceso

ls -l /proc/self/ns/ipc
lrwxrwxrwx 1 root root 0 Apr  4 20:37 /proc/self/ns/ipc -> 'ipc:[4026531839]'

Encontrar todos los espacios de nombres IPC

{% code overflow="wrap" %}

sudo find /proc -maxdepth 3 -type l -name ipc -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name ipc -exec ls -l  {} \; 2>/dev/null | grep <ns-number>

{% endcode %}

Entrar dentro de un namespace IPC

nsenter -i TARGET_PID --pid /bin/bash

También, solo puedes entrar en el espacio de nombres de otro proceso si eres root. Y no puedes entrar en otro espacio de nombres sin un descriptor que apunte a él (como /proc/self/ns/net).

Crear objeto IPC

# Container
sudo unshare -i /bin/bash
ipcmk -M 100
Shared memory id: 0
ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x2fba9021 0          root       644        100        0    

# From the host
ipcs -m # Nothing is seen
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥