capset

CAPGET(2)                   Linux-Programmierhandbuch                  CAPGET(2)



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
       Diese zwei Systemaufrufe 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 Systemaufrufe (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 benutzen.

   Aktuelle Details
       Nachdem Sie gewarnt wurden, hier einige aktuelle Kernel-Datails. Die
       Strukturen sind wie folgt definiert:

           #define _LINUX_CAPABILITY_VERSION_1  0x19980330
           #define _LINUX_CAPABILITY_U32S_1     1

                   /* V2 hinzugefügt in Linux 2.6.25; veraltet */
           #define _LINUX_CAPABILITY_VERSION_2  0x20071026
           #define _LINUX_CAPABILITY_U32S_2     2

                   /* V3 in Linux 2.6.26 hinzugefügt */
           #define _LINUX_CAPABILITY_VERSION_3  0x20080522
           #define _LINUX_CAPABILITY_U32S_3     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;

       Die Felder effective, permitted und inheritable sind Bitmasken der in
       capabilities(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. In Linux 2.6.25 wurden
       64-bit-Capability-Sets hinzugefügt, mit Version
       _LINUX_CAPABILITY_VERSION_2. Allerdings gab es einen API-Glitch, und
       Linux 2.6.26 fügte _LINUX_CAPABILITY_VERSION_3 hinzu, um das Problem zu
       beheben.

       Beachten Sie, dass 64-Bit-Capabilities datap[0] und datap[1] verwenden,
       während 32-Bit-Capabilities nur datap[0] verwenden.

       In Kerneln, die Datei-Capabilities unterstützen
       (VFS-Capabilities-Unterstützung), verhalten sich diese Systemaufrufe
       etwas anders. Diese Unterstützung wurde in Linux 2.6.24 hinzugefügt und
       wurde später in Linux 2.6.33 korrigiert (nicht-optional).

       Für capget()-Aufrufe können die Capabilities eines Prozesses über die
       Angabe der Prozesskennung mit dem Feldwert hdrp->pid ermittelt werden.

       Für Details der Daten siehe capabilities(7).

   Mit VFS-Capabilities-Unterstützung
       VFS-Capabilities setzen ein erweitertes Dateiattribut ein (siehe
       xattr(7)), um das Anhängen von Capabilities an Dateien zu erlauben.
       Dieses Privilegienmodell ersetzt die Kernel-Unterstützung dafür, dass ein
       Prozess asynchron die Capabilities eines anderen setzt. Das heißt, das
       auf Kerneln mit VFS-Capability-Unterstützung beim Aufruf von capset() der
       einzige für hdrp->pid erlaubte Wert 0, oder äquivalent der von gettid(2)
       zurückgelieferte Wert, ist.

   Ohne VFS-Capabilities-Unterstützung
       Auf älteren Kerneln, die keine Unterstützung für VFS-Capabilities bieten,
       kann capset(), falls der Aufrufende über die Capability CAP_SETPCAP
       verfügt, nicht nur zum Ändern der Capabilities des Aufrufenden sondern
       auch der Capabilities anderer Threads verwandt werden. Dieser Aufruf
       greift auf die Capabilities des durch das pid-Feld von hdrp beschriebenen
       Threads zu, 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 Prozesskennung angegeben werden. Der Zugriff auf einen
       Thread eines Multithread-Prozesses erfordert eine Thread-Kennung 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(1)
       durchgeführt; ein Wert kleiner als -1 bewirkt die Änderung für alle
       Mitglieder der Prozessgruppe, deren Kennung gleich -pid ist.

RÜCKGABEWERT
       Bei Erfolg wird Null zurückgegeben. Bei einem Fehler wird -1
       zurückgegeben und errno entsprechend gesetzt.

       Die Aufrufe schlagen mit dem Fehler EINVAL fehl und das Feld version von
       hdrp wird auf den vom Kernel bevorzugten Wert von
       _LINUX_CAPABILITY_VERSION_? gesetzt, 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  Es wurde versucht, eine Capability zu der vererbbaren Menge
              hinzuzufügen und entweder:

              *  diese Capability war nicht in der Begrenzungsmenge des
                 Aufrufenden; oder

              *  die Capability war nicht in der erlaubten Menge des Aufrufenden
                 und dem Aufrufenden fehlte die Capability CAP_SETPCAP in seiner
                 effektiven Menge.

       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.

KONFORM ZU
       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://git.kernel.org/cgit/linux/kernel/git/morgan/libcap.gitSIEHE AUCH
       clone(2), gettid(2), capabilities(7)

KOLOPHON
       Diese Seite ist Teil der Veröffentlichung 5.08 des Projekts
       Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie
       Fehler gemeldet werden können sowie die aktuelle Version dieser Seite
       finden sich unter https://www.kernel.org/doc/man-pages/.


ÜBERSETZUNG
       Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard
       Schauer <Martin.E.Schauer@gmx.de>, Mario Blättermann
       <mario.blaettermann@gmail.com>, Dr. Tobias Quathamer <toddy@debian.org>
       und Helge Kreutzmann <debian@helgefjell.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>.



Linux                            9. Februar 2020                       CAPGET(2)