Wie verwende ich capsh: Ich versuche, einen nicht privilegierten Ping mit minimalen Funktionen auszuführen.
On Februar 13, 2021 by adminIch experimentiere mit Funktionen unter Debian Gnu / Linux.
Ich habe / bin / ping in mein aktuelles Arbeitsverzeichnis kopiert. Wie erwartet funktioniert es nicht, es war ursprünglich setuid root.
Ich gebe meinem Ping dann die minimalen Funktionen (nicht root), indem ich sudo /sbin/setcap cap_net_raw=ep ./ping
und meinen Ping mache funktioniert wie erwartet.
Dann sudo /sbin/setcap -r ./ping
, um diese Funktion zu widerrufen. Es funktioniert jetzt nicht wie erwartet.
Ich versuche jetzt, Ping mit capsh
.
capsh
hat keine Berechtigungen, daher muss ich es als root ausführen, aber dann root und damit alle anderen löschen Berechtigungen.
Ich glaube, ich brauche auch secure-keep-caps
, dies ist nicht in capsh
dokumentiert, aber in der Fähigkeit Handbuch. Ich habe die Bitnummern von /usr/include/linux/securebits.h
erhalten. Sie scheinen korrekt zu sein, da die Ausgabe von --print
zeigt, dass diese Bits korrekt sind.
Ich habe stundenlang herumgespielt, bis jetzt habe ich dies. P. >
sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"
ping
Fehler mit ping: icmp open socket: Operation not permitted
Dies ist, was passiert, wenn es nicht die Fähigkeit hat. Auch die --print
zeigt Current: =p cap_net_raw+i
, dies ist nicht genug, wir brauchen e
. P. >
sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"
setzt die Fähigkeit auf Current: = cap_net_raw+eip
Dies ist korrekt, lässt uns jedoch als root
.
Edit-1
Ich habe jetzt versucht sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"
Dies erzeugt:
touch: cannot touch `zz": Permission denied ping: icmp open socket: Operation not permitted
Der erste Fehler wird als secure-noroot: yes
erwartet, der zweite ist jedoch nicht Current: = cap_net_raw+eip
Edit-2
Wenn ich ==
vor --print
setze, ist dies jetzt der Fall zeigt Current: = cap_net_raw+i
, so dass der vorherige Fehler erklärt wird, aber nicht, warum wir die Fähigkeit verlieren, wenn wir von root wechseln, ich denke, dass secure-keep-caps
sollte Beheben Sie das.
Edit-3
Soweit ich sehen kann, verliere ich Effective (e) und Permitted (p), wenn exec aufgerufen wird. Dies wird erwartet, aber ich dachte, dass Secure-Keep-Caps verhindern sollten, dass sie verloren gehen. Vermisse ich etwas?
Edit-4
Ich habe mehr recherchiert und das Handbuch erneut gelesen. Es scheint, dass normalerweise die Funktionen e
und p
verloren gehen, wenn: Sie vom Benutzer root
wechseln (oder wenden Sie secure-noroot
an, wodurch root zu einem normalen Benutzer wird), dies kann mit secure-keep-caps
überschrieben werden. Wenn Sie exec
aufrufen, ist dies, soweit ich das beurteilen kann, eine Invariante.
Soweit ich das beurteilen kann, funktioniert es gemäß dem Handbuch. Soweit ich das beurteilen kann, gibt es mit capsh
keine Möglichkeit, etwas Nützliches zu tun. Soweit ich das beurteilen kann, müssen Sie zur Verwendung von Funktionen: Dateifunktionen verwenden oder über ein funktionsbewusstes Programm verfügen, das exec
nicht verwendet. Daher kein privilegierter Wrapper.
Nun ist meine Frage, was ich vermisse, wofür capsh
ist.
Edit-5
Ich habe eine Antwort zu Umgebungsfunktionen hinzugefügt. Möglicherweise kann capsh
auch mit geerbten Funktionen verwendet werden, aber um nützlich zu sein, müssten diese in der ausführbaren Datei festgelegt werden. Ich kann nicht sehen, wie capsh ohne Umgebungsfunktionen oder um geerbte Funktionen zuzulassen, etwas Nützliches bewirken kann.
Versionen:
-
capsh
aus Paketlibcap2-bin
Version1:2.22-1.2
- vor edit-3 habe ich mir die neueste
capsh
vongit://git.debian.org/collab-maint/libcap2.git
und begann damit. -
uname -a
Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
Benutzerland ist 32 Bit.
Kommentare
- Haben Sie Lekensteyns Beispiel mit einem späteren Upstream-Version ? Wenn Sie
capsh
aus dem Collab-Maint-Repo erhalten, hätten Sie nicht das „neueste“capsh
erhalten, das Debian-Paket wird immer noch nicht unterstützt Umgebungsfähigkeiten. Upstream 2.27 tut es. - @StephenKitt gut zu wissen, aber die ursprüngliche Frage ist, welche Verwendung
capsh
ist, wenn keine Umgebung vorhanden ist (wie ursprünglich). Was vermisse ich. Es muss eine Verwendung haben.
Antwort
Funktionen sind Eigenschaften von Prozessen. Traditionell gibt es drei Sätze:
- Zulässige Funktionen ( p ): Möglicherweise vorhandene Funktionen im aktuellen Prozess „aktiviert“.
- Effektive Funktionen ( e ): Funktionen, die derzeit verwendet werden können im aktuellen Prozess.
- Vererbbare Funktionen ( i ): Dateifunktionen, die möglicherweise vererbt werden.
Programme, die als root ausgeführt werden, verfügen immer über alle zulässigen und effektiven Funktionen, sodass das „Hinzufügen“ weiterer Funktionen keine spürbaren Auswirkungen hat. (Der Satz vererbbarer Funktionen ist normalerweise leer.) Mit setcap cap_net_raw+ep ping
aktivieren Sie diese Funktionen standardmäßig für jeden Benutzer, der dieses Programm ausführt.
Leider sind diese Funktionen an die gebunden ausgeführte Datei und werden nach dem Ausführen eines neuen untergeordneten Prozesses nicht beibehalten. In Linux 4.3 wurde Umgebungsfunktionen eingeführt, mit denen Funktionen von untergeordneten Prozessen geerbt werden können. (Siehe auch Transformation von Funktionen während execve () in Funktionen (7) .)
Während des Spielens mit Beachten Sie die folgenden Fallstricke:
- Wenn Sie den Benutzer von root zu non-root ändern, werden die effektiven und zulässigen Funktionen gelöscht (siehe Auswirkung von Änderungen der Benutzer-ID auf die Funktionen in -Funktionen (7) ). Sie können die Option
--keep=1
voncapsh
verwenden, um das Löschen der Sätze zu vermeiden. - Der Satz der Umgebungsfunktionen wird gelöscht, wenn Ändern der Benutzer- oder Gruppen-IDs. Lösung: Fügen Sie die Umgebungsfunktionen nach Ändern der Benutzer-ID, jedoch vor Ausführen eines untergeordneten Prozesses hinzu.
- Eine Funktion kann nur zu den Umgebungsfunktionen hinzugefügt werden Festlegen, ob es bereits in den zulässigen und vererbbaren Funktionen enthalten ist.
Seit libcap 2.26 hat das Programm capsh
die Möglichkeit erhalten, Umgebungsfunktionen zu ändern über Optionen wie --addamb
( Festschreiben ). Beachten Sie, dass die Optionsreihenfolge von Bedeutung ist. Anwendungsbeispiel:
sudo capsh --caps="cap_net_raw+eip cap_setpcap,cap_setuid,cap_setgid+ep" \ --keep=1 --user=nobody --addamb=cap_net_raw -- \ -c "./ping -c1 127.0.0.1"
Tipp: Sie können die Option --print
an einer beliebigen Stelle in der Befehlszeile und sehen Sie sich den aktuellen Funktionsstatus an.
Hinweis: cap_setpcap
wird für --addamb
während cap_setuid,cap_setgid
für die Option --user
benötigt wird.
Kommentare
- Welche spezifische Versionsnummer von libcap hat seitdem capsh –addamb? 2.32 Versionshinweise erwähnten neue Capsh-Funktionen, aber die Wörter waren vage.
- @ 把 友情 留 在 无 盐 Als die Antwort ursprünglich geschrieben wurde, wurde sie nur von Git Master unterstützt. Seitdem wurde libcap 2.26 mit Unterstützung für die Option
--addamb
veröffentlicht. Ich habe die Antwort entsprechend aktualisiert. - Leider sind diese Funktionen an die ausgeführte Datei gebunden und werden nach dem Ausführen eines neuen untergeordneten Prozesses nicht beibehalten. – durch untergeordneten Prozess Normalerweise denke ich an
fork(2)
, das die Funktionen erbt. Nurexecve(2)
erbt ‚ die Funktionen nicht, aber ‚ erstellt kein Kind Prozess. Bin ich falsch? - Zitieren von
man capabiltiies
: Ein überfork(2)
erstelltes Kind erbt Kopien seines Elternteils ‚ s Fähigkeitssätze.
Antwort
Die Antwort von Lekensteyn scheint korrekt und vollständig zu sein, aber ich werde versuchen, eine andere Erklärung aus einem anderen Blickwinkel zu liefern, um das Problem hervorzuheben, das durch die eingestellten Umgebungsfähigkeiten gelöst wird.
Wenn Sie Es gibt zwei interessierende Systemaufrufe, die dazu führen, dass Funktionen neu berechnet (und möglicherweise gelöscht) werden:
-
setuid
: Entsprechendman capabilities
:
SECBIT_KEEP_CAPS Das Setzen dieses Flags ermöglicht einen Thread mit einer oder mehreren 0 UIDs Wenn dieses Flag nicht gesetzt ist, führt ein solcher UID-Schalter dazu, dass der Thread alle Funktionen verliert.
Mit anderen Worten, in unserem obigen Befehl capsh
müssen wir sicherstellen, dass SECBIT_KEEP_CAPS während des setuid
Systemaufruf. Andernfalls gehen alle Funktionen verloren. Dies ist, was die --keep=1
tut. Der Befehl lautet nun sudo capsh --user=<some_user> --keep=1 --
-
execve
: Wenn wir Verwenden Sie die Option--keep=1
. Alle Funktionssätze (effektiv, zulässig, vererbbar) bleiben bis Der Systemaufrufexecve
.execve
bewirkt jedoch, dass Funktionen (auch für Nicht-Root-Benutzer) neu berechnet werden ein nicht so offensichtlicher Weg.Kurz gesagt, vor dem Hinzufügen der Umgebungsfunktionen , damit eine Funktion in einem Thread „s“ zulässig „ist. Nach einemexecve
-Aufruf festlegen, entweder:- Die Datei muss diese Funktion in ihrem „zulässigen“ Satz haben Dies kann mit
setcap cap_net_raw+p /bin/bash
durchgeführt werden. Dadurch wird die gesamte Übung unbrauchbar, da die Fähigkeitssätze des Threads (außer dem Begrenzungssatz) keine Wirkung mehr haben. - Sowohl die Datei als auch der Thread müssen diese Funktion in ihren „vererbbaren“ Sätzen haben. Sie denken vielleicht, dass
setcap cap_net_raw+i
den Trick machen würde, aber es stellt sich heraus, dassexecve
dazu führt, dass die vererbbaren Berechtigungen eines Threads gelöscht werden, wenn sie von aufgerufen werden ein nicht privilegierter Benutzer (was wir derzeit danksetuid
tun). Es gibt also keine Möglichkeit, diese Bedingung als nicht privilegierter Benutzer zu erfüllen.
- Die Datei muss diese Funktion in ihrem „zulässigen“ Satz haben Dies kann mit
In Linux 4.3 eingeführte Umgebungsfunktionen ermöglichen es einem Thread, seine Funktionen auch nach einer setuid
an einen nicht privilegierten Benutzer, gefolgt von einer , ohne sich auf Dateifunktionen verlassen zu müssen.
Antwort
Möglicherweise liegt ein Fehler / eine Funktion im Kernel vor. Es gab einige Diskussionen:
- https://bugzilla.altlinux.org/show_bug.cgi?id=16694
- http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-03/5224.html
Ich habe keine Ahnung, ob etwas d eine, um das Problem zu beheben.
Verstehen Sie mich nicht falsch – das aktuelle Verhalten ist sicher. Aber es ist so sicher, dass es den Dingen im Weg steht, die anscheinend funktionieren.
Bearbeiten: Laut http://man7.org/linux/man-pages/man7/capabilities.7.html Es gibt einen neuen Funktionsumfang für Ambient (seit Linux 4.3). Es sieht so aus, als würde dies das Notwendige zulassen.
Antwort
Eine geringfügige Anpassung der Antwort von Lekensteyn führt zu einem kürzeren Aufruf für aktuelle Kernel:
sudo /usr/sbin/capsh --keep=1 --user=$USER \ --inh=cap_net_raw --addamb=cap_net_raw -- \ -c "./ping -c1 localhost"
Hinweis: Abhängig von Ihrer sudoers-Datei kann dies Ihre Umgebung durcheinander bringen (z. B. das Ändern von HOME). capsh wird Ihre UID ändern, aber es wird nichts tun, um die Umgebungsänderungen von Sudo rückgängig zu machen.
Also, was ist hier los? Schauen wir uns das an:
-
sudo /usr/sbin/capsh
: Wir beginnen als root, das alle Funktionen in seinen effektiven (kann dies tun) und erlaubten (kann dies zu effektiven hinzufügen) Sätzen hat, aber nichts in den anderen Sätzen . Wir werden diese anderen Sätze gleich behandeln. -
--keep=1
: Aus Sicherheitsgründen (sprich: Legacy) erben Funktionen normalerweise nicht über root- > Nicht-Root-ID-Schalter. Dieses Flag aktiviert eine Funktion namensSECBIT_KEEP_CAPS
, die dies ermöglicht. Beachten Sie, dass sie beim Ausführen automatisch gelöscht wird Dies ist eine gute Idee. -
--user=$USER
: Jetzt, da wir nicht alle unsere Funktionen bei UID-Änderungen verlieren, verlassen wir root. DankSECBIT_KEEP_CAPS
behalten wir root-ähnliche Berechtigungen bei, wodurch wir unsere Fähigkeiten weiter verbessern können. -
--inh=cap_net_raw
: Dadurch wird unsere Zielfunktion zum vererbbaren Satz hinzugefügt, da Sie keine Fähigkeitsumgebung erstellen können (siehe nächstes Element), wenn sie nicht vererbbar ist. -
--addamb=cap_net_raw
: Obwohl wirSECBIT_KEEP_CAPS
angefordert haben, wirdexecve
einer nicht privilegierten Binärdatei (keine setuid / setgid / setcap) immer noch Löschen Sie unsere Funktionen, was zu keinen Berechtigungen führt. Linux 4.3 hat den Umgebungssatz hinzugefügt, der bei der Ausführung nicht privilegierter Binärdateien zu den effektiven und zulässigen Sätzen hinzugefügt wird. Perfekt! -
-- -c ...
: Nachdem wir alles eingerichtet haben, führen wir Bash mit diesen Argumenten aus. Die Fähigkeitssätze werden gelöscht (weil Bash nicht privilegiert ist), der Umgebungssatz wird wieder hinzugefügt und voila! Wir haben die erforderliche Berechtigung, Open Raw auszuführen Sockets.
Sie können dies mit der speziellen Argument für capsh, wodurch es sich mit dem Rest der Befehlszeile ausführt:
sudo /usr/sbin/capsh --keep=1 --user=$USER \ --inh=cap_net_raw --addamb=cap_net_raw == --print Current: = cap_net_raw+eip
Das heißt, wir haben cap_net_raw als effektiv (kann es tun), vererbbar (kann es an untergeordnete Prozesse übergeben) und erlaubt (darf es bekommen). Und keine anderen Funktionen in einer dieser Funktionen.
Weitere Informationen zu Funktionen und deren Funktionsweise finden Sie in der Manpage (7) / a>. Insbesondere die Überschrift Transformation of capabilities during execve()
.
Kommentare
- Was meinen Sie mit Dies geschieht frühzeitig, da eine Reihe zusätzlicher Funktionen erforderlich sind, die ‚ erst nach ‚ ausgeführt werden können. ?In Ihrem Fall werden Sie als “ root “ ausgeführt, sodass auch
--user
nicht vorhanden war ‚ nicht geändert, Sie ‚ hätten später noch die erforderlichen Funktionen? - Vielen Dank, dass Sie darauf hingewiesen haben! In einer früheren Version dieser Befehlszeile wurden Privilegien explizit gelöscht, daher musste zuvor setuid festgelegt werden. Jetzt, da Privilegien implizit als Teil von exec gelöscht werden, ist ‚ nicht erforderlich.
Schreibe einen Kommentar