Hacktricks-skills ipc-namespace
How to work with Linux IPC (Inter-Process Communication) namespaces for security isolation and privilege escalation analysis. Use this skill whenever the user needs to understand IPC namespace isolation, create isolated IPC environments, inspect IPC objects across namespaces, or analyze IPC namespace configurations for security hardening. Make sure to use this skill when the user mentions IPC namespaces, shared memory isolation, System V IPC objects, process isolation, or namespace security.
git clone https://github.com/abelrguezr/hacktricks-skills
skills/linux-hardening/privilege-escalation/docker-security/namespaces/ipc-namespace/SKILL.MDIPC Namespace Security
This skill helps you work with Linux IPC (Inter-Process Communication) namespaces to understand isolation boundaries, create secure IPC environments, and analyze namespace configurations for security hardening.
What IPC Namespaces Do
IPC namespaces provide isolation of System V IPC objects (message queues, shared memory segments, semaphores). Processes in different IPC namespaces cannot directly access each other's IPC objects, adding a security layer between process groups.
Key behaviors:
- Complete isolation: New IPC namespaces start with isolated System V IPC objects
- Namespace-local visibility: IPC objects are only visible to processes within the same namespace
- Unique keys per namespace: Same key values in different namespaces refer to different objects
Common Operations
Check your current IPC namespace
ls -l /proc/self/ns/ipc # Output: ipc:[4026531839]
The number in brackets is your namespace identifier. Compare this across processes to see if they share the same IPC namespace.
Find all IPC namespaces on the system
sudo find /proc -maxdepth 3 -type l -name ipc -exec readlink {} \; 2>/dev/null | sort -u
This lists all unique IPC namespace IDs currently in use.
Find processes in a specific namespace
sudo find /proc -maxdepth 3 -type l -name ipc -exec ls -l {} \; 2>/dev/null | grep <ns-number>
Replace
<ns-number> with the namespace ID you want to investigate.
Create an isolated IPC namespace
# Basic isolation sudo unshare -i /bin/bash # With isolated /proc view (recommended for debugging) sudo unshare -i --mount-proc /bin/bash # Force fork to avoid PID namespace issues sudo unshare -fi /bin/bash
Why
matters: Mounting a new --mount-proc
/proc instance gives you an accurate view of processes specific to that namespace, not the host's process tree.
Why
matters: The -f
-f flag forces unshare to fork, preventing "Cannot allocate memory" errors when PID namespaces are involved. Without it, the namespace may be cleaned up prematurely.
Enter an existing IPC namespace
nsenter -i TARGET_PID --pid /bin/bash
Requirements:
- You must be root (or have appropriate capabilities)
- You need a descriptor to the namespace (like
)/proc/<pid>/ns/ipc
Create and verify IPC objects
# Inside isolated namespace sudo unshare -i /bin/bash ipcmk -M 100 ipcs -m # From host (should see nothing) ipcs -m
This demonstrates isolation: shared memory created in the namespace is invisible from the host.
Security Analysis Patterns
Verify container isolation
When auditing containers or isolated environments:
-
Check if the container has its own IPC namespace:
ls -l /proc/self/ns/ipc -
Compare with host namespace:
# From host ls -l /proc/1/ns/ipc -
If IDs match, the container shares the host's IPC namespace (potential security issue)
Detect namespace escape opportunities
If you can
nsenter into another namespace, you may be able to:
- Access IPC objects from other processes
- Create shared memory that other processes can see
- Potentially escalate privileges if namespace boundaries are misconfigured
Docker IPC namespace behavior
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
By default, Docker containers get their own IPC namespace. Verify with:
ls -l /proc/self/ns/ipc
Troubleshooting
"Cannot allocate memory" error
Cause: PID namespace cleanup when PID 1 exits prematurely.
Solution: Use
-f flag:
sudo unshare -fi /bin/bash
Cannot enter namespace
Cause: Missing root privileges or no namespace descriptor.
Solution:
- Ensure you're root or have
CAP_SYS_ADMIN - Use a valid namespace path like
/proc/<pid>/ns/ipc