CGroup Namespace

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Informazioni di base

Un namespace CGroup è una funzionalità del kernel Linux che fornisce isolamento delle gerarchie CGroup per i processi in esecuzione all'interno di un namespace. I CGroup, abbreviazione di control groups, sono una funzionalità del kernel che consente di organizzare i processi in gruppi gerarchici per gestire e imporre limiti sulle risorse di sistema come CPU, memoria e I/O.

Sebbene i namespace CGroup non siano un tipo di namespace separato come quelli discussi in precedenza (PID, mount, network, ecc.), sono correlati al concetto di isolamento dei namespace. I namespace CGroup virtualizzano la vista della gerarchia CGroup, in modo che i processi in esecuzione all'interno di un namespace CGroup abbiano una vista diversa della gerarchia rispetto ai processi in esecuzione nell'host o in altri namespace.

Come funziona:

  1. Quando viene creato un nuovo namespace CGroup, parte con una vista della gerarchia CGroup basata sul CGroup del processo creatore. Ciò significa che i processi in esecuzione nel nuovo namespace CGroup vedranno solo una parte della gerarchia CGroup completa, limitata al sottoalbero CGroup radicato nel CGroup del processo creatore.

  2. I processi all'interno di un namespace CGroup vedranno il proprio CGroup come la radice della gerarchia. Ciò significa che, dal punto di vista dei processi all'interno del namespace, il proprio CGroup appare come la radice e non possono vedere o accedere ai CGroup al di fuori del proprio sottoalbero.

  3. I namespace CGroup non forniscono direttamente l'isolamento delle risorse; forniscono solo l'isolamento della vista della gerarchia CGroup. Il controllo e l'isolamento delle risorse sono comunque applicati dai sottosistemi CGroup (ad esempio, cpu, memoria, ecc.) stessi.

Per ulteriori informazioni sui CGroup, consulta:

pageCGroups

Laboratorio:

Creare diversi Namespaces

CLI

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

Montando una nuova istanza del filesystem /proc utilizzando il parametro --mount-proc, si garantisce che il nuovo namespace di montaggio abbia una visione accurata e isolata delle informazioni specifiche dei processi in quel namespace.

Errore: bash: fork: Impossibile allocare memoria

Quando unshare viene eseguito senza l'opzione -f, si verifica un errore a causa del modo in cui Linux gestisce i nuovi namespace PID (Process ID). Di seguito sono riportati i dettagli chiave e la soluzione:

  1. Spiegazione del problema:

  • Il kernel Linux consente a un processo di creare nuovi namespace utilizzando la chiamata di sistema unshare. Tuttavia, il processo che avvia la creazione di un nuovo namespace PID (chiamato "unshare" process) non entra nel nuovo namespace; solo i suoi processi figlio lo fanno.

  • L'esecuzione di %unshare -p /bin/bash% avvia /bin/bash nello stesso processo di unshare. Di conseguenza, /bin/bash e i suoi processi figlio si trovano nel namespace PID originale.

  • Il primo processo figlio di /bin/bash nel nuovo namespace diventa PID 1. Quando questo processo termina, viene avviata la pulizia del namespace se non ci sono altri processi, poiché il PID 1 ha il ruolo speciale di adottare i processi orfani. Il kernel Linux disabiliterà quindi l'allocazione di PID in quel namespace.

  1. Conseguenza:

  • L'uscita del PID 1 in un nuovo namespace porta alla pulizia del flag PIDNS_HASH_ADDING. Ciò comporta il fallimento della funzione alloc_pid nell'allocazione di un nuovo PID durante la creazione di un nuovo processo, generando l'errore "Impossibile allocare memoria".

  1. Soluzione:

  • Il problema può essere risolto utilizzando l'opzione -f con unshare. Questa opzione fa sì che unshare crei un nuovo processo dopo aver creato il nuovo namespace PID.

  • Eseguendo %unshare -fp /bin/bash%, si garantisce che il comando unshare stesso diventi PID 1 nel nuovo namespace. /bin/bash e i suoi processi figlio sono quindi contenuti in modo sicuro all'interno di questo nuovo namespace, evitando l'uscita prematura del PID 1 e consentendo un'allocazione normale dei PID.

Assicurandosi che unshare venga eseguito con l'opzione -f, il nuovo namespace PID viene mantenuto correttamente, consentendo a /bin/bash e ai suoi sottoprocessi di funzionare senza incontrare l'errore di allocazione della memoria.

Docker

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

Verifica in quale namespace si trova il tuo processo

To check which namespace your process is in, you can use the following command:

Per verificare in quale namespace si trova il tuo processo, puoi utilizzare il seguente comando:

cat /proc/$$/cgroup

This command will display the control groups associated with your process, including the cgroup namespace.

Questo comando visualizzerà i gruppi di controllo associati al tuo processo, inclusa il namespace cgroup.

ls -l /proc/self/ns/cgroup
lrwxrwxrwx 1 root root 0 Apr  4 21:19 /proc/self/ns/cgroup -> 'cgroup:[4026531835]'

Trova tutti i namespace CGroup

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>

```bash nsenter -C TARGET_PID --pid /bin/bash ``` Inoltre, puoi **entrare in un altro namespace di processo solo se sei root**. E **non puoi** **entrare** in un altro namespace senza un descrittore che punti ad esso (come `/proc/self/ns/cgroup`).

Riferimenti

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Last updated