capget(2) System Calls Manual capget(2) BEZEICHNUNG capget, capset - Setzt/ermittelt die Capabilities von Thread(s) BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include /* Definition der Konstanten CAP_* und _LINUX_CAPABILITY_* */ #include /* Definition der Konstanten SYS_* */ #include int syscall(SYS_capget, cap_user_header_t hdrp, cap_user_data_t dataz); int syscall(SYS_capset, cap_user_header_t hdrp, const cap_user_data_t dataz); Hinweis: Glibc stellt keine Wrapper fur diese Systemaufrufe bereit; rufen Sie sie mittels syscall(2) auf. 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 andern 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 moglich, sollten Sie diese Schnittstellen in Anwendungen benutzen, siehe ANMERKUNGEN. 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 hinzugefugt in Linux 2.6.25; veraltet */ #define _LINUX_CAPABILITY_VERSION_2 0x20071026 #define _LINUX_CAPABILITY_U32S_2 2 /* V3 hinzugefugt in Linux 2.6.26 */ #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 mussen, bevor per ODER auf die Bitfelder zugegriffen wird. Um die Strukturen zu definieren, die an den Systemaufruf ubergeben werden sollen, mussen Sie die Namen struct __user_cap_header_struct und struct __user_cap_data_struct verwenden, da die Typedefs nur Zeiger sind. Kernel vor Linux 2.6.25 bevorzugen 32-bit-Capabilities mit Version _LINUX_CAPABILITY_VERSION_1. In Linux 2.6.25 wurden 64-bit-Capability-Sets hinzugefugt, mit Version _LINUX_CAPABILITY_VERSION_2. Allerdings gab es einen API-Glitch, und Linux 2.6.26 fugte _LINUX_CAPABILITY_VERSION_3 hinzu, um das Problem zu beheben. Beachten Sie, dass 64-Bit-Capabilities dataz[0] und dataz[1] verwenden, wahrend 32-Bit-Capabilities nur dataz[0] verwenden. In Kerneln, die Datei-Capabilities unterstutzen (VFS-Capabilities-Unterstutzung), verhalten sich diese Systemaufrufe etwas anders. Diese Unterstutzung wurde in Linux 2.6.24 hinzugefugt und wurde spater in Linux 2.6.33 korrigiert (nicht-optional). Fur capget()-Aufrufe konnen die Capabilities eines Prozesses uber die Angabe der Prozesskennung mit dem Feldwert hdrp->pid ermittelt werden. Fur Details der Daten siehe capabilities(7). Mit VFS-Capabilities-Unterstutzung VFS-Capabilities setzen ein erweitertes Dateiattribut ein (siehe xattr(7)), um das Anhangen von Capabilities an Dateien zu erlauben. Dieses Privilegienmodell ersetzt die Kernel-Unterstutzung dafur, dass ein Prozess asynchron die Capabilities eines anderen setzt. Das heisst, das auf Kerneln mit VFS-Capability-Unterstutzung beim Aufruf von capset() der einzige fur hdrp->pid erlaubte Wert 0, oder aquivalent der von gettid(2) zuruckgelieferte Wert, ist. Ohne VFS-Capabilities-Unterstutzung Auf alteren Kerneln, die keine Unterstutzung fur VFS-Capabilities bieten, kann capset(), falls der Aufrufende uber die Capability CAP_SETPCAP verfugt, nicht nur zum Andern 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 herkommliche Prozesskennung angegeben werden. Der Zugriff auf einen Thread eines Multithread-Prozesses erfordert eine Thread-Kennung vom Typ, den gettid(2) zuruckgibt. Fur capset() kann pid auch -1 sein, d.h. die Anderung wird fur alle Threads ausser dem Aufrufenden und init(1) durchgefuhrt; ein Wert kleiner als -1 bewirkt die Anderung fur alle Mitglieder der Prozessgruppe, deren Kennung gleich -pid ist. RUCKGABEWERT Bei Erfolg wird Null zuruckgegeben. Bei einem Fehler wird -1 zuruckgegeben und errno gesetzt, um den Fehler anzuzeigen. 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 unterstutzter version-Wert angegeben wird. Auf diese Weise kann herausgefunden werden, wie die derzeit bevorzugte Capability-Revision lautet. FEHLER EFAULT Ungultige Speicheradresse. hdrp darf nicht NULL sein. dataz darf NULL nur sein, wenn der Benutzer versucht, das vom Kernel unterstutzte bevorzugte Capability-Versionsformat zu ermitteln. EINVAL Eines der Argumente war ungultig. EPERM Es wurde versucht, eine Capability zu der erlaubten Menge hinzuzufugen 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 hinzuzufugen und entweder: o diese Capability war nicht in der Begrenzungsmenge des Aufrufenden; oder o 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 verandern, hatte dazu aber nicht die benotigten Privilegien. Fur Kernel, die VFS-Capabilities unterstutzen, ist dies nie erlaubt. Fur Kernel ohne VFS-Unterstutzung wird die Capability CAP_SETPCAP benotigt. (Ein Fehler in Kerneln vor Linux 2.6.11 fuhrte dazu, dass dieser Fehler auch auftreten konnte, falls ein Thread ohne diese Capability versuchte, seine eigenen Capabilities zu andern, indem er das Feld pid auf einen von numerisch Null verschiedenen Wert (d.h. den von getpid(2) zuruckgelieferten Wert) anstatt 0 wahlte.) ESRCH Kein solcher Thread. STANDARDS Linux. ANMERKUNGEN Die portable Schnittstelle der Capability-Abfrage- und -Setzfunktionen wird durch die Bibliothek libcap bereitgestellt, die unter folgender Adresse erhaltlich ist: SIEHE AUCH clone(2), gettid(2), capabilities(7) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer , Mario Blattermann , Dr. Tobias Quathamer und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 capget(2)