UTS Namespace
Reading time: 5 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)
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 UTS (UNIX Time-Sharing System) Namespace ist eine Funktion des Linux-Kernels, die die Isolation von zwei Systemidentifikatoren bietet: dem Hostname und dem NIS (Network Information Service) Domänennamen. Diese Isolation ermöglicht es jedem UTS-Namespace, seinen eigenen unabhängigen Hostnamen und NIS-Domänennamen zu haben, was besonders in Containerisierungs-Szenarien nützlich ist, in denen jeder Container als separates System mit eigenem Hostnamen erscheinen sollte.
So funktioniert es:
- Wenn ein neuer UTS-Namespace erstellt wird, beginnt er mit einer Kopie des Hostnamens und des NIS-Domänennamens aus seinem übergeordneten Namespace. Das bedeutet, dass der neue Namespace bei der Erstellung die gleichen Identifikatoren wie sein übergeordneter Namespace teilt. Änderungen am Hostnamen oder NIS-Domänennamen innerhalb des Namespaces wirken sich jedoch nicht auf andere Namespaces aus.
- Prozesse innerhalb eines UTS-Namespace können den Hostnamen und den NIS-Domänennamen mithilfe der Systemaufrufe
sethostname()
undsetdomainname()
ändern. Diese Änderungen sind lokal für den Namespace und wirken sich nicht auf andere Namespaces oder das Hostsystem aus. - Prozesse können zwischen Namespaces mithilfe des Systemaufrufs
setns()
wechseln oder neue Namespaces mit den Systemaufrufenunshare()
oderclone()
mit demCLONE_NEWUTS
-Flag erstellen. Wenn ein Prozess in einen neuen Namespace wechselt oder einen erstellt, beginnt er, den Hostnamen und den NIS-Domänennamen zu verwenden, die mit diesem Namespace verbunden sind.
Labor:
Verschiedene Namespaces erstellen
CLI
sudo unshare -u [--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-Namespace eine genaue und isolierte Sicht auf die prozessspezifischen Informationen hat, die für diesen Namespace spezifisch 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 (Process ID) Namespaces behandelt. Die wichtigsten Details und die Lösung sind unten aufgeführt:
- Problemerklärung:
- Der Linux-Kernel erlaubt es einem Prozess, neue Namespaces mit dem Systemaufruf
unshare
zu erstellen. Der Prozess, der die Erstellung eines neuen PID-Namespace initiiert (als "unshare"-Prozess bezeichnet), tritt jedoch nicht in den neuen Namespace 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-Namespace. - Der erste Kindprozess von
/bin/bash
im neuen Namespace wird zu PID 1. Wenn dieser Prozess beendet wird, wird die Bereinigung des Namespaces 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 Namespace.
- Folge:
- Das Beenden von PID 1 in einem neuen Namespace 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 bewirkt, dassunshare
einen neuen Prozess nach der Erstellung des neuen PID-Namespace forked. - Das Ausführen von
%unshare -fp /bin/bash%
stellt sicher, dass derunshare
-Befehl selbst PID 1 im neuen Namespace wird./bin/bash
und seine Kindprozesse sind dann sicher in diesem neuen Namespace enthalten, wodurch das vorzeitige Beenden 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-Namespace 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/uts
lrwxrwxrwx 1 root root 0 Apr 4 20:49 /proc/self/ns/uts -> 'uts:[4026531838]'
Alle UTS-Namensräume finden
sudo find /proc -maxdepth 3 -type l -name uts -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name uts -exec ls -l {} \; 2>/dev/null | grep <ns-number>
Betreten Sie einen UTS-Namespace
nsenter -u TARGET_PID --pid /bin/bash
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)
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.