Ich experimentiere mit Fähigkeiten 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 dann meinem Ping die minimalen Fähigkeiten (nicht root) durch sudo /sbin/setcap cap_net_raw=ep ./ping
, und mein Ping funktioniert wie erwartet.
Dann sudo /sbin/setcap -r ./ping
diese Fähigkeit zu widerrufen. Es funktioniert jetzt nicht wie erwartet.
Ich versuche jetzt, Ping zum Arbeiten zu bringen capsh
.
capsh
hat keine Privilegien, also muss ich es als root ausführen, dann aber root und damit alle anderen Privilegien löschen.
Ich denke ich brauche auch secure-keep-caps
, das ist nicht dokumentiert capsh
, steht aber im Capability Manual. Ich habe die Bitnummern von /usr/include/linux/securebits.h
. Sie scheinen korrekt zu sein, da die Ausgabe von --print
zeigt, dass diese Bits korrekt sind.
Ich habe stundenlang herumgespielt, bis jetzt habe ich das.
sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"
Jedoch ping
Fehler mit ping: icmp open socket: Operation not permitted
, das ist , was passiert , wenn es nicht die Fähigkeit hat. Auch die --print
Shows Current: =p cap_net_raw+i
, das reicht uns nicht e
.
sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"
wird die Fähigkeit dazu Current: = cap_net_raw+eip
richtig einstellen , lässt uns aber als root
.
Bearbeiten-1
Ich habe es 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 erwartet, secure-noroot: yes
der zweite jedoch nichtCurrent: = cap_net_raw+eip
Bearbeiten-2
Wenn ich das ==
vorstelle --print
, zeigt es jetzt Current: = cap_net_raw+i
, so dass der vorherige Fehler erklärt wird, aber nicht, warum wir beim Wechseln von root die Fähigkeit verlieren, ich dachte, das secure-keep-caps
sollte das beheben.
Bearbeiten-3
Nach allem, was 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?
Bearbeiten-4
Ich habe mehr recherchiert und das Handbuch erneut gelesen. Es scheint, dass normalerweise e
und p
Fähigkeiten verloren gehen, wenn: Sie vom Benutzer wechseln root
(oder anwenden secure-noroot
, um root zu einem normalen Benutzer zu machen), dies mit überschrieben werden kann secure-keep-caps
; Wenn Sie anrufen exec
, ist dies, soweit ich das beurteilen kann, eine Invariante.
Soweit ich das beurteilen kann, funktioniert es laut Handbuch. Soweit ich das beurteilen kann, gibt es keine Möglichkeit, etwas Nützliches damit anzufangen capsh
. Soweit ich das beurteilen kann, müssen Sie für die Nutzung von Funktionen: Dateifunktionen verwenden oder über ein funktionsbewusstes Programm verfügen, das keine Funktionen verwendet exec
. Daher kein privilegierter Wrapper.
Nun ist meine Frage, was ich vermisse, wofür capsh
.
Bearbeiten-5
Ich habe eine Antwort bezüglich der Umgebungsfunktionen hinzugefügt. Möglicherweise capsh
kann es auch mit vererbten Funktionen verwendet werden, aber um nützlich zu sein, müssen diese in der ausführbaren Datei festgelegt werden. Ich kann nicht sehen, wie capsh etwas Nützliches tun kann, ohne Umgebungsfähigkeiten oder geerbte Fähigkeiten zuzulassen.
Versionen:
capsh
von Paket -libcap2-bin
Version1:2.22-1.2
- vor edit-3 habe ich mir das neueste
capsh
von geholtgit://git.debian.org/collab-maint/libcap2.git
und angefangen es zu benutzen. uname -a
Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
User-Land ist 32bit.
quelle
capsh
vom Collab-Maint-Repo kommen, hätten Sie nicht das "Neueste" erhaltencapsh
, das Debian-Paket unterstützt immer noch keine Umgebungsfunktionen. Upstream 2.27 funktioniert.capsh
, in Abwesenheit von Umgebungs (wie es ursprünglich war). Was vermisse ich. Es muss einen Nutzen haben.Antworten:
Fähigkeiten sind Eigenschaften von Prozessen. Traditionell gibt es drei Sätze:
Programme, die als Root ausgeführt werden, verfügen immer über voll zugelassene und effektive Funktionen, sodass das Hinzufügen weiterer Funktionen keine spürbaren Auswirkungen hat. (Der Satz vererbbarer Funktionen ist normalerweise leer.) Wenn
setcap cap_net_raw+ep ping
Sie diese Funktionen standardmäßig für alle Benutzer aktivieren, die dieses Programm ausführen.Leider sind diese Funktionen an die ausgeführte Datei gebunden und werden nach der Ausführung eines neuen untergeordneten Prozesses nicht beibehalten. In Linux 4.3 wurden Ambient-Funktionen eingeführt , mit denen untergeordnete Prozesse Funktionen übernehmen können. (Siehe auch Transformation von Fähigkeiten während execve () in Fähigkeiten (7) .)
Beachten Sie beim Spielen mit Fähigkeiten die folgenden Fallstricke:
--keep=1
Option verwendencapsh
, um das Löschen der Sätze zu vermeiden.Das
capsh
Programm von libcap 2.25 kann die Umgebungsfunktionen noch nicht ändern, aber spätere Versionen bieten neue Optionen. Beachten Sie, dass die Reihenfolge der Optionen von Bedeutung ist. Beispielverwendung:Tipp: Sie können die
--print
Option an einer beliebigen Stelle in dercapsh
Befehlszeile hinzufügen und den aktuellen Status der Funktionen anzeigen.Hinweis:
cap_setpcap
wird benötigt,--addamb
solangecap_setuid,cap_setgid
für die--user
Option benötigt werden .quelle
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 Umgebungsfunktionen gelöst wird.
Wenn Sie ausführen
sudo capsh --user=<some_user> --
Es gibt 2 Systemaufrufe von Interesse, die dazu führen, dass Funktionen neu berechnet (und möglicherweise gelöscht) werden:setuid
: Nachman capabilities
:Mit anderen Worten, in unserem
capsh
obigen Befehl müssen wir sicherstellen, dass SECBIT_KEEP_CAPS während dessetuid
Systemaufrufs gesetzt ist. Andernfalls gehen alle Funktionen verloren. Das macht der--keep=1
. So, jetzt wird der Befehlsudo capsh --user=<some_user> --keep=1 --
execve
: Wenn wir die--keep=1
Option verwenden, bleiben alle Fähigkeitssätze (effektiv, zulässig, vererbbar) bis zumexecve
Systemaufruf erhalten. Allerdings werdenexecve
die Fähigkeiten auch (für Nicht-Root-Benutzer) neu berechnet, und zwar auf nicht so offensichtliche Weise. Kurz gesagt, bevor die Umgebungsfunktionen hinzugefügt werden , kann eine Funktion nach einemexecve
Aufruf in der "erlaubten" Gruppe eines Threads enthalten sein :setcap cap_net_raw+p /bin/bash
. Dadurch wird die gesamte Übung unbrauchbar, da die Fähigkeitssätze des Threads (mit Ausnahme des Begrenzungssatzes) keine Wirkung mehr haben.setcap cap_net_raw+i
dies der Trick wäre, aber es stellt sich heraus,execve
dass die vererbbaren Berechtigungen eines Threads gelöscht werden, wenn sie von nicht privilegierten Benutzern aufgerufen werden (wofür wir uns derzeit bedankensetuid
). Es gibt also keine Möglichkeit, diese Bedingung als nicht privilegierter Benutzer zu erfüllen.Mit den in Linux 4.3 eingeführten Umgebungsfunktionen kann ein Thread seine Funktionen auch nach einem
setuid
Zugriff auf einen nicht privilegierten Benutzer und anschließend auf einen beibehaltenexecve
, ohne sich auf Dateifunktionen verlassen zu müssen.quelle
Möglicherweise ist ein Fehler im Kernel aufgetreten. Es hat einige Diskussionen gegeben:
Ich habe keine Ahnung, ob etwas getan wurde, um es zu beheben.Edit: Laut http://man7.org/linux/man-pages/man7/capabilities.7.html gibt es einen neuen Capability Set Ambient (seit Linux 4.3). Es sieht so aus, als würde dies das ermöglichen, was benötigt wird.
quelle