CGroup Namespace
Reading time: 5 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
Cgroup namespace je funkcija Linux jezgra koja pruža izolaciju cgroup hijerarhija za procese koji se izvršavaju unutar namespace-a. Cgroups, skraćeno za kontrolne grupe, su funkcija jezgra koja omogućava organizovanje procesa u hijerarhijske grupe radi upravljanja i sprovođenja ograničenja na sistemske resurse kao što su CPU, memorija i I/O.
Iako cgroup namespace-i nisu poseban tip namespace-a kao što su drugi koje smo ranije diskutovali (PID, mount, network, itd.), oni su povezani sa konceptom izolacije namespace-a. Cgroup namespace-i virtualizuju pogled na cgroup hijerarhiju, tako da procesi koji se izvršavaju unutar cgroup namespace-a imaju drugačiji pogled na hijerarhiju u poređenju sa procesima koji se izvršavaju na hostu ili u drugim namespace-ima.
Kako to funkcioniše:
- Kada se kreira novi cgroup namespace, on počinje sa pogledom na cgroup hijerarhiju zasnovanom na cgroup-u procesa koji ga kreira. To znači da će procesi koji se izvršavaju u novom cgroup namespace-u videti samo podskup cele cgroup hijerarhije, ograničen na cgroup podstablo koje se oslanja na cgroup procesa koji ga kreira.
- Procesi unutar cgroup namespace-a će videti svoju vlastitu cgroup kao koren hijerarhije. To znači da, iz perspektive procesa unutar namespace-a, njihova vlastita cgroup se pojavljuje kao koren, i ne mogu videti ili pristupiti cgroup-ima van svog vlastitog podstabla.
- Cgroup namespace-i ne pružaju direktno izolaciju resursa; oni samo pružaju izolaciju pogleda na cgroup hijerarhiju. Kontrola i izolacija resursa se i dalje sprovode od strane cgroup pod sistema (npr., cpu, memorija, itd.) sami.
Za više informacija o CGroups proverite:
Laboratorija:
Kreirajte različite Namespace-e
CLI
sudo unshare -C [--mount-proc] /bin/bash
Montiranjem nove instance /proc
datotečnog sistema ako koristite parametar --mount-proc
, osiguravate da nova mount namespace ima tačan i izolovan prikaz informacija o procesima specifičnim za tu namespace.
Greška: bash: fork: Ne može da dodeli memoriju
Kada se unshare
izvrši bez opcije -f
, dolazi do greške zbog načina na koji Linux upravlja novim PID (ID procesa) namespace-ima. Ključni detalji i rešenje su navedeni u nastavku:
- Objašnjenje problema:
- Linux kernel omogućava procesu da kreira nove namespace-e koristeći
unshare
sistemski poziv. Međutim, proces koji inicira kreiranje novog PID namespace-a (poznat kao "unshare" proces) ne ulazi u novi namespace; samo njegovi podprocesi to čine. - Pokretanjem
%unshare -p /bin/bash%
pokreće se/bin/bash
u istom procesu kaounshare
. Kao rezultat,/bin/bash
i njegovi podprocesi su u originalnom PID namespace-u. - Prvi podproces
/bin/bash
u novom namespace-u postaje PID 1. Kada ovaj proces izađe, pokreće čišćenje namespace-a ako nema drugih procesa, jer PID 1 ima posebnu ulogu usvajanja siročadi. Linux kernel će tada onemogućiti dodelu PID-a u tom namespace-u.
- Posledica:
- Izlazak PID 1 u novom namespace-u dovodi do čišćenja
PIDNS_HASH_ADDING
oznake. To rezultira neuspehom funkcijealloc_pid
da dodeli novi PID prilikom kreiranja novog procesa, što proizvodi grešku "Ne može da dodeli memoriju".
- Rešenje:
- Problem se može rešiti korišćenjem opcije
-f
saunshare
. Ova opcija čini daunshare
fork-uje novi proces nakon kreiranja novog PID namespace-a. - Izvršavanje
%unshare -fp /bin/bash%
osigurava daunshare
komanda sama postane PID 1 u novom namespace-u./bin/bash
i njegovi podprocesi su tada sigurno sadržani unutar ovog novog namespace-a, sprečavajući prevremeni izlazak PID 1 i omogućavajući normalnu dodelu PID-a.
Osiguravanjem da unshare
radi sa -f
oznakom, novi PID namespace se ispravno održava, omogućavajući /bin/bash
i njegovim podprocesima da funkcionišu bez susretanja greške u dodeli memorije.
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
Proverite u kojem je namespace vaš proces
ls -l /proc/self/ns/cgroup
lrwxrwxrwx 1 root root 0 Apr 4 21:19 /proc/self/ns/cgroup -> 'cgroup:[4026531835]'
Pronađite sve CGroup imenske prostore
sudo find /proc -maxdepth 3 -type l -name cgroup -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name cgroup -exec ls -l {} \; 2>/dev/null | grep <ns-number>
Uđite unutar CGroup imenskog prostora
nsenter -C TARGET_PID --pid /bin/bash
Takođe, možete ući u drugi procesni prostor imena samo ako ste root. I ne možete ući u drugo ime prostora bez deskriptora koji na njega ukazuje (kao što je /proc/self/ns/cgroup
).
References
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.