User Namespace
Reading time: 7 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.
Basic Information
User namespace je funkcija Linux jezgra koja omogućava izolaciju mapa korisničkih i grupnih ID-ova, omogućavajući svakoj korisničkoj imenskoj oblasti da ima svoj set korisničkih i grupnih ID-ova. Ova izolacija omogućava procesima koji se izvršavaju u različitim korisničkim imenskim oblastima da imaju različite privilegije i vlasništvo, čak i ako dele iste korisničke i grupne ID-ove numerički.
Korisničke imenske oblasti su posebno korisne u kontejnerizaciji, gde svaki kontejner treba da ima svoj nezavistan set korisničkih i grupnih ID-ova, omogućavajući bolju sigurnost i izolaciju između kontejnera i host sistema.
Kako to funkcioniše:
- Kada se kreira nova korisnička imenska oblast, ona počinje sa praznim setom mapa korisničkih i grupnih ID-ova. To znači da bilo koji proces koji se izvršava u novoj korisničkoj imenskoj oblasti prvobitno neće imati privilegije van imenske oblasti.
- Mape ID-ova mogu biti uspostavljene između korisničkih i grupnih ID-ova u novoj imenskoj oblasti i onih u roditeljskoj (ili host) imenskoj oblasti. To omogućava procesima u novoj imenskoj oblasti da imaju privilegije i vlasništvo koja odgovaraju korisničkim i grupnim ID-ovima u roditeljskoj imenskoj oblasti. Međutim, mape ID-ova mogu biti ograničene na specifične opsege i podskupove ID-ova, omogućavajući preciznu kontrolu nad privilegijama dodeljenim procesima u novoj imenskoj oblasti.
- Unutar korisničke imenske oblasti, procesi mogu imati pune root privilegije (UID 0) za operacije unutar imenske oblasti, dok i dalje imaju ograničene privilegije van imenske oblasti. To omogućava kontejnerima da rade sa root-sličnim sposobnostima unutar svoje imenske oblasti bez punih root privilegija na host sistemu.
- Procesi mogu prelaziti između imenskih oblasti koristeći
setns()
sistemski poziv ili kreirati nove imenske oblasti koristećiunshare()
iliclone()
sistemske pozive saCLONE_NEWUSER
flagom. Kada proces pređe u novu imensku oblast ili kreira jednu, počeće da koristi mape korisničkih i grupnih ID-ova povezane sa tom imenskom oblasti.
Lab:
Create different Namespaces
CLI
sudo unshare -U [--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 alocira memoriju
Kada se unshare
izvrši bez opcije -f
, dolazi do greške zbog načina na koji Linux upravlja novim PID (Process ID) 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 procesa. Linux kernel će tada onemogućiti alokaciju 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 alocira novi PID prilikom kreiranja novog procesa, što proizvodi grešku "Ne može da alocira 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 alokaciju 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 alokaciji memorije.
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
Da biste koristili korisnički prostor, Docker demon treba da se pokrene sa --userns-remap=default
(U ubuntu 14.04, to se može uraditi modifikovanjem /etc/default/docker
i zatim izvršavanjem sudo service docker restart
)
Proverite u kojem je prostoru vaš proces
ls -l /proc/self/ns/user
lrwxrwxrwx 1 root root 0 Apr 4 20:57 /proc/self/ns/user -> 'user:[4026531837]'
Moguće je proveriti mapu korisnika iz docker kontejnera sa:
cat /proc/self/uid_map
0 0 4294967295 --> Root is root in host
0 231072 65536 --> Root is 231072 userid in host
Ili sa hosta sa:
cat /proc/<pid>/uid_map
Pronađi sve korisničke imenske prostore
sudo find /proc -maxdepth 3 -type l -name user -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name user -exec ls -l {} \; 2>/dev/null | grep <ns-number>
Uđite unutar User namespace-a
nsenter -U TARGET_PID --pid /bin/bash
Takođe, možete ući u drugi procesni prostor samo ako ste root. I ne možete ući u drugi prostor bez deskriptora koji na njega ukazuje (kao što je /proc/self/ns/user
).
Kreirajte novi korisnički prostor (sa mapiranjima)
unshare -U [--map-user=<uid>|<name>] [--map-group=<gid>|<name>] [--map-root-user] [--map-current-user]
# Container
sudo unshare -U /bin/bash
nobody@ip-172-31-28-169:/home/ubuntu$ #Check how the user is nobody
# From the host
ps -ef | grep bash # The user inside the host is still root, not nobody
root 27756 27755 0 21:11 pts/10 00:00:00 /bin/bash
Oporavak sposobnosti
U slučaju korisničkih prostora, kada se kreira novi korisnički prostor, procesu koji ulazi u prostor dodeljuje se potpuni skup sposobnosti unutar tog prostora. Ove sposobnosti omogućavaju procesu da izvršava privilegovane operacije kao što su montiranje fajl sistema, kreiranje uređaja ili menjanje vlasništva nad fajlovima, ali samo u okviru svog korisničkog prostora.
Na primer, kada imate CAP_SYS_ADMIN
sposobnost unutar korisničkog prostora, možete izvršavati operacije koje obično zahtevaju ovu sposobnost, poput montiranja fajl sistema, ali samo u okviru vašeg korisničkog prostora. Sve operacije koje izvršavate sa ovom sposobnošću neće uticati na host sistem ili druge prostore.
warning
Stoga, čak i ako dobijanje novog procesa unutar novog korisničkog prostora će vam vratiti sve sposobnosti (CapEff: 000001ffffffffff), zapravo možete koristiti samo one koje se odnose na prostor (montiranje na primer) ali ne svaku. Dakle, ovo samo po sebi nije dovoljno da pobegnete iz Docker kontejnera.
# There are the syscalls that are filtered after changing User namespace with:
unshare -UmCpf bash
Probando: 0x067 . . . Error
Probando: 0x070 . . . Error
Probando: 0x074 . . . Error
Probando: 0x09b . . . Error
Probando: 0x0a3 . . . Error
Probando: 0x0a4 . . . Error
Probando: 0x0a7 . . . Error
Probando: 0x0a8 . . . Error
Probando: 0x0aa . . . Error
Probando: 0x0ab . . . Error
Probando: 0x0af . . . Error
Probando: 0x0b0 . . . Error
Probando: 0x0f6 . . . Error
Probando: 0x12c . . . Error
Probando: 0x130 . . . Error
Probando: 0x139 . . . Error
Probando: 0x140 . . . Error
Probando: 0x141 . . . Error
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.