CGroup Namespace
Reading time: 6 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Grundinformationen
Ein cgroup-Namespace ist eine Funktion des Linux-Kernels, die Isolation von cgroup-Hierarchien für Prozesse, die innerhalb eines Namespaces ausgeführt werden, bereitstellt. Cgroups, kurz für control groups, sind eine Kernel-Funktion, die es ermöglicht, Prozesse in hierarchischen Gruppen zu organisieren, um Grenzen für Systemressourcen wie CPU, Speicher und I/O zu verwalten und durchzusetzen.
Während cgroup-Namensräume kein separater Namespace-Typ wie die anderen, die wir zuvor besprochen haben (PID, Mount, Netzwerk usw.), sind, stehen sie im Zusammenhang mit dem Konzept der Namespace-Isolation. Cgroup-Namensräume virtualisieren die Sicht auf die cgroup-Hierarchie, sodass Prozesse, die innerhalb eines cgroup-Namensraums ausgeführt werden, eine andere Sicht auf die Hierarchie haben als Prozesse, die im Host oder in anderen Namespaces ausgeführt werden.
So funktioniert es:
- Wenn ein neuer cgroup-Namespace erstellt wird, beginnt er mit einer Sicht auf die cgroup-Hierarchie, die auf der cgroup des erstellenden Prozesses basiert. Das bedeutet, dass Prozesse, die im neuen cgroup-Namespace ausgeführt werden, nur einen Teil der gesamten cgroup-Hierarchie sehen, der auf dem cgroup-Teilbaum basiert, der an der cgroup des erstellenden Prozesses verwurzelt ist.
- Prozesse innerhalb eines cgroup-Namensraums werden ihre eigene cgroup als Wurzel der Hierarchie sehen. Das bedeutet, dass aus der Perspektive der Prozesse innerhalb des Namespaces ihre eigene cgroup als Wurzel erscheint und sie cgroups außerhalb ihres eigenen Teilbaums nicht sehen oder darauf zugreifen können.
- Cgroup-Namensräume bieten nicht direkt Isolation von Ressourcen; sie bieten nur Isolation der Sicht auf die cgroup-Hierarchie. Die Kontrolle und Isolation von Ressourcen werden weiterhin von den cgroup-Subsystemen (z. B. CPU, Speicher usw.) selbst durchgesetzt.
Für weitere Informationen über CGroups siehe:
Labor:
Erstellen verschiedener Namespaces
CLI
sudo unshare -C [--mount-proc] /bin/bash
Durch das Einhängen einer neuen Instanz des /proc
Dateisystems, wenn Sie den Parameter --mount-proc
verwenden, stellen Sie sicher, dass der neue Mount-Namensraum eine genaue und isolierte Sicht auf die Prozessinformationen hat, die spezifisch für diesen Namensraum sind.
Fehler: bash: fork: Kann Speicher nicht zuweisen
Wenn unshare
ohne die Option -f
ausgeführt wird, tritt ein Fehler auf, der auf die Art und Weise zurückzuführen ist, wie Linux neue PID (Prozess-ID) Namensräume behandelt. Die wichtigsten Details und die Lösung sind unten aufgeführt:
- Problemerklärung:
- Der Linux-Kernel erlaubt es einem Prozess, neue Namensräume mit dem Systemaufruf
unshare
zu erstellen. Der Prozess, der die Erstellung eines neuen PID-Namensraums initiiert (als "unshare" Prozess bezeichnet), tritt jedoch nicht in den neuen Namensraum ein; nur seine Kindprozesse tun dies. - Das Ausführen von
%unshare -p /bin/bash%
startet/bin/bash
im selben Prozess wieunshare
. Folglich befinden sich/bin/bash
und seine Kindprozesse im ursprünglichen PID-Namensraum. - Der erste Kindprozess von
/bin/bash
im neuen Namensraum wird zu PID 1. Wenn dieser Prozess beendet wird, wird die Bereinigung des Namensraums ausgelöst, wenn keine anderen Prozesse vorhanden sind, da PID 1 die besondere Rolle hat, verwaiste Prozesse zu übernehmen. Der Linux-Kernel deaktiviert dann die PID-Zuweisung in diesem Namensraum.
- Folge:
- Das Verlassen von PID 1 in einem neuen Namensraum führt zur Bereinigung des
PIDNS_HASH_ADDING
Flags. Dies führt dazu, dass die Funktionalloc_pid
fehlschlägt, um eine neue PID zuzuweisen, wenn ein neuer Prozess erstellt wird, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
- Lösung:
- Das Problem kann gelöst werden, indem die Option
-f
mitunshare
verwendet wird. Diese Option sorgt dafür, dassunshare
einen neuen Prozess nach der Erstellung des neuen PID-Namensraums forked. - Das Ausführen von
%unshare -fp /bin/bash%
stellt sicher, dass derunshare
Befehl selbst PID 1 im neuen Namensraum wird./bin/bash
und seine Kindprozesse sind dann sicher in diesem neuen Namensraum enthalten, wodurch der vorzeitige Austritt von PID 1 verhindert wird und eine normale PID-Zuweisung ermöglicht wird.
Durch die Sicherstellung, dass unshare
mit dem -f
Flag ausgeführt wird, wird der neue PID-Namensraum korrekt aufrechterhalten, sodass /bin/bash
und seine Unterprozesse ohne den Speicherzuweisungsfehler arbeiten können.
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
Überprüfen, in welchem Namespace sich Ihr Prozess befindet
ls -l /proc/self/ns/cgroup
lrwxrwxrwx 1 root root 0 Apr 4 21:19 /proc/self/ns/cgroup -> 'cgroup:[4026531835]'
Alle CGroup-Namensräume finden
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>
Betreten Sie einen CGroup-Namespace
nsenter -C TARGET_PID --pid /bin/bash
Außerdem können Sie nur in einen anderen Prozess-Namespace eintreten, wenn Sie root sind. Und Sie können nicht in einen anderen Namespace eintreten, ohne einen Deskriptor, der darauf verweist (wie /proc/self/ns/cgroup
).
References
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.