Warum bleibt die Benutzer -ID 65534, wenn Sie Clone verwenden, um einen neuen Benutzernamenspace im Python -Skript zu er
Posted: 06 Feb 2025, 09:01
Ich versuche, einen neuen Benutzernamenspace mit einem Python -Skript zu erstellen, das den Clone -Systemaufruf verwendet. Mein Ziel ist es, die Benutzer -ID einer neu hervorgebrachten Shell auf einen bestimmten Wert zuzuordnen, ähnlich wie es mit dem Befehl Unshare ist. sh , ich kann die UID-Zuordnungen erfolgreich über:
aktualisieren.
Danach zeigt das Ausführen von ID in der neuen Shell den Benutzer als Root . Versuchen Sie, dasselbe in einem Python -Skript mit libc.clone zu tun. Die Shell meldet die Benutzer -ID weiterhin als 65534 () Auch nach der Aktualisierung der UID- und GID -Zuordnungen. Hier ist mein Skript: < /p>
. Was könnte ich vermissen? Alle Ratschläge oder Erkenntnisse wären geschätzt.
aktualisieren.
Code: Select all
echo '0 502 1' > /proc/[PID]/uid_map
echo '0 502 1' > /proc/[PID]/gid_map
Code: Select all
nobody
Code: Select all
import signal
import os
import ctypes
import sys
CLONE_NEWUTS = 0x04000000
CLONE_NEWUSER = 0x10000000
def write_file(path, content):
try:
with open(path, "w") as f:
f.write(content)
except Exception as e:
sys.exit(f"[Error] Failed to write mapping {content} to {path}: {e}")
def child_func():
input("...>")
os.execlp("bash", "sh") # Start a new shell
libc = ctypes.CDLL("libc.so.6", use_errno=True)
STACK_SIZE = 1024 * 1024
stack = ctypes.create_string_buffer(STACK_SIZE)
child_stack = ctypes.c_void_p(ctypes.addressof(stack) + STACK_SIZE)
pid = libc.clone(
ctypes.CFUNCTYPE(ctypes.c_int)(child_func),
child_stack,
CLONE_NEWUTS | CLONE_NEWUSER | signal.SIGCHLD,
)
if pid == -1:
sys.exit("Failed to create new namespace")
print(pid)
write_file(f"/proc/{pid}/setgroups", "deny\n")
write_file(f"/proc/{pid}/uid_map", f"0 502 1\n")
write_file(f"/proc/{pid}/gid_map", f"0 502 1\n")
os.waitpid(pid, 0)
< /code>
Was ich überprüft habe: < /strong> < /p>
Das Skript wird mit Root -Berechtigungen ausgeführt. /li>
Die UID- und GID -Zuordnungsdateien werden nach dem Klon < /code> call aktualisiert. < /li>
< /ul>
Trotz dieser Schritte, Der Benutzer im Namespace bleibt niemand