PID ๋ค์์คํ์ด์ค
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
๊ธฐ๋ณธ ์ ๋ณด
PID (ํ๋ก์ธ์ค ์๋ณ์) ๋ค์์คํ์ด์ค๋ Linux ์ปค๋์ ๊ธฐ๋ฅ์ผ๋ก, ํ๋ก์ธ์ค ๊ทธ๋ฃน์ด ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ PID์ ๋ถ๋ฆฌ๋ ๊ณ ์ ํ PID ์งํฉ์ ๊ฐ์ง๋๋ก ํ์ฌ ํ๋ก์ธ์ค ๊ฒฉ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ ํ๋ก์ธ์ค ๊ฒฉ๋ฆฌ๊ฐ ๋ณด์๊ณผ ์์ ๊ด๋ฆฌ์ ํ์์ ์ธ ์ปจํ ์ด๋ํ์์ ํนํ ์ ์ฉํฉ๋๋ค.
์ PID ๋ค์์คํ์ด์ค๊ฐ ์์ฑ๋๋ฉด, ํด๋น ๋ค์์คํ์ด์ค์ ์ฒซ ๋ฒ์งธ ํ๋ก์ธ์ค์ PID 1์ด ํ ๋น๋ฉ๋๋ค. ์ด ํ๋ก์ธ์ค๋ ์ ๋ค์์คํ์ด์ค์ โinitโ ํ๋ก์ธ์ค๊ฐ ๋์ด ๋ค์์คํ์ด์ค ๋ด์ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ค์ ๊ด๋ฆฌํ ์ฑ ์์ด ์์ต๋๋ค. ๋ค์์คํ์ด์ค ๋ด์์ ์์ฑ๋๋ ์ดํ์ ๊ฐ ํ๋ก์ธ์ค๋ ํด๋น ๋ค์์คํ์ด์ค ๋ด์์ ๊ณ ์ ํ PID๋ฅผ ๊ฐ์ง๋ฉฐ, ์ด PID๋ค์ ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ PID์ ๋ ๋ฆฝ์ ์ ๋๋ค.
PID ๋ค์์คํ์ด์ค ๋ด์ ํ๋ก์ธ์ค ๊ด์ ์์๋ ๊ฐ์ ๋ค์์คํ์ด์ค์ ์๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ง ๋ณผ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ ํ๋ก์ธ์ค๋ ์ธ์ํ์ง ๋ชปํ๋ฉฐ, ์ ํต์ ์ธ ํ๋ก์ธ์ค ๊ด๋ฆฌ ๋๊ตฌ(์: kill, wait ๋ฑ)๋ฅผ ์ฌ์ฉํด ์ํธ์์ฉํ ์ ์์ต๋๋ค. ์ด๋ ํ๋ก์ธ์ค๋ค์ด ์๋ก ๊ฐ์ญํ์ง ๋ชปํ๋๋ก ๋๋ ์์ค์ ๊ฒฉ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋์ ๋ฐฉ์:
- ์ ํ๋ก์ธ์ค๊ฐ ์์ฑ๋ ๋(์:
clone()์์คํ ์ฝ์ ์ฌ์ฉํ์ฌ), ๊ทธ ํ๋ก์ธ์ค๋ ์ ๋๋ ๊ธฐ์กด PID ๋ค์์คํ์ด์ค์ ํ ๋น๋ ์ ์์ต๋๋ค. If a new namespace is created, the process becomes the โinitโ process of that namespace. - ์ปค๋์ ์ ๋ค์์คํ์ด์ค์ PID๋ค๊ณผ ๋ถ๋ชจ ๋ค์์คํ์ด์ค(์ฆ, ์ ๋ค์์คํ์ด์ค๊ฐ ์์ฑ๋ ๋ค์์คํ์ด์ค)์ ํด๋น PID๋ค ์ฌ์ด์ ๋งคํ์ ์ ์งํฉ๋๋ค. ์ด ๋งคํ์ ํ์ํ ๋ ์ปค๋์ด PID๋ฅผ ๋ณํํ ์ ์๊ฒ ํด์ค๋๋ค, ์๋ฅผ ๋ค์ด ์๋ก ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ ์๋ ํ๋ก์ธ์ค๋ค ๊ฐ์ ์ ํธ๋ฅผ ๋ณด๋ผ ๋์ฒ๋ผ.
- PID ๋ค์์คํ์ด์ค ๋ด์ ํ๋ก์ธ์ค๋ค์ ๋์ผํ ๋ค์์คํ์ด์ค์ ์๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ค๋ง ๋ณด๊ณ ์ํธ์์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ค์ ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ ํ๋ก์ธ์ค๋ฅผ ์ธ์ํ์ง ๋ชปํ๋ฉฐ, ๊ทธ๋ค์ PID๋ ์์ ์ ๋ค์์คํ์ด์ค ๋ด์์ ๊ณ ์ ํฉ๋๋ค.
- PID ๋ค์์คํ์ด์ค๊ฐ ํ๊ดด๋๋ฉด(์: ๋ค์์คํ์ด์ค์ โinitโ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ ๋), ํด๋น ๋ค์์คํ์ด์ค ๋ด์ ๋ชจ๋ ํ๋ก์ธ์ค๋ ์ข ๋ฃ๋ฉ๋๋ค. ์ด๋ ๋ค์์คํ์ด์ค์ ์ฐ๊ด๋ ๋ชจ๋ ์์์ด ์ ์ ํ ์ ๋ฆฌ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ค์ต:
์๋ก ๋ค๋ฅธ ๋ค์์คํ์ด์ค ์์ฑ
CLI
sudo unshare -pf --mount-proc /bin/bash
Error: bash: fork: Cannot allocate memory
unshare๋ฅผ -f ์ต์
์์ด ์คํํ๋ฉด, Linux๊ฐ ์๋ก์ด PID (Process ID) ๋ค์์คํ์ด์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฃผ์ ๋ด์ฉ๊ณผ ํด๊ฒฐ์ฑ
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Problem Explanation:
- Linux ์ปค๋์
unshare์์คํ ์ฝ์ ํตํด ํ๋ก์ธ์ค๊ฐ ์๋ก์ด ๋ค์์คํ์ด์ค๋ฅผ ์์ฑํ๋๋ก ํ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๋ก์ด PID ๋ค์์คํ์ด์ค ์์ฑ์ ์์ํ ํ๋ก์ธ์ค(์ผ๋ช โunshareโ ํ๋ก์ธ์ค)๋ ์ ๋ค์์คํ์ด์ค๋ก ๋ค์ด๊ฐ์ง ์์ผ๋ฉฐ, ์ค์ง ๊ทธ ์์ ํ๋ก์ธ์ค๋ค๋ง ๋ค์ด๊ฐ๋๋ค. %unshare -p /bin/bash%๋ฅผ ์คํํ๋ฉด/bin/bash๊ฐunshare์ ๋์ผํ ํ๋ก์ธ์ค์์ ์์๋ฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก/bin/bash์ ๊ทธ ์์ ํ๋ก์ธ์ค๋ค์ ์๋์ PID ๋ค์์คํ์ด์ค์ ์๊ฒ ๋ฉ๋๋ค.- ์ ๋ค์์คํ์ด์ค์์
/bin/bash์ ์ฒซ ๋ฒ์งธ ์์ ํ๋ก์ธ์ค๊ฐ PID 1์ด ๋ฉ๋๋ค. ์ด ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃํ๋ฉด(๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์์ ๊ฒฝ์ฐ) ๋ค์์คํ์ด์ค ์ ๋ฆฌ๊ฐ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค. PID 1์ ๊ณ ์ ํ๋ก์ธ์ค๋ฅผ ์ ์(adopt)ํ๋ ํน๋ณํ ์ญํ ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด Linux ์ปค๋์ ํด๋น ๋ค์์คํ์ด์ค์์ PID ํ ๋น์ ๋นํ์ฑํํฉ๋๋ค.
- Consequence:
- ์ ๋ค์์คํ์ด์ค์์ PID 1์ด ์ข
๋ฃ๋๋ฉด
PIDNS_HASH_ADDINGํ๋๊ทธ๊ฐ ์ ๋ฆฌ๋ฉ๋๋ค. ์ด๋ก ์ธํด ์๋ก์ด ํ๋ก์ธ์ค ์์ฑ ์alloc_pidํจ์๊ฐ ์๋ก์ด PID๋ฅผ ํ ๋นํ์ง ๋ชปํ์ฌ โCannot allocate memoryโ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
- Solution:
- ์ด ๋ฌธ์ ๋
unshare์-f์ต์ ์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ด ์ต์ ์ ์๋ก์ด PID ๋ค์์คํ์ด์ค๋ฅผ ์์ฑํ ํunshare๊ฐ ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ fork ํ๋๋ก ํฉ๋๋ค. %unshare -fp /bin/bash%๋ฅผ ์คํํ๋ฉดunshare๋ช ๋ น ์์ฒด๊ฐ ์ ๋ค์์คํ์ด์ค์์ PID 1์ด ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด/bin/bash์ ๊ทธ ์์ ํ๋ก์ธ์ค๋ค์ ์์ ํ๊ฒ ์ด ์ ๋ค์์คํ์ด์ค ์์ ํฌํจ๋์ด PID 1์ ์กฐ๊ธฐ ์ข ๋ฃ๋ฅผ ๋ฐฉ์งํ๊ณ ์ ์์ ์ธ PID ํ ๋น์ด ๊ฐ๋ฅํด์ง๋๋ค.
unshare๋ฅผ -f ํ๋๊ทธ์ ํจ๊ป ์คํํ๋ฉด ์ PID ๋ค์์คํ์ด์ค๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ง๋์ด /bin/bash์ ๊ทธ ํ์ ํ๋ก์ธ์ค๋ค์ด ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ค๋ฅ ์์ด ์ ์์ ์ผ๋ก ๋์ํ ์ ์์ต๋๋ค.
--mount-proc ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด /proc ํ์ผ์์คํ
์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ง์ดํธํ๋ฉด, ์๋ก์ด ๋ง์ดํธ ๋ค์์คํ์ด์ค๊ฐ ๊ทธ ๋ค์์คํ์ด์ค์ ํน์ ํ ํ๋ก์ธ์ค ์ ๋ณด๋ฅผ ์ ํํ๊ณ ๊ฒฉ๋ฆฌ๋ ๋ทฐ๋ก ๋ณด๋๋ก ๋ณด์ฅํฉ๋๋ค.
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
ํ๋ก์ธ์ค๊ฐ ์ด๋ค ๋ค์์คํ์ด์ค์ ์๋์ง ํ์ธํ๊ธฐ
ls -l /proc/self/ns/pid
lrwxrwxrwx 1 root root 0 Apr 3 18:45 /proc/self/ns/pid -> 'pid:[4026532412]'
๋ชจ๋ PID ๋ค์์คํ์ด์ค ์ฐพ๊ธฐ
sudo find /proc -maxdepth 3 -type l -name pid -exec readlink {} \; 2>/dev/null | sort -u
Note that the root use from the initial (default) PID namespace can see all the processes, even the ones in new PID names paces, thats why we can see all the PID namespaces.
Enter inside a PID namespace
nsenter -t TARGET_PID --pid /bin/bash
When you enter inside a PID namespace from the default namespace, you will still be able to see all the processes. And the process from that PID ns will be able to see the new bash on the PID ns.
Also, you can only enter in another process PID namespace if you are root. And you cannot enter in other namespace without a descriptor pointing to it (like /proc/self/ns/pid)
์ต๊ทผ ์ ์ฉ ๋ ธํธ
CVE-2025-31133: maskedPaths๋ฅผ ์
์ฉํด ํธ์คํธ PIDs์ ์ ๊ทผํ๊ธฐ
runc โค1.2.7์ ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ runc exec ์ํฌ๋ก๋๋ฅผ ์ ์ดํ๋ ๊ณต๊ฒฉ์๊ฐ ๋ฐํ์์ด ๋ฏผ๊ฐํ procfs ํญ๋ชฉ๋ค์ maskedํ๊ธฐ ์ง์ ์ ์ปจํ
์ด๋ ์ธก /dev/null์ ๊ต์ฒดํ ์ ์๋๋ก ํ์ฉํ์ต๋๋ค. ๊ฒฝ์ ์ํ(race)๊ฐ ์ฑ๊ณตํ๋ฉด /dev/null์ ์์์ ํธ์คํธ ๊ฒฝ๋ก(์: /proc/sys/kernel/core_pattern)๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ก ๋ฐ๊ฟ ์ ์์ผ๋ฏ๋ก, ์ ์ปจํ
์ด๋ PID namespace๋ ์์ ์ ๋ค์์คํ์ด์ค๋ฅผ ๋ฒ์ด๋์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ ํธ์คํธ ์ ์ญ procfs ์ ์ด ์ง์ ์ ๋ํ ์ฝ๊ธฐ/์ฐ๊ธฐ ์ ๊ทผ์ ๊ฐ์๊ธฐ ์์๋ฐ๊ฒ ๋ฉ๋๋ค. core_pattern ๋๋ /proc/sysrq-trigger๊ฐ ์ฐ๊ธฐ ๊ฐ๋ฅํด์ง๋ฉด, coredump๋ฅผ ์์ฑํ๊ฑฐ๋ SysRq๋ฅผ ํธ๋ฆฌ๊ฑฐํจ์ผ๋ก์จ ํธ์คํธ PID namespace์์ ์ฝ๋ ์คํ์ด๋ ์๋น์ค ๊ฑฐ๋ถ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ค์ ์ ์ฐจ:
- rootfs๊ฐ
/dev/null์ ์ํ๋ ํธ์คํธ ๊ฒฝ๋ก๋ฅผ ๊ฐ๋ฆฌํค๋ ๋งํฌ๋ก ๊ต์ฒด๋ OCI bundle์ ๋น๋ํฉ๋๋ค (ln -sf /proc/sys/kernel/core_pattern rootfs/dev/null). - ํจ์น ์ ์ฉ ์ด์ ์ ์ปจํ ์ด๋๋ฅผ ์์ํ์ฌ runc๊ฐ ๋งํฌ ์์ ํธ์คํธ procfs ๋์ ๊ฒฝ๋ก๋ฅผ bind-mount ํ๋๋ก ํฉ๋๋ค.
- ์ปจํ
์ด๋ ๋ค์์คํ์ด์ค ๋ด๋ถ์์ ์ด์ ๋
ธ์ถ๋ procfs ํ์ผ์ ์ฐ๊ธฐ(์:
core_pattern์ ๋ฆฌ๋ฒ์ค ์ ธ ํฌํผ๋ก ์ง์ )ํ๊ณ , ํธ์คํธ ์ปค๋์ด ํด๋น ํฌํผ๋ฅผ PID 1 ์ปจํ ์คํธ๋ก ์คํํ๋๋ก ์์์ ํ๋ก์ธ์ค๋ฅผ ํฌ๋์์ํต๋๋ค.
์ปจํ ์ด๋๋ฅผ ์์ํ๊ธฐ ์ ์ ๋ฒ๋ค์ด ์ฌ๋ฐ๋ฅธ ํ์ผ๋ค์ ๋ง์คํนํ๋์ง ๋น ๋ฅด๊ฒ ๊ฐ์ฌํ ์ ์์ต๋๋ค:
jq '.linux.maskedPaths' config.json | tr -d '"'
๋ฐํ์์ ๊ธฐ๋ํ ๋ง์คํน ํญ๋ชฉ์ด ์๊ฑฐ๋(/dev/null์ด ์ฌ๋ผ์ ธ์ ๊ฑด๋๋ธ ๊ฒฝ์ฐ), ์ปจํ
์ด๋๋ฅผ host PID visibility๋ฅผ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ผ.
Namespace injection with insject
NCC Groupโs insject๋ LD_PRELOAD payload๋ก ๋ก๋๋์ด ํ๊น ํ๋ก๊ทธ๋จ์ ํ๊ธฐ ๋จ๊ณ(๊ธฐ๋ณธ๊ฐ main)์ ํ
์ ๊ฑธ๊ณ execve() ์ดํ ์ผ๋ จ์ setns() ํธ์ถ์ ์ํํฉ๋๋ค. ์ด๋ฅผ ํตํด ํธ์คํธ(๋๋ ๋ค๋ฅธ ์ปจํ
์ด๋)์์ ํผํด์์ PID namespace์ ๋ฐํ์์ด ์ด๊ธฐํ๋ ํ์ attachํ ์ ์์ด, ์ปจํ
์ด๋ ํ์ผ์์คํ
์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ณต์ฌํ ํ์ ์์ด /proc/<pid> ๋ทฐ๋ฅผ ๋ณด์กดํ ์ ์์ต๋๋ค. ๋ํ insject๋ ํฌํฌํ ๋๊น์ง PID namespace์ ํฉ๋ฅํ๋ ๊ฒ์ ์ง์ฐ์ํฌ ์ ์๊ธฐ ๋๋ฌธ์, ํ๋์ ์ค๋ ๋๋ฅผ host namespace์ (CAP_SYS_PTRACE๋ฅผ ๊ฐ์ง ์ํ๋ก) ์ ์งํ๊ณ ๋ค๋ฅธ ์ค๋ ๋๊ฐ target PID namespace์์ ์คํ๋๊ฒ ํ์ฌ ๊ฐ๋ ฅํ ๋๋ฒ๊น
๋๋ offensive primitives๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์ฌ์ฉ ์:
sudo insject -S -p $(pidof containerd-shim) -- bash -lc 'readlink /proc/self/ns/pid && ps -ef'
namespace injection์ ์ ์ฉํ๊ฑฐ๋ ๋ฐฉ์ดํ ๋์ ์ฃผ์ ์์ :
- Use
-S/--strictto forceinsjectto abort if threads already exist or namespace joins fail, otherwise you may leave partly-migrated threads straddling host and container PID spaces. - Never attach tools that still hold writable host file descriptors unless you also join the mount namespaceโotherwise any process inside the PID namespace can ptrace your helper and reuse those descriptors to tamper with host resources.
์ฐธ์กฐ
- https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory
- container escape via โmasked pathโ abuse due to mount race conditions (GitHub Security Advisory)
- Tool Release โ insject: A Linux Namespace Injector (NCC Group)
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


