3.7 KiB
Zeit-Namespace
{{#include ../../../../banners/hacktricks-training.md}}
Grundlegende Informationen
Der Zeit-Namespace in Linux ermöglicht offsets pro Namespace zu den systemeigenen monotonen und Boot-Zeituhren. Er wird häufig in Linux-Containern verwendet, um das Datum/die Uhrzeit innerhalb eines Containers zu ändern und Uhren nach der Wiederherstellung aus einem Checkpoint oder Snapshot anzupassen.
Labor:
Verschiedene Namespaces erstellen
CLI
sudo unshare -T [--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 (Prozess-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
unsharezu 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/bashim selben Prozess wieunshare. Folglich befinden sich/bin/bashund seine Kindprozesse im ursprünglichen PID-Namespace. - Der erste Kindprozess von
/bin/bashim 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 Verlassen von PID 1 in einem neuen Namespace führt zur Bereinigung des
PIDNS_HASH_ADDING-Flags. Dies führt dazu, dass die Funktionalloc_pidfehlschlä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
-fmitunshareverwendet wird. Diese Option bewirkt, dassunshareeinen 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/bashund seine Kindprozesse sind dann sicher in diesem neuen Namespace enthalten, wodurch der vorzeitige Austritt von PID 1 verhindert wird und eine normale PID-Zuweisung ermöglicht wird.
Indem sichergestellt wird, 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/time
lrwxrwxrwx 1 root root 0 Apr 4 21:16 /proc/self/ns/time -> 'time:[4026531834]'
Finde alle Zeit-Namensräume
sudo find /proc -maxdepth 3 -type l -name time -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name time -exec ls -l {} \; 2>/dev/null | grep <ns-number>
Betreten Sie einen Zeit-Namespace
nsenter -T TARGET_PID --pid /bin/bash
{{#include ../../../../banners/hacktricks-training.md}}