BEZEICHNUNG¶
capget, capset - Setzt/ermittelt die Capabilities von Thread(s)
ÜBERSICHT¶
#include <sys/capability.h>
int capget(cap_user_header_t hdrp, cap_user_data_t
datap );
int capset(cap_user_header_t hdrp, const cap_user_data_t
datap);
BESCHREIBUNG¶
Seit Linux 2.2 ist die Macht des Superusers (Root) in eine Gruppe von diskreten
Capabilities aufgeteilt. Jeder Thread hat eine Gruppe an effektiven
Capabilities, die angeben, welche Capabilities (falls zutreffend) er derzeit
ausführen darf. Jeder Thread hat auch eine Gruppe an vererbbaren
Capabilities, die über einen
execve(2)-Aufruf weitergegeben werden
können und eine Gruppe an erlaubten Capabilities, die er zu effektiven
oder vererbbaren hinzufügen kann.
Diese zwei Funktionen sind die rohe Kernelschnittstelle zum Ermitteln und Setzen
der Thread-Capabilities. Die Systemaufrufe sind nicht nur Linux-spezifisch,
auch die Kernel-API wird sich wahrscheinlich ändern und die Verwendung
dieser Funktionen (insbesondere das Format der
cap_user_*_t-Typen)
unterliegt in jeder Kernel-Revision Erweiterungen, aber alte Programme werden
weiterhin funktionieren.
Die portablen Schnittstellen sind
cap_set_proc(3) und
cap_get_proc(3); falls möglich, sollten Sie diese Schnittstellen
in Anwendungen verwenden. Falls Sie die Linux-Erweiterungen in Anwendungen
verwenden möchten, sollten Sie die leichter zu verwendenden
Schnittstellen
capsetp(3) und
capgetp(3) verwenden.
Aktuelle Details¶
Nachdem Sie gewarnt wurden, einige aktuelle Kernel-Datails. Die Strukturen sind
wie folgt definiert:
#define _LINUX_CAPABILITY_VERSION_1 0x19980330
#define _LINUX_CAPABILITY_U32S_1 1
#define _LINUX_CAPABILITY_VERSION_2 0x20071026
#define _LINUX_CAPABILITY_U32S_2 2
typedef struct __user_cap_header_struct {
__u32 version;
int pid;
} *cap_user_header_t;
typedef struct __user_cap_data_struct {
__u32 effective;
__u32 permitted;
__u32 inheritable;
} *cap_user_data_t;
effektiv, erlaubt, vererbbar sind Bitmasken der in
capability(7)
definierten Capabilities. Beachten Sie, dass
CAP_*-Werte Bitindizes
sind und bitweise verschoben werden müssen, bevor per ODER auf die
Bitfelder zugegriffen wird. Um die Strukturen zu definieren, die an den
Systemaufruf übergeben werden sollen, müssen Sie die Namen
struct __user_cap_header_struct und
struct
__user_cap_data_struct verwenden, da die Typedefs nur Zeiger sind.
Kernel vor 2.6.25 bevorzugen 32-Bit-Capabilities mit Version
_LINUX_CAPABILITY_VERSION_1 und Kernel 2.6.25+ bevorzugen
64-Bit-Capabilities mit Version
_LINUX_CAPABILITY_VERSION_2. Beachten
Sie, dass 64-Bit-Capabilities
datap[0] und
datap[1] verwenden,
während 32-Bit-Capabilities nur
datap[0] verwenden.
Eine weitere Änderung betrifft das Verhalten dieser Systemaufrufe im
Hinblick auf Datei-Capabilities (VFS-Capability-Unterstützung). Diese
Unterstützung ist derzeit eine Compilierzeit-Option (hinzugefügt in
Kernel 2.6.24).
Für
capget()-Aufrufe können die Capabilities eines Prozesses
über die Angabe der Prozess-ID mit dem Feldwert
hdrp->pid
ermittelt werden.
Mit VFS-Capability-Unterstützung¶
VFS-Capability-Unterstützung erstellt eine auf Dateiattributen basierende
Methode zum Hinzufügen von Funktionen für privilegierte
ausführbare Dateien. Dieses Privilegienmodell ersetzt die
Kernel-Unterstützung dafür, dass ein Prozess asynchron die
Capabilities eines anderen setzt. Das heißt, mit VFS-Unterstützung
sind für Aufrufe von
capset() die einzig zulässigen,
gleichwertigen Werte für
hdrp->pid 0 oder
getpid(2).
Ohne VFS-Capability-Unterstützung¶
Wenn der Kernel VFS-Capabilities nicht unterstützt, können Aufrufe von
capset() auf die Capabilities des durch das
pid-Feld von
hdrp beschriebenen Threads zugreifen, wenn das Feld von Null
verschieden ist; wenn
pid gleich 0 ist, wird auf die Capabilities des
aufrufenden Threads zugegriffen. Falls sich
pid auf einen
single-threaded Prozess bezieht, kann
pid auch als herkömmliche
Prozess-ID angegeben werden. Der Zugriff auf einen Thread eines
Multithread-Prozesses erfordert eine Thread-ID vom Typ, den
gettid(2)
zurückgibt. Für
capset() kann
pid auch -1 sein, d.h.
die Änderung wird für alle Threads außer dem Aufrufenden und
init(8) durchgeführt; ein Wert kleiner als -1 bewirkt die
Änderung für alle Mitglieder der Prozessgruppe, deren ID -
pid ist.
Für Details der Daten siehe
capabilities(7).
RÜCKGABEWERT¶
Bei Erfolg wird Null zurückgegeben. Bei einem Fehler wird -1
zurückgegeben und
errno entsprechend gesetzt.
Die Aufrufe werden mit dem Fehler
EINVAL fehlschlagen und das Feld
version von
hdrp auf den vom Kernel bevorzugten Wert von
_LINUX_CAPABILITY_VERSION_? setzen, wenn ein nicht unterstützter
version-Wert angegeben wird. Auf diese Weise kann herausgefunden
werden, wie die derzeit bevorzugte Capability-Revision lautet.
FEHLER¶
- EFAULT
- Ungültige Speicheradresse. hdrp darf nicht NULL
sein. datap darf NULL nur sein, wenn der Benutzer versucht, das vom
Kernel unterstützte bevorzugte Capability-Versionsformat zu
ermitteln.
- EINVAL
- Eines der Argumente war ungültig.
- EPERM
- Es wurde versucht, eine Capability zu der erlaubten Menge
hinzuzufügen oder eine Capability in der effektiven oder vererbbaren
Menge zu setzen, die nicht in der erlaubten Menge enthalten ist.
- EPERM
- Der Aufrufende versuchte, capset() zu verwenden, um
die Capabilities eines von ihm selbst verschiedenen Threads zu
verändern, hatte dazu aber nicht die benötigten Privilegien.
Für Kernel, die VFS-Capabilities unterstützen, ist dies nie
erlaubt. Für Kernel ohne VFS-Unterstützung wird die Capability
CAP_SETPCAP benötigt. (Ein Fehler in Kerneln vor 2.6.11
führte dazu, dass dieser Fehler auch auftreten konnte, falls ein
Thread ohne diese Capability versuchte, seine eigenen Capabilities zu
ändern, indem er das Feld pid auf einen von numerisch Null
verschiedenen Wert (d.h. den von getpid(2) zurückgelieferten
Wert) anstatt 0 wählte.)
- ESRCH
- Kein solcher Thread.
Diese Systemaufrufe sind Linux-spezifisch.
ANMERKUNGEN¶
Die portable Schnittstelle der Capability-Abfrage- und -Setzfunktionen wird
durch die Bibliothek
libcap bereitgestellt, die unter folgender Adresse
erhältlich ist:
http://www.kernel.org/pub/linux/libs/security/linux-privs
SIEHE AUCH¶
clone(2),
gettid(2),
capabilities(7)
KOLOPHON¶
Diese Seite ist Teil der Veröffentlichung 3.42 des Projekts Linux-
man-pages. Eine Beschreibung des Projekts und Informationen, wie Fehler
gemeldet werden können, finden sich unter
http://www.kernel.org/doc/man-pages/.
ÜBERSETZUNG¶
Die deutsche Übersetzung dieser Handbuchseite wurde von Tobias Quathamer
<toddy@debian.org>, Helge Kreutzmann <debian@helgefjell.de> und
Martin Eberhard Schauer <Martin.E.Schauer@gmx.de> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public
License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird
KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
Sie bitte eine E-Mail an <debian-l10n-german@lists.debian.org>.