Capabilities: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „BEZEICHNUNG capabilities - Überblick über Linux-Capabilities BESCHREIBUNG Für den Zweck der Durchführung von Rechteprüfungen unt…“)
 
(Der Seiteninhalt wurde durch einen anderen Text ersetzt: „*Was sind Capabilities *Capabilities Manpage“)
Markierung: Ersetzt
Zeile 1: Zeile 1:
BEZEICHNUNG
+
*[[Was sind Capabilities]]
      capabilities - Überblick über Linux-Capabilities
+
*[[Capabilities Manpage]]
 
 
BESCHREIBUNG
 
      Für  den  Zweck  der  Durchführung  von  Rechteprüfungen  unterscheiden  traditionelle
 
      UNIX-Implementierungen zwei Arten von Prozessen: Privilegierte Prozesse  (deren  effektive
 
      Benutzer-ID  0  ist,  auch  als  Superuser oder Root benannt) und unprivilegierte Prozesse
 
      (deren effektive UID von Null verschieden  ist).  Privilegierte  Prozesse  übergehen  alle
 
      Kernel-Rechteprüfungen,  während  unprivilegierte  Prozesse  der  vollen  Rechteprüfung,
 
      basierend auf den Berechtigungsnachweisen des  Prozesses  (normalerweise:  effektive  UID,
 
      effektive GID und ergänzende Gruppenliste), unterliegen.
 
 
 
      Beginnend  mit  Kernel  2.2  unterteilt  Linux  die  Privilegien, die traditionell mit dem
 
      Superuser assoziiert sind, in getrennte Einheiten,  die  als  Capabilities  bekannt  sind.
 
      Diese  können  unabhängig voneinander aktiviert oder deaktiviert werden. Capabilities sind
 
      ein Attribut pro Thread.
 
 
 
  Liste der Capabilities
 
      Die folgende Liste zeigt die in Linux implementierten Capabilities und die  Aktionen  oder
 
      Verhalten, die jede Capability erlaubt:
 
 
 
      CAP_AUDIT_CONTROL (seit Linux 2.6.11)
 
              Kernel-Auditierung aktivieren und deaktivieren; die Auditierung-Filterregel ändern;
 
              den Auditstatus und Filterregel abfragen.
 
 
 
      CAP_AUDIT_READ (seit Linux 3.16)
 
              Erlaubt das Schreiben des Audit-Protokolls über einen Multicast-Netlink-Socket
 
 
 
      CAP_AUDIT_WRITE (seit Linux 2.6.11)
 
              Datensätze in das Audit-Protokoll des Kernels schreiben
 
 
 
      CAP_BLOCK_SUSPEND (seit Linux 3.5)
 
              Funktionalitäten  einsetzen,  die  die  System-Supsendierung  blockieren  können
 
              (epoll(7) EPOLLWAKEUP, /proc/sys/wake_lock).
 
 
 
      CAP_CHOWN
 
              beliebige Änderungen an Datei-UIDs und GIDs vornehmen (siehe chown(2))
 
 
 
      CAP_DAC_OVERRIDE
 
              Lese-,  Schreibe  und  Ausführrechteprüfungen  umgehen.  (DAC ist die Abkürzung für
 
              »discretionary access control«, benutzerbestimmbare Zugriffskontrolle)
 
 
 
      CAP_DAC_READ_SEARCH
 
              * Dateileserechteprüfungen  und  Verzeichnislese-  und  -ausführrechteprüfungen
 
                umgehen.
 
              * open_by_handle_at(2) aufrufen.
 
              * Verwenden  Sie  den  Schalter AT_EMPTY_PATH von linkat(2), um einen Link auf eine
 
                Datei, auf die sich ein Dateideskriptor bezieht, zu erstellen.
 
 
 
      CAP_FOWNER
 
              * Rechteprüfungen umgehen, die normalerweise verlangen,  dass  die  Dateisystem-UID
 
                des  Prozesses  mit  der  UID der Datei übvereinstimmt (z.B. chmod(2), utime(2)),
 
                hierbei  sind Aktionen,  die  durch  CAP_DAC_OVERRIDE  und  CAP_DAC_READ_SEARCH
 
                abgedeckt sind, ausgeschlossen;
 
              * Inode-Schalter für beliebige Dateien setzen (siehe ioctl_iflags(2));
 
              * Zugriffskontrolllisten  (»Access  Control  Lists«,  ACLs)  auf  beliebige Dateien
 
                setzen;
 
              * »sticky«-Bit von Verzeichnissen beim Dateilöschen ignorieren;
 
              * O_NOATIME für beliebige Dateien in open(2) und fcntl(2) setzen
 
 
 
      CAP_FSETID
 
              * Set-User-ID- und Set-Group-ID-Modus-Bits  nicht  zurücksetzen,  wenn  eine  Datei
 
                verändert wird;
 
              * das  Set-Group-ID-Bit für eine Datei setzen, deren GID nicht auf das Dateisystem-
 
                oder eine der ergänzenden GIDs des aufrufenden Prozesses passt.
 
 
 
      CAP_IPC_LOCK
 
              Speicher sperren (mlock(2), mlockall(2), mmap(2), shmctl(2)).
 
 
 
      CAP_IPC_OWNER
 
              Rechteprüfungen für Aktionen mit System-V-IPC-Objekten umgehen
 
 
 
      CAP_KILL
 
              Rechteprüfungen beim Senden von Signalen umgehen (siehe kill(2)). Dies schließt die
 
              ioctl(2)-KDSIGACCEPT-Aktion mit ein.
 
 
 
      CAP_LEASE (seit Linux 2.4)
 
              Etabliert Ausleihen für beliebige Dateien (siehe fcntl(2)).
 
 
 
      CAP_LINUX_IMMUTABLE
 
              Setzt die Inode-Schalter FS_APPEND_FL und FS_IMMUTABLE_FL (siehe ioctl_iflags(2)).
 
 
 
      CAP_MAC_ADMIN (seit Linux 2.6.25)
 
              MAC-Konfiguration  oder  Statusänderungen  erlauben.  Implementiert  für  das
 
              Smack-Linux-Security-Modul (LSM).
 
 
 
      CAP_MAC_OVERRIDE (seit Linux 2.6.25)
 
              Mandatory Access Control (MAC) außer Kraft setzen. Für das Smack-LSM implementiert.
 
 
 
      CAP_MKNOD (seit Linux 2.4)
 
              Spezielle Dateien mittels mknod(2) erstellen.
 
 
 
      CAP_NET_ADMIN
 
              Verschiedene Netz-bezogene Aktionen durchführen:
 
              * Schnittstellenkonfiguration;
 
              * Administration von IP-Firewall, Masquerading und Abrechnung;
 
              * Routing-Tabellen verändern;
 
              * an beliebige Adresse für eine transparente Proxyfunktion binden;
 
              * type-of-service (TOS) setzen
 
              * Treiberstatistiken bereinigen;
 
              * den »promiscuous«-Modus einschalten;
 
              * Multicasting aktivieren;
 
              * setsockopt(2) verwenden, um die folgenden Socket-Optionen  zu  setzen:  SO_DEBUG,
 
                SO_MARK,  SO_PRIORITY  (für  eine  Priorität  außerhalb  des  Bereichs  0 bis 6),
 
                SO_RCVBUFFORCE und SO_SNDBUFFORCE.
 
 
 
      CAP_NET_BIND_SERVICE
 
              Einen Socket  an  einen  privilegierten  Internet-Domain-Port  binden  (Portnummern
 
              kleiner als 1024)
 
 
 
      CAP_NET_BROADCAST
 
              (Unbenutzt) Socket-Broadcasts durchführen und auf Multicasts warten
 
 
 
      CAP_NET_RAW
 
              * RAW- und PACKET-Sockets verwenden;
 
              * an beliebige Adresse für eine transparente Proxyfunktion binden
 
 
 
      CAP_SETGID
 
              * Beliebige  Manipulationen  an  den  GIDs  und  der Liste der ergänzenden GIDs des
 
                Prozesses vornehmen;
 
              * GID  fälschen,  wenn  Socket-Berechtigungsnachweise  via  UNIX-Domain-Sockets
 
                weitergebeben werden;
 
              * eine  Gruppen-ID-Abbildung  in  einen  Benutzernamensraum  schreiben  (siehe
 
                user_namespaces(7)).
 
 
 
      CAP_SETFCAP (seit Linux 2.6.24)
 
              Setzt beliebige Capabilities auf einer Datei.
 
 
 
      CAP_SETPCAP
 
              Falls Datei-Capabilites unterstützt werden (d.h.  seit  Linux  2.6.24):  Füge  alle
 
              Capabilities  aus  der Begrenzungsmenge des Threads zu der vererbbaren Menge hinzu;
 
              entferne Capabilities aus  der  Begrenzungsmenge  (via  prctl(2)  PR_CAPBSET_DROP);
 
              nehme Änderungen an den securebits-Schaltern vor.
 
 
 
              Falls  Datei-Capabilites  nicht  unterstützt werden (d.h. Kernel vor Linux 2.6.24):
 
              eine Capability in  der  erlaubten  Capability-Menge  oder  von  anderen  Prozessen
 
              entfernen  oder  dafür  bewilligen.  (Diese  Eigenschaft  von CAP_SETPCAP ist nicht
 
              verfügbar,  falls  der  Kernel  für  die  Unterstützung  von  Datei-Capabilities
 
              konfiguriert  ist,  da  CAP_SETPCAP  für diese Kernel eine komplett andere Semantik
 
              aufweist.)
 
 
 
      CAP_SETUID
 
              * beliebige Manipulationen  der  Prozess-UIDs  vornehmen  (setuid(2),  setreuid(2),
 
                setresuid(2), setfsuid(2));
 
              * UID  fälschen,  wenn  Socket-Berechtigungsnachweise  via  UNIX-Domain-Sockets
 
                weitergebeben werden;
 
              * eine  Benutzer-ID-Abbildung  in  einen  Benutzernamensraum  schreiben  (siehe
 
                user_namespaces(7)).
 
 
 
      CAP_SYS_ADMIN
 
              Hinweis:  Diese  Capability  ist  überladen,  siehe  Hinweise für Kernel-Entwickler
 
              weiter unten.
 
 
 
              * eine Reihe  von  Systemadministratoraktionen  ausführen,  darunter:  quotactl(2),
 
                mount(2), umount(2), swapon(2), swapoff(2), sethostname(2) und setdomainname(2);
 
              * privilegierte  syslog(2)-Aktion  ausführen  (seit  Linux 2.6.37 sollte CAP_SYSLOG
 
                verwandt werden, um diese Aktion zu erlauben);
 
              * den VM86_REQUEST_IRQ-Befehl vm86(2) ausführen;
 
              * IPC_SET- und IPC_RMID-Aktion auf beliebigen System-V-IPC-Objekten ausführen;
 
              * RLIMIT_NPROC-Ressourcenbegrenzung außer Kraft setzen;
 
              * Aktionen an  den  Erweiterten  Attributen  (»Extended  Attributes«)  trusted  und
 
                security durchführen (siehe attr(7));
 
              * lookup_dcookie(2) verwenden;
 
              * ioprio_set(2)    verwenden,  um  IOPRIO_CLASS_RT  und  (vor  Linux  2.6.25)
 
                IOPRIO_CLASS_IDLE-E/A-Scheduling-Klassen zuzuweisen;
 
              * PID  fälschen,  wenn  Socket-Berechtigungsnachweise  via  UNIX-Domain-Sockets
 
                weitergebeben werden;
 
              * die  systemweite Grenze der Anzahl der offenen Dateien (/proc/sys/fs/file-max) in
 
                Systemaufrufen, die Dateien öffnen (z.B. accept(2), execve(2), open(2),  pipe(2))
 
                überschreiben;
 
              * Schalter  CLONE_*  einsetzen,  der  neue  Namensräume mit clone(2) und unshare(2)
 
                erstellt  (seit  Linux  3.8  benötigt  die  Erzeugung  von  Benutzernamensräumen
 
                allerdings keine Capability mehr);
 
              * perf_event_open(2) aufrufen;
 
              * auf privilegierte perf-Ereignisinformationen zugreifen;
 
              * setns(2) aufrufen (benötigt CAP_SYS_ADMIN im Namensraum target);
 
              * fanotify_init(2) aufrufen;
 
              * bpf(2) aufrufen;
 
              * privilegierte Aktionen KEYCTL_CHOWN und KEYCTL_SETPERM von keyctl(2) ausführen;
 
              * ptrace(2)  PTRACE_SECCOMP_GET_FILTER  verwenden,  um  die  Seccomp-Filter  aller
 
                verfolgten Prozesse auszugeben;
 
              * madvise(2)-MADV_HWPOISON-Aktion ausführen;
 
              * den TIOCSTI ioctl(2) verwenden, um  Zeichen  in  die  Eingabewarteschlange  eines
 
                Terminals, dass nicht das vom aufrufenden gesteuerte Terminal ist, einzufügen
 
              * veralteten Systemaufruf nfsservctl(2) verwenden;
 
              * veralteten Systemaufruf bdflush(2) verwenden;
 
              * verschiedene privilegierte Blockgeräte-ioctl(2)-Aktion ausführen
 
              * verschiedene privilegierte Dateisystem-ioctl(2)-Aktionen ausführen
 
              * privilegierte  ioctl(2)-Aktionen  am  Gerät  /dev/random  durchführen  (siehe
 
                random(4));
 
              * einen  seccomp(2)-Filter  installieren,  ohne    zuerst    das    no_new_privs
 
                Thread-Attribut setzen zu müssen;
 
              * Erlauben-/Verweigern-Regeln für Gerätesteuergruppen setzen;
 
              * ptrace(2)  PTRACE_SECCOMP_GET_FILTER  Aktionen  einsetzen,  um die Seccomp-Filter
 
                verfolgter Prozesse auszugeben;
 
              * die Aktion PTRACE_SETOPTIONS von ptrace(2) einsetzen, um den  Seccomp-Schutz  des
 
                verfolgten  Prozesses  vorübergehend  außer  Kraft  zu  setzen (d.h. der Schalter
 
                PTRACE_O_SUSPEND_SECCOMP).
 
              * administrative Aktionen auf vielen Gerätetreibern ausführen
 
 
 
      CAP_SYS_BOOT
 
              reboot(2) und kexec_load(2) verwenden
 
 
 
      CAP_SYS_CHROOT
 
              chroot(2) verwenden
 
 
 
      CAP_SYS_MODULE
 
              * Kernelmodule laden und entladen (siehe init_module(2) und delete_module(2));
 
              * in    Kerneln    vor    2.6.25:    Capabilities    aus    der    systemweiten
 
                Capability-Begrenzungsmenge entfernen
 
 
 
      CAP_SYS_NICE
 
              * den  Nice-Wert  von Prozessen erhöhen (nice(2), setpriority(2)) und den Nice-Wert
 
                von beliebigen Prozessen ändern;
 
              * Echtzeit-Scheduling-Richtlinien zum Prozessaufruf und Scheduling-Richtlinien  und
 
                -Prioritäten    für    beliebige    Prozesse    setzen    (sched_setscheduler(2),
 
                sched_setparam(2), shed_setattr(2));
 
              * CPU-Affinität für beliebige Prozesse setzen (sched_setaffinity(2));
 
              * E/A-Scheduling-Klassen  und  -Prioritäten  für  beliebige  Prozesse  setzen
 
                (ioprio_set(2));
 
              * migrate_pages(2)  auf  beliebige  Prozesse  anwenden  und Prozessen erlauben, auf
 
                beliebige Knoten zu migrieren;
 
              * move_pages(2) auf beliebige Prozesse anwenden;
 
              * den Schalter MPOL_MF_MOVE_ALL mit mbind(2) und move_pages(2) verwenden
 
 
 
      CAP_SYS_PACCT
 
              acct(2) verwenden
 
 
 
      CAP_SYS_PTRACE
 
              * Nachverfolgen beliebiger Prozesse mittels ptrace(2)
 
              * get_robust_list(2) auf beliebige Prozesse anwenden
 
              * Daten vom oder zum Speicher beliebiger Prozesse mittels  process_vm_readv(2)  und
 
                process_vm_writev(2) übertragen;
 
              * Prozesse mittels kcmp(2) inspezieren
 
 
 
      CAP_SYS_RAWIO
 
              * E/A-Port-Aktionen ausführen (iopl(2) und ioperm(2));
 
              * auf /proc/kcore zugreifen;
 
              * die FIBMAP-Aktion ioctl(2) einsetzen;
 
              * Geräte  für  den  Zugriff auf x86-modellspezifische Register (MSRs, siehe msr(4))
 
                öffnen;
 
              * /proc/sys/vm/mmap_min_addr aktualisieren;
 
              * Speichereinblendungen an Adressen unterhalb des durch  /proc/sys/vm/mmap_min_addr
 
                angegebenen Wertes erstellen;
 
              * Dateien in /proc/bus/pci einblenden;
 
              * /dev/mem und /dev/kmem öffnen;
 
              * verschiedene SCSI-Geräte-Befehle ausführen;
 
              * bestimmte Aktionen auf hpsa(4)- und cciss(4)-Geräten ausführen;
 
              * eine Reihe von Geräte-spezifischen Aktionen auf anderen Geräten ausführen
 
 
 
      CAP_SYS_RESOURCE
 
              * reservierten Platz auf Ext2-Dateisystemen verwenden;
 
              * ioctl(2)-Aufrufe ausführen, die das Journaling von Ext3 steuern;
 
              * Platten-Quota-Begrenzungen außer Kraft setzen;
 
              * Ressourcenbegrenzungen erhöhen (siehe setrlimit(2));
 
              * RLIMIT_NPROC-Ressourcenbegrenzung außer Kraft setzen;
 
              * maximale Anzahl von Konsolen bei der Konsolenzuteilung außer Kraft setzen;
 
              * maximale Anzahl an Tastaturdefinitionen außer Kraft setzen;
 
              * mehr als 64 Hz-Unterbrechungen von der Echtzeituhr erlauben;
 
              * die  msg_qbytes-Begrenzung  für  eine  System-V-Nachrichtenwarteschlange über die
 
                Grenze in /proc/sys/kernel/msgmnb anheben (siehe msgop(2) und msgctl(2));
 
              * erlauben,  die  Ressourcenbegrenzung  RLIMIT_NOFILE  bezüglich  der  Anzahl  der
 
                »laufenden«  Dateideskriptoren  zu  umgehen,  wenn  Dateideskriptoren  an  andere
 
                Prozesse mittels UNIX-Domain-Sockets übergeben werden (siehe unix(7));
 
              * die /proc/sys/fs/pipe-size-max-Begrenzung beim Setzen der  Kapazität  einer  Pipe
 
                mittels des F_SETPIPE_SZ-Befehls fcntl(2) außer Kraft setzen
 
              * F_SETPIPE_SZ  verwenden,  um  die  Kapazität  einer  Pipe  über  die  in
 
                /proc/sys/fs/pipe-max-size angegebene Grenze erhöhen;
 
              * die    /proc/sys/fs/mqueue/queues_max-Begrenzung    beim    Erstellen      von
 
                POSIX-Nachrichtenwarteschlangen (siehe mq_overview(7)) außer Kraft setzen;
 
              * die prctl(2)-Aktion PR_SET_MM einsetzen;
 
              * /proc/[PID]/oom_score_adj  auf  einen  Wert niedriger als den zuletzt durch einen
 
                Prozess mit CAP_SYS_RESOURCE gesetzten Wert setzen
 
 
 
      CAP_SYS_TIME
 
              Systemuhr setzen (settimeofday(2), stime(2), adjtimex(2)); Echtzeit- (Hardware-)Uhr
 
              setzen
 
 
 
      CAP_SYS_TTY_CONFIG
 
              vhangup(2)  einsetzen;  verschiedene  privilegierte ioctl(2)-Aktionen auf virtuelle
 
              Terminals einsetzen
 
 
 
      CAP_SYSLOG (seit Linux 2.6.37)
 
              * Privilegierte syslog(2)-Aktionen ausführen. Siehe  syslog(2)  für  Informationen,
 
                welche Aktionen Privilegien benötigen.
 
              * Über  /proc  bereitgestellte Kernel-Adressen und andere Schnittstellen anschauen,
 
                wenn /proc/sys/kernel/kptr_restrict den Wert 1 hat.  (Lesen  Sie  die  Diskussion
 
                über kptr_restrict in proc(5).)
 
 
 
      CAP_WAKE_ALARM (seit Linux 3.0)
 
              Etwas  auslösen,  dass  das  System  aufwecken  wird  (siehe  die  Zeitgeber
 
              CLOCK_REALTIME_ALARM und CLOCK_BOOTTIME_ALARM)
 
 
 
  Frühere und heutige Implementierungen
 
      Eine komplette Implementierung von Capabilities verlangt folgendes:
 
 
 
      1. Für alle privilegierten Aktionen muss der Kernel prüfen, ob der Thread  die  benötigten
 
          Capabilities in seiner effektiven Menge hat.
 
 
 
      2. Der Kernel muss Systemaufrufe bereitstellen, die es erlauben, dass die Capability-Menge
 
          des Threads geändert und ermittelt wird.
 
 
 
      3. Das Dateisystem muss das Anhängen von Capabilities an ausführbare Dateien erlauben,  so
 
          dass ein Prozess solche Capabilities erhält, wenn die Datei ausgeführt wird.
 
 
 
      Vor  Kernel  2.6.24  waren  nur  die ersten zwei dieser Anforderungen erfüllt, seit Kernel
 
      2.6.24 sind alle drei Anforderungen erfüllt.
 
 
 
  Hinweise für Kernel-Entwickler
 
      Wenn Sie eine neue Kernel-Funktionalität hinzufügen, die  über  eine  Capability  geregelt
 
      werden soll, beachten Sie die nachfolgenden Punkte.
 
 
 
      *  Das  Ziel  von  Capabilitys  besteht  darin,  die Macht des Systembenutzers in Teile zu
 
          zerlegen.  Wird  dann  ein  Programm,  das  eine  oder  mehrere  Capabilitys  hat,
 
          kompromittiert, dann kann weniger Schaden angerichtet werden, als wenn das Programm mit
 
          Root-Rechten liefe.
 
 
 
      *  Sie haben die  Wahl,  entweder  ein  neues  Capability  für  Ihre  neue  Funktionalität
 
          hinzuzufügen,  oder die Funktionalität einer bereits bestehenden Capability zuzuordnen.
 
          Um die Menge der Capabilitys auf eine verwaltbare Größe zu begrenzen, wird  die  zweite
 
          Variante  bevorzugt,  außer  es gibt überzeugende Gründe, die erste Variante zu wählen.
 
          (Es gibt auch eine technische Grenze: Die Größe der Capability-Menge ist derzeit auf 64
 
          bit beschränkt.)
 
 
 
      *  Um  zu  bestimmen, zu welcher bestehenden Capability Ihre neue Funktionalität am besten
 
          zugeordnet werden könnte, prüfen Sie die obige Liste der Capabilitys, um ein »Silo«  zu
 
          finden, in das Ihre neue Funktionalität am besten passt. Ein Vorgehen besteht darin, zu
 
          bestimmen, ob es andere Funktionalitäten gibt, die  Capabilitys  benötigen,  die  immer
 
          zusammen mit Ihrer neuen Funktionalität benötigt werden. Falls Ihre neue Funktionalität
 
          ohne diese andere Funktionalität nutzlos ist, dann sollten Sie die  gleiche  Capability
 
          wie die andere Funktionalität verwenden.
 
 
 
      *  Verwenden  Sie  nicht  CAP_SYS_ADMIN,  falls  Sie  es  irgendwie  vermeiden können. Ein
 
          riesiger  Anteil  an  bestehenden  Capability-Überprüfungen  ist  dieser  Capability
 
          zugeordnet  (siehe  die  Teilliste weiter oben). Sie kann glaubhaft als »der neue Root«
 
          bezeichnet werden, da sie eine große Bandbreite an Rechten verleiht,  und  andererseits
 
          bedeutet  ihr  großer  Geltungsbereich,  dass  es  eine  Capability ist, die von vielen
 
          privilegierten Programmen benötigt wird.  Verschlimmern  Sie  das  Problem  nicht.  Die
 
          einzigen  neuen  Funktionalitäten,  die  CAP_SYS_ADMIN  zugeordnet werden sollten, sind
 
          diejenigen, die eng zu bestehenden Anwendungsfällen in diesem Silo passen.
 
 
 
      *  Falls  Sie  ermittelt  haben,  dass  Sie  wirklich  eine  neue  Capability  für  Ihre
 
          Funktionalität  benötigen,  führen  Sie sie nicht als »Einzelverwendung«-Capability ein
 
          (oder benennen Sie es so). Daher war beispielsweise die Ergänzung der  hochspezifischen
 
          CAP_SYS_PACCT  wahrscheinlich  ein  Fehler.  Versuchen  Sie  stattdessen,  Ihre  neue
 
          Capability als ein breiteres Silo zu identifizieren und zu  benennen,  in  das  andere,
 
          damit im Zusammenhang stehende zukünftige Anwendungsfälle passen könnten.
 
 
 
  Capability-Mengen von Threads
 
      Jeder  Thread  hat  drei  Capability-Mengen,  die  null  oder  mehr  der oben aufgeführten
 
      Capabilities enthalten:
 
 
 
      Permitted (erlaubt):
 
              Dies ist die begrenzende Übermenge für die effektiven Capabilities, die ein  Thread
 
              annehmen  kann.  Es  ist auch die begrenzende Übermenge für die Capabilites, die zu
 
              der vererbbaren Menge durch einen Thread hinzugefügt werden dürfen, der  nicht  die
 
              Capability CAP_SETPCAP in seiner effektiven Menge hat.
 
 
 
              Falls ein Thread eine Capability aus seiner erlaubten Menge entfernt, kann es diese
 
              Capability niemals wiedererlangen (außer es führt ein Set-User-ID-Root-Programm mit
 
              execve(2)  aus  oder  ein  Programm,  dessen  zugeordnete  Datei-Capabilities diese
 
              Capability wieder bewilligen).
 
 
 
      Inheritable (vererbbar):
 
              Dies ist eine Menge von Capabilities, die über execve(2) hinweg  erhalten  bleiben.
 
              Vererbbare  Capabilities  bleiben  bei der Ausführung jedes Programms vererbbar und
 
              vererbbare Capbabilities werden zu der erlaubten Menge  bei  der  Ausführung  eines
 
              Programms,  das die entsprechenden Bits in der Datei-Vererbbaren-Menge gesetzt hat,
 
              hinzugefügt.
 
 
 
              Da vererbbare Capabilities im allgemeinen  nicht  über  execve(2)-Aufrufe  erhalten
 
              werden,  wenn  dies  nicht  als  Benutzer  root  erfolgt,  sollten Anwendungen, die
 
              Hilfsprogramme mit erhöhten Capabilities ausführen wollen, die Verwendung der unten
 
              beschriebenen Umgebungs-Capabilities in Betracht ziehen.
 
 
 
      Effective (effektiv):
 
              Dies  ist  die  Menge  an  Capabilities,  der  vom  Kernel  zur  Durchführung  von
 
              Rechteprüfungen für den Thread verwandt wird.
 
 
 
      Ambient (Umgebung) (seit Linux 4.3):
 
              Dies ist eine Menge von Capabilities, die über execve(2) eines nicht privilegierten
 
              Programms  hinweg  erhalten  bleiben.  Die  Umgebungs-Capability-Menge  folgt  der
 
              Invarianz, dass keine Capability jemals eine Umgebungs-Capability sein kann,  falls
 
              sie nicht sowohl erlaubt als auch vererbbar ist.
 
 
 
              Die  Umgebungs-Capability-Menge  kann  direkt  mit  prctl(2)  verändert  werden.
 
              Umgebungs-Capabilities  werden  automatisch  abgesenkt,  falls  entweder  die
 
              entsprechende erlaubte oder vererbbare Capability abgesenkt wird.
 
 
 
              Wird  ein  Programm ausgeführt, das die UID oder GID aufgrund von set-user-ID- oder
 
              set-group-ID-Bits ändert oder das über eine Menge  an  Datei-Capabilities  verfügt,
 
              dann  wird  die  Umgebungsmenge  geleert.  Umgebungs-Capabilities  werden  zu  der
 
              erlaubten Menge hinzugefügt und der effektiven  Menge  zugewiesen,  wenn  execve(2)
 
              aufgerufen wird.
 
 
 
      Ein  mittels  fork(2)  erstelltes  Kind erbt Kopien der Eltern-Capability-Menge. Lesen Sie
 
      weiter unten eine Diskussion der Behandlung von Capabilities während execve(2).
 
 
 
      Mittels capset(2) kann  ein  Thread  seine  eigenen  Capability-Mengen  bearbeiten  (siehe
 
      unten).
 
 
 
      Seit  Linux  3.2  legt  die  Datei  /proc/sys/kernel/cap_last_cap den numerischen Wert der
 
      höchsten vom laufenden Kernel unterstützten Capability offen. Dies kann zur Bestimmung des
 
      höchsten Bits, das in einer Capability-Gruppe gesetzt werden kann, genutzt werden.
 
 
 
  Datei-Capabilities
 
      Seit  Kernel  2.6.24  unterstützt  der Kernel die Zuordnung von Capability-Mengen zu einer
 
      ausführbaren Datei mittels setcap(8). Die Datei-Capability-Mengen  werden  in  erweiterten
 
      Attributen  namens  security.capability  gespeichert (siehe setxattr(2) und xattr(7)). Das
 
      Schreiben  in  diese  erweiterten  Attribute  benötigt  die  Capability  CAP_SETFCAP.  Die
 
      Datei-Capability-Mengen  bestimmen  zusammen  mit  den  Capability-Mengen  des Threads die
 
      Capabilities nach einem execve(2).
 
 
 
      Die drei Datei-Capabilities-Mengen sind:
 
 
 
      Permitted (erlaubt, früher als forced (erzwungen) bekannt):
 
              Diese Capabilities werden  dem  Thread  automatisch  erlaubt,  unabhängig  von  den
 
              geerbten Capabilities des Threads.
 
 
 
      Inheritable (vererbbar, früher als allowed (erlaubt) bekannt):
 
              Diese Menge wird mittels AND mit der vererbbaren Menge des Threads verknüpft, um zu
 
              bestimmen, welche vererbbaren Capabilities in der erlaubten Menge des Threads  nach
 
              einem execve(2) aktiviert werden.
 
 
 
      Effective (effektiv):
 
              Dies  ist keine Menge, sondern eher ein einziges Bit. Falls dieses Bit gesetzt ist,
 
              dann werden während eines execve(2) die  gesamten  erlaubten  Capabilties  für  den
 
              Thread in die effektive Menge hochgezogen. Falls dieses Bit nicht gesetzt ist, dann
 
              wird nach einem execve(2) keine der erlaubten Capabilities in der neuen  effektiven
 
              Menge sein.
 
 
 
              Aktivieren des effektiven Datei-Capability-Bits impliziert, dass jede erlaubte oder
 
              vererbte Datei-Capability, die  dazu  führt,  dass  ein  Thread  die  entsprechende
 
              erlaubte  Capability  während eines execve(2) erlangt (siehe die oben beschriebenen
 
              Transformationsregeln),  auch  dazu  führt,  dass  er  die  Capability  in  seiner
 
              effektiven  Menge  erlangt.  Werden  daher  Capabilities  zu einer Datei zugeweisen
 
              ((setcap(8), cap_set_file(3), cap_set_fd(3)),  falls  der  effektive  Schalter  für
 
              irgendeine  Capability  aktiviert  ist,  dann  muss der effektive Schalter auch als
 
              aktiviert für alle anderen Capabilities, für die die entsprechenden erlaubten  oder
 
              vererbbaren Schalter aktiviert sind, spezifiziert werden.
 
 
 
  Umwandlungen von Capabilities während execve()
 
      Während  eines  execve(2)  berechnet der Kernel die neuen Capabilities eines Prozesses mit
 
      dem folgenden Algorithmus:
 
 
 
          P'(ambient)    = (Datei ist privilegiert) ? 0 : P(ambient)
 
 
 
          P'(permitted)  = (P(inheritable) & F(inheritable)) |
 
                            (F(permitted) & cap_bset) | P'(ambient)
 
 
 
          P'(effective)  = F(effective) ? P'(permitted) : P'(ambient)
 
 
 
          P'(inheritable) = P(inheritable)    [d.h. unverändert]
 
 
 
      wobei:
 
 
 
          P        bezeichnet den Wert einer Capability-Menge des Threads vor dem execve(2)
 
 
 
          P'        bezeichnet den Wert einer Capability-Menge des Threads nach dem execve(2)
 
 
 
          F        bezeichnet eine Datei-Capability-Menge
 
 
 
          cap_bset  ist der Wert der Capability-Begrenzungsmenge (weiter unten beschrieben)
 
 
 
      Eine privilegierte  Datei  verfügt  über  Capabilities  oder  hat  das  set-user-ID-  oder
 
      set-group-ID-Bit gesetzt.
 
 
 
      Hinweis: Die oben beschriebenen Capability-Übergänge könnten aus den gleichen Gründen, aus
 
      denen auch die Bits set-user-ID and set-group-ID  ignorieert  werden,  nicht  durchgeführt
 
      werden (d.h. Datei-Capabilities könnten ignoriert werden); siehe execve(2).
 
 
 
      Hinweis: Entsprechend den obigen Regeln werden alle Capabilities, die in der erlaubten und
 
      effektiven Menge vorhanden sind, zurückgesetzt, falls  ein  Prozess  mit  einer  von  Null
 
      verschiedenen  Benutzerkennung  ein  execve(2)  durchführt.  Für  die  Behandlung  der
 
      Capabilities, wenn ein Prozess mit der  Benutzerkennung  Null  ein  execve(2)  durchführt,
 
      siehe unten unter Capabilities und Ausführung von Programmen durch root.
 
 
 
  Sicherheitsprüfungen für Capability-unfähige Programme
 
      Ein  Capability-unfähiges Programm ist eine Anwendung, die für Datei-Capabilities markiert
 
      ist, aber noch  nicht  für  die  Verwendung  des  libcap(3)-APIs  zur  Bearbeitung  seiner
 
      Capabilities  konvertiert  wurde.  (Mit  anderen  Worten,  dies  ist  ein  traditionelles
 
      »set-user-ID-root«-Programm, das auf Datei-Capabilities umgestellt wurde, aber dessen Code
 
      nicht  angepasst  wurde,  um  mit Capabilities umzugehen.) Für solche Anwendungen wird das
 
      effektive Capability-Bit auf  die  Datei  gesetzt,  so  dass  die  erlaubten  Capabilities
 
      automatisch  beim Ausführen der Datei in der effektiven Menge aktiviert werden. Der Kernel
 
      erkennt für den hier beschriebenen Zweck eine  Datei,  die  das  effektive  Capability-Bit
 
      gesetzt hat, als Capability-unfähig.
 
 
 
      Beim  Ausführen  eines  Capability-unfähigen  Programms  prüft  der  Kernel  nach den oben
 
      beschriebenen Umwandlungen, ob  der  Prozess  alle  erlaubten  Capabilities,  die  in  der
 
      Datei-erlaubten  Menge  angegeben  wurden,  erlangt  hat. (Ein typischer Grund, warum dies
 
      nicht passieren könnte, liegt  darin,  dass  die  Capability-Begrenzungsmenge  einige  der
 
      Capabilities  in der Datei-erlaubten Menge ausblenden könnte.) Falls der Prozess nicht die
 
      komplette Menge der Datei-erlaubten  Capabilities  erlangte,  schlägt  execve(2)  mit  dem
 
      Fehler  EPERM  fehl.  Dies verhindert mögliche Sicherheitsrisiken, die daraus resultieren,
 
      dass  ein  Capability-unfähiges  Programm  mit  weniger  als  den  benötigten  Privilegien
 
      ausgeführt  wird.  Beachten  Sie,  dass  definitionsgemäß  die Anwendung das Problem nicht
 
      selbst erkennen könnte, da sie nicht das libcap(3)-API einsetzt.
 
 
 
  Capabilities und Ausführung von Programmen durch root
 
      Um während eines execve(2) ein allmächtigen root mit Capability-Mengen bereitzustellen:
 
 
 
      1. Falls ein Set-User-ID-Root-Programm ausgeführt  wird  oder  die  reale  oder  effektive
 
          Benutzer-ID  des  Prozesses 0 (root) ist sind die vererbbaren und erlaubten Dateimengen
 
          komplett auf nur Einsen definiert (d.h. alle Capabilities aktiviert).
 
 
 
      2. Falls ein Set-User-ID-Root-Programm ausgeführt wird oder die effektive Benutzer-ID  des
 
          Prozesses  0  ist  (root),  dann  ist  das  effektive  Datei-Bit  als  Eins (aktiviert)
 
          definiert.
 
 
 
      Das  Fazit  der  obigen    Regeln,    kombiniert    mit    den    oben    beschriebenen
 
      Capability-Umwandlungen, ist folgendes:
 
 
 
      *  Wenn  ein  Prozess  ein  Set-User-ID-Root-Programm mit execve(2) ausführt oder wenn ein
 
          Prozess mit einer effektiven UID von 0  ein  Programm  mit  execve  ausführt,  er  alle
 
          Capabilities  in  seinen erlaubten und effektiven Mengen erhält, außer denen, die durch
 
          die Capability-Begrenzungsmenge maskiert sind.
 
 
 
      *  Wenn ein Prozess mit einer echten UID von 0 ein Programm mit execve(2) ausführt, erhält
 
          es  alle  Capabilities in seiner erlaubten Capability-Menge, außer denen, die durch die
 
          Capability-Begrenzungsmenge maskiert sind.
 
 
 
      Die obigen Schritte ergeben  eine  Semantik,  die  identisch  zu  der  von  traditionellen
 
      UNIX-Systemen ist.
 
 
 
  Set-user-ID-root-Programme die Datei-Capabilities haben
 
      Wird  ein  Programm  ausgeführt,  das  sowohl  set-user-ID-Root  ist  als  auch  über
 
      Datei-Capabilities verfügt, führt dies dazu, dass der Prozess nur die durch  das  Programm
 
      eingeräumten  Capabilities  erlangt (d.h. nicht alle Capabilities, was passierte, wenn ein
 
      set-user-ID-Root-Programm ausgeführt  würde,  das  keine  zugeordneten  Datei-Capabilities
 
      hat). Beachten Sie, dass einem Programm eine leere Capability-Menge zugeordnet werden kann
 
      und es daher möglich ist, ein set-user-ID-root-Programm zu erstellen,  das  die  effektive
 
      und  die  gespeicherte set-user-ID des Progresses, der das Programm ausführt, auf 0 setzt,
 
      aber dem Prozess keine Capabilities gewährt.
 
 
 
  Capability-Begrenzungsmenge
 
      Die Capability-Begrenzungsmenge ist ein Sicherheitsmechanismus,  der  zur  Begrenzung  der
 
      Capabilities,  die  während  eines  execve(2)  erlangt  werden  können,  dienen  kann. Die
 
      Begrenzungsmenge wird auf die folgende Art und Weise benutzt:
 
 
 
      * Während eines  execve(2)  wird  die  Capability-Begrenzungsmenge  mittels  AND  mit  der
 
        erlaubten  Datei-Capability-Menge  verknüpft  und  das  Ergebnis  dieser Aktion wird der
 
        erlaubten  Capability-Menge  des  Threads  zugewiesen.  Die  Capability-Begrenzungsmenge
 
        stellt  daher  eine  Grenze  für  die erlaubten Capabilities dar, die einer ausführbaren
 
        Datei erlaubt werden dürfen.
 
 
 
      * (Seit Linux 2.6.25) Die Capability-Begrenzungsmenge agiert als begrenzende Übermenge für
 
        die  Capabilities,  die  ein  Thread  zu  seiner  vererbbaren  Menge  mittels  capset(2)
 
        hinzufügen kann.  Das  bedeutet,  dass  ein  Thread  eine  Capability  nicht  zu  seiner
 
        vererbbaren Menge hinzufügen kann, falls es nicht in der Begrenzungsmenge enthalten ist,
 
        selbst falls es in seinen erlaubten Capabilities vorhanden ist, wenn er eine  Datei  mit
 
        execve(2) ausführt, die diese Capability in seiner vererbbaren Menge hat.
 
 
 
      Beachten  Sie,  dass  die Begrenzungsmenge die erlaubten Datei-Capabilities maskiert, aber
 
      nicht die vererbbaren Capabilities. Falls ein Thread eine Capability in seiner vererbbaren
 
      Menge  betreut,  die  nicht  in  seiner  Begrenzungsmenge  ist, dann kann er weiterhin die
 
      Capability in seiner erlaubten Menge erlangen, indem er eine  Datei  ausführt,  die  diese
 
      Capability in seiner vererbbaren Menge enthält.
 
 
 
      Abhängig  von  der  Kernelversion  ist  die  Capability-Begrenzungsmenge  entweder  ein
 
      systemweites Attribut oder ein prozessweises Attribut.
 
 
 
      Capability-Begrenzungsmenge vor Linux 2.6.25
 
 
 
      In Kerneln vor 2.6.25 ist die Capability-Begrenzungsmenge ein systemweites  Attribut,  das
 
      alle  Threads  auf  dem  System  betrifft.  Auf  die  Begrenzungsmenge kann über die Datei
 
      /proc/sys/kernel/cap-bound zugegriffen werden. (Zur Erhöhung  der  Konfusion  wird  dieser
 
      Bitmaskenparameter  als  vorzeichenbehaftete  Dezimalzahl  in  /proc/sys/kernel/cap-bound
 
      ausgedrückt.)
 
 
 
      Nur  der  init-Prozess  darf  Capabilities  in  der  Capability-Begrenzungsmenge  setzen;
 
      abgesehen  davon  kann  der  Superuser  (oder  genauer:  ein  Prozess  mit  der Capability
 
      CAP_SYS_MODULE) nur Capabilities aus dieser Menge entfernen.
 
 
 
      Auf einem Standardsystem maskiert die  Capability-Begrenzungsmenge  immer  die  Capability
 
      CAP_SETPCAP.  Um  diese  Einschränkung  zu  entfernen  (gefährlich!),  verändern  Sie  die
 
      Definition von CAP_INIT_EFF_SET in include/linux/capability.h und bauen Ihren Kernel neu.
 
 
 
      Die  systemweite  Capability-Begrenzungsmengenfunktion  wurde  Linux  in  Version  2.2.11
 
      hinzugefügt.
 
 
 
      Capability-Begrenzungsmenge seit Linux 2.6.25
 
 
 
      Seit  Linux  2.6.25  ist die Capability-Begrenzungsmenge ein pro-Thread-Attribut. (Es gibt
 
      keine systemweite Capability-Begrenzungsmenge mehr.)
 
 
 
      Die Begrenzungsmenge wird bei fork(2) von dem Elternprozess des Threads vererbt und bleibt
 
      über ein execve(2) erhalten.
 
 
 
      Ein  Thread  kann  mittels  der  Aktion  prctl(2)  PR_CAPBSET_DROP Capabilities aus seiner
 
      Begrenzungsmenge entfernen, vorausgesetzt er  verfügt  über  die  Capability  CAP_SETPCAP.
 
      Sobald eine Capability aus der Begrenzungsmenge entfernt wurde, kann sie nicht mehr zu der
 
      Menge  wieder  hinzugefügt  werden.  Ein  Thread  kann  mittels  der  Aktion  prctl(2)
 
      PR_CAPBSET_READ herausfinden, ob eine Capability in seiner Begrenzungsmenge liegt.
 
 
 
      Entfernen  von  Capabilities   aus  der  Begrenzungsmenge  ist  nur  möglich,  falls
 
      Datei-Capabilities in den Kernel kompiliert wurden. In  Kerneln  vor  Linux  2.6.33  waren
 
      Datei-Capabilities    eine    optionale    Funktionalität,    die  mittels  der  Option
 
      CONFIG_SECURITY_FILE_CAPABILITIES  konfigurierbar  war.  Seit  Linux  2.6.33  ist  die
 
      Konfigurationsoption  entfernt  und  Datei-Capabilities  sind immer Teil des Kernels. Wenn
 
      Datei-Capabilities in den Kernel kompiliert sind,  beginnt  der  init-Prozess  (der  Urahn
 
      aller  Prozesse)  mit einer kompletten Begrenzungsmenge. Falls Datei-Capabilities nicht in
 
      den Kernel kompiliert sind, dann beginnt init  mit  einer  vollständigen  Begrenzungsmenge
 
      ohne  CAP_SETPCAP,  da  diese  Capability  eine  andere  Bedeutung  hat,  wenn  es  keine
 
      Datei-Capabilities gibt.
 
 
 
      Die Entfernung einer Capability aus  der  Begrenzungsmenge  entfernt  sie  nicht  aus  der
 
      vererbbaren  Menge des Threads. Allerdings verhindert es das Zurückfügen in die vererbbare
 
      Menge des Threads in der Zukunft.
 
 
 
  Effekt von Benutzer-ID-Änderungen auf Capabilities
 
      Um die traditionellen Semantiken für Übergänge zwischen 0 und von 0 verschiedenen  IDs  zu
 
      erhalten,  führt der Kernel folgende Änderungen an den Capability-Mengen eines Threads bei
 
      Änderung  der  echten,  effektiven,  gespeicherten  und  Dateisystem-Benutzer-ID  (unter
 
      Verwendung von setuid(2), setresuid(2) oder ähnlich) durch:
 
 
 
      1. Falls einer der realen, effektiven oder gespeicherten Set-User-IDs vorher 0 war und als
 
          Ergebnis der UID-Änderung alle dieser IDs eine von 0  verschiedenen  Wert  haben,  dann
 
          werden  alle Capabilities aus den erlaubten, effektiven und Umgebungs-Capability-Mengen
 
          gelöscht.
 
 
 
      2. Falls die effektive Benutzer-ID von 0 auf einen von 0 verschiedenen Wert geändert wird,
 
          werden alle Capabilities aus der effektiven Menge gelöscht.
 
 
 
      3. Falls die effektive Benutzer-ID von einem von 0 verschiedenen Wert auf 0 geändert wird,
 
          dann wird die erlaubte Menge in die effektive Menge kopiert.
 
 
 
      4. Falls die Dateisystem-Benutzer-ID von 0 auf einen anderen  Wert  geändert  wird  (siehe
 
          setfsuid(2)), dann werden die folgenden Capabilities aus der effektiven Menge entfernt:
 
          CAP_CHOWN,    CAP_DAC_OVERRIDE,    CAP_DAC_READ_SEARCH,    CAP_FOWNER,    CAP_FSETID,
 
          CAP_LINUX_IMMUTABLE  (seit  Linux  2.6.30),  CAP_MAC_OVERRIDE und CAP_MKNOD (seit Linux
 
          2.6.30). Falls die Dateisystem-UID von einem von 0 verschiedenen Wert  auf  0  geändert
 
          wird, dann werden alle dieser Capabilities, die in der erlaubten Menge aktiviert waren,
 
          in der effektiven Menge aktiviert.
 
 
 
      Falls ein Thread, der einen Wert 0 für mindestens eine seiner Benutzer-IDs hat, verhindern
 
      möchte,  dass  seine  erlaubte  Capability-Menge  bereinigt  wird,  wenn  er  alle  seine
 
      Benutzer-IDs auf einen von 0 verschiedenen Wert setzt, kann  er  dies  mittels  der  unten
 
      beschriebenen SECBIT_KEEP_CAPS-Securebits-Schaltern erreichen.
 
 
 
  Programmatische Anpassung von Capability-Mengen
 
      Ein  Thread kann seine Capability-Mengen mittels der Systemaufrufe capget(2) und capset(2)
 
      ermitteln  und  ändern.  Allerdings  werden  für  diesen  Zweck  die  Verwendung  von
 
      cap_get_proc(3)  und cap_set_proc(3), beide im Paket libcap bereitgestellt, empfohlen. Die
 
      folgenden Regeln bestimmen die Änderungen an den Capability-Mengen des Threads:
 
 
 
      1. Falls der Aufrufende nicht über die Capability CAP_SETPCAP verfügt, dann muss die  neue
 
          vererbbare  Menge  eine  Teilmenge  der  Kombination  der  bestehenden  vererbbaren und
 
          erlaubten Menge sein.
 
 
 
      2. (Seit Linux 2.6.25) Die neue vererbbare Menge muss eine Teilmenge der  Kombination  der
 
          bestehenden vererbbaren Menge und der Capability-Begrenzungsmenge sein.
 
 
 
      3. Die  neue erlaubte Menge muss eine Teilmenge der bestehenden erlaubten Menge sein (d.h.
 
          es ist nicht möglich, erlaubte Capabilities zu erlangen, die der Thread  derzeit  nicht
 
          hat).
 
 
 
      4. Die neue effektive Menge muss eine Teilmenge der neuen erlaubten Menge sein.
 
 
 
  Der Schalter securebits: eine reine Capability-Umgebung einrichten
 
      Beginnend  mit  Kernel  2.6.26  und  mit einem Kernel, in dem Datei-Capabilities aktiviert
 
      sind,  implementiert  Linux  eine  Menge  von  pro-Thread-securebits-Schaltern,  die  zur
 
      Deaktivierung  von spezieller Handhabung von Capabilities für UID 0 (root) verwandt werden
 
      können. Dies sind die folgenden Schalter:
 
 
 
      SECBIT_KEEP_CAPS
 
              Durch Setzen dieses Schalters darf ein Thread,  der  mindestens  eine  0  UID  hat,
 
              Capabilities  in  seiner erlaubten und effektiven Menge behalten, wenn er alle UIDs
 
              auf von 0 verschiedene Werte umschaltet. Falls dieser Schalter nicht  gesetzt  ist,
 
              dann führt das Umschalten der UIDs dazu, dass er alle Capabilities in diesen Mengen
 
              verliert. Dieser Schalter wird bei execve(2) immer bereinigt.
 
 
 
              Die Einstellung des Schalters SECBIT_KEEP_CAPS wird ignoriert, falls  der  Schalter
 
              SECBIT_NO_SETUID_FIXUP  gesetzt  ist. (Letzterer Schalter stellt eine Übermenge des
 
              Effekts des ersteren Schalters bereit.)
 
 
 
              Dieser Schalter stellt die gleiche Funktionalität wie die  ältere  Aktion  prctl(2)
 
              PR_SET_KEEPCAPS bereit.
 
 
 
      SECBIT_NO_SETUID_FIXUP
 
              Setzen  dieses  Schalters  hindert  den Kernel daran, die erlaubten, effektiven und
 
              Umgebungs-Capability-Mengen des Prozesses anzupassen, wenn die  effektive  und  die
 
              Dateisystem-UID  eines  Threads  zwischen  null  und  von null verschiedenen Werten
 
              umgeschaltet werden. (Lesen Sie den Abschnitt Effekt von Benutzer-ID-Änderungen auf
 
              Capabilities)
 
 
 
      SECBIT_NOROOT
 
              Falls dieses Bit gesetzt ist, dann verleiht der Kernel keine Capabilities, wenn ein
 
              Set-User-ID-Root-Programm  ausgeführt  wird  oder  wenn  ein  Prozess  mit  einer
 
              effektiven  oder  realen  UID  von  0  execve(2)  aufruft. (Lesen Sie den Abschnitt
 
              Capabilities und Ausführung von Programmen durch root)
 
 
 
      SECBIT_NO_CAP_AMBIENT_RAISE
 
              Durch  Setzen  dieses  Schalters  dürfen  keine  Umgebungs-Capabilities  mit  der
 
              prctl(2)-Aktion PR_CAP_AMBIENT_RAISE gehoben werden.
 
 
 
      Jeder der obigen »basis«-Schalter hat einen begleitenden »gesperrten« Schalter. Das Setzen
 
      eines »gesperrten« Schalters ist unumkehrbar und hat den Effekt, dass  weitere  Änderungen
 
      an dem entsprechenden Basisschalter nicht mehr möglich sind. Die gesperrten Schalter sind:
 
      SECBIT_KEEP_CAPS_LOCKED,    SECBIT_NO_SETUID_FIXUP_LOCKED,    SECBIT_NOROOT_LOCKED    und
 
      SECBIT_NO_CAP_AMBIENT_RAISE_LOCKED.
 
 
 
      Die  Schalter  securebits  können  mit  den  Aktionen  prctl(2)  PR_SET_SECUREBITS  und
 
      PR_GET_SECUREBITS geändert und abgefragt werden. Die Capability CAP_SETPCAP wird  für  die
 
      Veränderung der Schalter benötigt.
 
 
 
      Die  Schalter  securebits werden von Kindprozessen vererbt. Während eines execve(2) werden
 
      alle Schalter beibehalten, außer SECBIT_KEEP_CAPS, das immer bereinigt wird.
 
 
 
      Eine Anwendung kann den  folgenden  Aufruf  verwenden,  um  sich  selbst  und  alle  seine
 
      Abkömmlinge  in  eine Umgebung zu sperren, in der die einzige Möglichkeit, Capabilities zu
 
      erlangen,  darin  besteht,  ein  Programm  auzuführen,  das  über  die  zugeordneten
 
      Datei-Capabilities verfügt:
 
 
 
          prctl(PR_SET_SECUREBITS,
 
                /* SECBIT_KEEP_CAPS off */
 
                  SECBIT_KEEP_CAPS_LOCKED |
 
                  SECBIT_NO_SETUID_FIXUP |
 
                  SECBIT_NO_SETUID_FIXUP_LOCKED |
 
                  SECBIT_NOROOT |
 
                  SECBIT_NOROOT_LOCKED);
 
                  /* Setzen/Sperren von SECBIT_NO_CAP_AMBIENT_RAISE
 
                      ist nicht erforderlich */
 
 
 
  Interaktion mit Benutzer-Namensräumen
 
      Für  eine  Diskussion der Interaktion von Capabilities und Benutzer-Namensräumen lesen Sie
 
      user_namespaces(7).
 
 
 
KONFORM ZU
 
      Keine Standards regeln Capabilities; die Linux-Capability-Implementierung basiert aber auf
 
      dem zurückgezogenen POSIX.1e-Entwurfsstandard; siehe ⟨http://wt.tuxomania.net/publications
 
      /posix.1e/⟩
 
 
 
ANMERKUNGEN
 
      Von Kernel 2.5.27 bis Kernel 2.6.26 waren Capabilities  eine  optionale  Kernelkomponente,
 
      die über die Kernelkonfigurationsoption CONFIG_SECURITY_CAPABILITIES aktiviert/deaktiviert
 
      werden könnte.
 
 
 
      Die Datei /proc/[PID]/task/TID/status kann  zum  Betrachten  der  Capability-Mengen  eines
 
      Threads  verwandt  werden.  Die  Datei  /proc/[PID]/status zeigt die Capability-Mengen des
 
      Haupt-Threads eines Prozesses. Vor Linux 3.8 wurden  nicht  existierende  Capabilities  in
 
      diesen  Mengen als aktiviert (1) angezeigt. Seit Linux 3.8 werden alle nicht existierenden
 
      Capabilities (über CAP_LAST_CAP) als deaktiviert (0) angezeigt.
 
 
 
      Das Paket libcap stellt eine Suite von Routinen zum Setzen und Abfragen  von  Capabilities
 
      bereit,  die komfortablere und änderungsstabilere Schnittstellen als die von capset(2) und
 
      capget(2) bereitstellen. Dieses Paket stellt auch die Programme  setcap(8)  und  getcap(8)
 
      zur Verfügung. Es kann unter folgender Adresse gefunden werden:
 
      ⟨http://www.kernel.org/pub/linux/libs/security/linux-privs⟩
 
 
 
      Vor  Kernel 2.6.24 und von Kernel 2.6.24 bis Kernel 2.6.32, falls Datei-Capabilities nicht
 
      aktiviert sind, kann ein Thread  mit  der  Capability  CAP_SETPCAP  die  Capabilities  von
 
      anderen  Threads manipulieren. Allerdings ist dies nur theoretisch möglich, da kein Thread
 
      jemals über CAP_SETPCAP in einem der folgenden Fälle verfügt:
 
 
 
      * In der pre-2.6.25-Implementierung maskiert die  systemweite  Capability-Begrenzungsmenge
 
        /proc/sys/kernel/cap-bound  diese  Capability  immer  und dies kann ohne Veränderung der
 
        Kernelquellen und dessen Neubau nicht geändert werden.
 
 
 
      * Falls Datei-Capabilities in der aktuellen Implementierung deaktiviert sind, dann startet
 
        init  derart,  dass  diese Capability aus seiner prozessweisen Begrenzungsmenge entfernt
 
        ist und dass die Begrenzungsmenge von  allen  anderen  im  System  erstellten  Prozessen
 
        vererbt wird.
 
 
 
SIEHE AUCH
 
      capsh(1),    setpriv(1),    prctl(2),    setfsuid(2),    cap_clear(3),    cap_copy_ext(3),
 
      cap_from_text(3), cap_get_file(3), cap_get_proc(3), cap_init(3),  capgetp(3),  capsetp(3),
 
      libcap(3),  proc(5),  credentials(7),  pthreads(7),  user_namespaces(7),  captest(8),
 
      filecap(8), getcap(8), netcap(8), pscap(8), setcap(8)
 
 
 
      include/linux/capability.h in dem Linux-Kernelquellbaum
 
 
 
KOLOPHON
 
      Diese Seite  ist  Teil  der  Veröffentlichung  4.15  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  FIXME:  Einheitliche  Übersetzung
 
      von  Transformation,  Helge  Kreutzmann  <debian@helgefjell.de>  und  Dr. Tobias Quathamer
 
      <toddy@debian.org> 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>.
 

Version vom 10. Januar 2023, 07:36 Uhr