Ich habe das folgende Phänomen beobachtet, das ich nicht erklären kann. Nach dem Hinzufügen der CAP_SYS_ADMIN
Funktion kann unshare
nicht mehr geschrieben werden /proc/self/setgroups
.
Tatsächlich erfordert das Schreiben in diese Datei die Fähigkeit, dies wird jedoch durch Ändern des Benutzernamensraums erreicht. Warum verhindert das Hinzufügen der Funktion zum übergeordneten Prozess das Schreiben in diese Datei?
me@myhost:~$ unshare -r
root@myhost:~# exit
logout
me@myhost:~$ sudo setcap cap_sys_admin=ep /usr/bin/unshare
me@myhost:~$ unshare -r
unshare: cannot open /proc/self/setgroups: Permission denied
me@myhost:~$ sudo setcap cap_sys_admin= /usr/bin/unshare
me@myhost:~$ unshare -r
root@myhost:~#
Übrigens: Ich verwende Ubuntu 16.04.4 LTS mit Kernel Version 4.4 und die Version von util-linux (einschließlich unshare
) ist 2.27.1.
Antworten:
Was hier passiert, ist, dass Ihr "Unshare" -Prozess keinen Zugriff zum Schreiben in die
setgroups
(unduid_maps
,gid_maps
) Dateien im externen Benutzernamensraum hat.In diesem Namespace befinden sich die Pseudodateien im
/proc/<PID>
Root-Besitz, und als ob Ihre effektive UID immer noch die Ihres eigenen Benutzers ist, haben Sie keinen Zugriff auf das Schreiben in diese Dateien.Sie können dies einfach visualisieren, indem Sie einen Prozess im Hintergrund ausführen (z. B.
sleep
) und die Berechtigungen dersetgroups
Datei überprüfen, während sie ausgeführt wird (uid_maps
undgid_maps
sich genauso verhalten).Erstens mit einer Binärdatei, die keine zusätzlichen Funktionen hat:
Fügen wir dann einige Dateifunktionen hinzu und sehen, wie sich der Besitz ändert:
Der Besitz der Dateien in
/proc/<PID>
wird durch das Flag "dumpable" im Linux-Kernel gesteuert, mit dem verhindert wird, dass Informationen von einem privilegierten Prozess an einen nicht privilegierten Benutzer verloren gehen.Und wenn man bedenkt, dass Sie
unshare
mit zusätzlichen Funktionen arbeiten, aber immer noch eine nicht-root- effektive UID haben, wird der Schreibzugriff auf diese Pseudodateien, deren Eigentümer root ist, durch die normalen Zugriffskontrollen des Betriebssystems verhindert.Sie können den Wert des Flags "dumpable" mit dem
PR_GET_DUMPABLE
Befehl prysl (2) syscall überprüfen .In der Beschreibung finden
PR_SET_DUMPABLE
Sie auch:Welches ist genau Ihr Fall, mit einer
unshare
Binärdatei, die Dateifunktionen hat.Interessanterweise tritt bei Verwendung einer Root-eigenen Setuid-Binärdatei für
unshare
nicht genau dieses Problem auf. Ja, es werden die "dumpable" -Flaggen gelöscht und die Dateien im/proc/<PID>
Besitz von root. Wenn Sie jedoch berücksichtigen, dass Ihre effektive UID auch Root ist, wenn Sie eine Setuid-Binärdatei ausführen , wird der Zugriff zugelassen.In diesem Fall
unshare
stoßen Sie auf ein anderes Problem, das damit zu tun hat, dass die Logik dieses bestimmte Setup nicht verarbeiten kann (wahrscheinlich etwas damit zu tun, dass die effektive UID und die tatsächliche UID nicht übereinstimmen):Beachten Sie auch, dass das Löschen des Flags "dumpable" durch Ausführen einer Binärdatei mit festgelegten Dateifunktionen ausgelöst wurde. Wenn Sie zusätzliche Funktionen auf andere Weise erhalten, treten diese Probleme möglicherweise nicht auf. Die Verwendung von "Umgebungs" -Funktionen ist beispielsweise eine gute Möglichkeit, zusätzliche Funktionen außerhalb des Namespace zu erhalten, ohne dass beim Aufheben der Freigabe in einen neuen Benutzernamensraum Probleme auftreten.
(Leider gibt es noch nicht viele Tools für Umgebungsfunktionen.
libcap
Nur Schiffe werden in der neuesten Version 2.25 unterstützt, die derzeit in den meisten Distributionen ausgeliefert wird. Siecapsh
ist ziemlich niedrig, daher ist es nicht so einfach, sie zu erhalten Recht auch nicht . sehen Sie hier Informationen zur Verwendung neuestencapsh
Umgebungs Funktionen hinzuzufügen. ich habe auch versuchtsystemd-run
, konnte aber nicht wirklich Umgebungs Fähigkeiten dort entweder einrichten bekommen verwalten. auch immer, etwas für Sie zu schauen, wenn Sie tun müssen , Fähigkeiten, nicht Root User & User Namespaces zusammen!)quelle