Man page - capabilities(7)

Packages contains this manual

Available languages:

en fr pt_BR pl ja ru ro de

Manual

Capacités

NOM
DESCRIPTION
Liste des capacités
Implémentations passées et actuelles
Remarques pour les développeurs du noyau
Ensembles de capacités des threads
Capacités de fichier
Versionnage d’attributs Ă©tendus de capacitĂ© de fichier
Transformation des capacitĂ©s lors d’un appel execve()
Vérification de sécurité pour les binaires passives aux capacités
Capacités et exécution de programmes par le superutilisateur
Les programmes set-user-ID-root qui ont des capacités de fichier
Ensemble de limitation des capacités
Effet des modifications d’UID sur les capacitĂ©s
Ajuster les ensembles de capacités par programmation
Les attributs « securebits » : configuration d’un environnement restreintaux capacitĂ©s de fichier.
Programmes « set-user_ID-root » par espace de noms utilisateur
Capacités de fichier mises dans un espace de noms
Interaction avec les espaces de noms
STANDARDS
NOTES
VOIR AUSSI
TRADUCTION

NOM

capabilities – PrĂ©sentation des capacitĂ©s Linux

DESCRIPTION

Pour vĂ©rifier les permissions, les implĂ©mentations UNIX traditionnelles distinguent deux catĂ©gories de processus : les processus privilĂ©giĂ©s (dont l’UID effectif est 0, appelĂ© superutilisateur ou root) et les processus non privilĂ©giĂ©s (dont les UID effectifs sont diffĂ©rents de zĂ©ro). Les processus privilĂ©giĂ©s contournent toutes les vĂ©rifications de permissions du noyau, alors que les processus non privilĂ©giĂ©s sont soumis Ă  une vĂ©rification complĂšte basĂ©e sur l’identification du processus (habituellement : UID effectif, GID effectif et liste des groupes additionnels).

À partir de Linux 2.2, Linux scinde les privilĂšges traditionnellement associĂ©s au superutilisateur en unitĂ©s distinctes, connues sous le nom de capabilities (capacitĂ©s) que l’on peut activer ou inhiber individuellement. Les capacitĂ©s sont des attributs individuels Ă  chaque thread.

Liste des capacités

La liste suivante indique les capacités implémentées sous Linux et les opérations ou comportements que chaque capacité permet :
CAP_AUDIT_CONTROL
(depuis Linux 2.6.11)

Activer et dĂ©sactiver l’audit du noyau, changer les rĂšgles de filtrage d’audit, accĂ©der Ă  l’état de l’audit et aux rĂšgles de filtrage.

CAP_AUDIT_READ (depuis Linux 3.16)

Autoriser la lecture du journal d’audit au moyen d’un socket netlink multidiffusion.

CAP_AUDIT_WRITE (depuis Linux 2.6.11)

Écrire des enregistrements dans le journal d’audit du noyau.

CAP_BLOCK_SUSPEND (depuis Linux 3.5)

Utiliser des fonctionnalités qui peuvent bloquer la mise en veille du systÚme ( epoll (7) EPOLLWAKEUP , /proc/sys/wake_lock ).

CAP_BPF (depuis Linux 5.8)

Utiliser des opérations BPF privilégiées ; consultez bpf (2) et bpf-helpers (7).

Cette capacité a été ajoutée dans Linux 5.8 pour séparer la fonctionnalité BPF de la capacité CAP_SYS_ADMIN surchargée.

CAP_CHECKPOINT_RESTORE (depuis Linux 5.9)

-

Mettre à jour /proc/sys/kernel/ns_last_pid (consultez pid_namespaces (7)) ;

-

Utiliser la fonction set_tid de clone3 (2) ;

-

Lire le contenu des liens symboliques dans /proc/ pid /map_files pour les autres processus.

Cette capacité a été ajoutée dans Linux 5.9 pour séparer la fonctionnalité checkpoint/restore de la capacité CAP_SYS_ADMIN surchargée.

CAP_CHOWN

Effectuer toute modification des UID et GID de fichiers (consultez chown (2)).

CAP_DAC_OVERRIDE

Contourner les vĂ©rifications des permissions de lecture, Ă©criture et exĂ©cution. (DAC est l’abrĂ©viation de « discretionary access control », contrĂŽle d’accĂšs Ă  volontĂ©).

CAP_DAC_READ_SEARCH

-

Contourner les vĂ©rifications des permissions de lecture de fichiers et celles de lecture et d’exĂ©cution des rĂ©pertoires ;

-

invoquer open_by_handle_at (2) ;

-

utiliser l’attribut AT_EMPTY_PATH de linkat (2) pour crĂ©er un lien vers un fichier visĂ© par un descripteur de fichier.

CAP_FOWNER

-

Contourner les vĂ©rifications pour les opĂ©rations qui demandent que l’UID de systĂšme de fichiers du processus corresponde Ă  l’UID du fichier (par exemple chmod (2), utime (2)), Ă  l’exclusion des opĂ©rations couvertes par CAP_DAC_OVERRIDE et CAP_DAC_READ_SEARCH ;

-

positionner les attributs d’inƓuds (consultez FS_IOC_SETFLAGS (2const)) pour n’importe quel fichier ;

-

positionner les listes de contrĂŽle d’accĂšs ACL (« Access Control Lists ») pour n’importe quel fichier ;

-

ignorer le « sticky bit » des répertoires pour les suppressions de fichier ;

-

modifier les attributs Ă©tendus user sur un rĂ©pertoire avec le sticky bit dĂ©fini, appartenant Ă  n’importe quel utilisateur ;

-

spĂ©cifier O_NOATIME dans open (2) et fcntl (2) pour n’importe quel fichier.

CAP_FSETID

-

Ne pas effacer les bits de mode set-user-ID et set-group-ID lors de la modification d’un fichier ;

-

positionner le bit Set-group-ID sur un fichier dont le GID ne correspond pas au systĂšme de fichiers ni Ă  aucun GID additionnel du processus appelant.

CAP_IPC_LOCK

-

Verrouiller des pages mémoire ( mlock (2), mlockall (2), mmap (2), shmctl (2)) ;

-

allouer des pages mémoire utilisant des pages larges ( memfd_create (2), mmap (2), shmctl (2)).

CAP_IPC_OWNER

Contourner les vérifications de permission pour les opérations sur les objets IPC System V.

CAP_KILL

Contourner les vĂ©rifications de permission pour l’émission de signaux (consultez kill (2)). Cette capacitĂ© inclut l’utilisation de l’opĂ©ration KDSIGACCEPT d’ ioctl (2).

CAP_LEASE (depuis Linux 2.4)

Demander des baux (leases) sur n’importe quel fichier (consultez fcntl (2)).

CAP_LINUX_IMMUTABLE

Positionner les attributs d’inƓuds FS_APPEND_FL et FS_IMMUTABLE_FL (consultez FS_IOC_SETFLAGS (2const)).

CAP_MAC_ADMIN (depuis Linux 2.6.25)

Permettre les modifications de la configuration ou des états MAC. Implémentée pour le module LSM (Smack Linux Security Module).

CAP_MAC_OVERRIDE (depuis Linux 2.6.25)

Surcharger les contrĂŽles d’accĂšs MAC (« Mandatory Access Control »). ImplĂ©mentĂ©e pour le module Smack LSM.

CAP_MKNOD (depuis Linux 2.4)

Créer des fichiers spéciaux avec mknod (2).

CAP_NET_ADMIN

Effectuer diverses opérations liées au réseau :

-

configuration des interfaces ;

-

administration du pare-feu, de la traduction d’adresse IP (« masquerading ») et collection de donnĂ©es sur le trafic rĂ©seau (« accounting ») ;

-

modification des tables de routages ;

-

attachement à n’importe quelle adresse pour un service mandataire transparent ;

-

sélection du type de service (« TOS ») ;

-

effacement des statistiques du pilote ;

-

sélection du mode « promiscuité » ;

-

activation de la diffusion multipoint (« multicast ») ;

-

utilisation de setsockopt (2) pour définir les options de sockets suivantes : SO_DEBUG , SO_MARK , SO_PRIORITY (pour une priorité en dehors des valeurs de 0 à 6), SO_RCVBUFFORCE et SO_SNDBUFFORCE .

CAP_NET_BIND_SERVICE

Attacher un socket Ă  un port privilĂ©giĂ© du domaine de l’Internet (numĂ©ro de port infĂ©rieur Ă  1024).

CAP_NET_BROADCAST

(Inutilisé) diffusion par socket et écoute de multidiffusion.

CAP_NET_RAW

-

Utiliser des sockets RAW et PACKET ;

-

attacher à n’importe quelle adresse pour un service mandataire transparent.

CAP_PERFMON (depuis Linux 5.8)

Utiliser divers mécanismes de suivi des performances dont :

-

appeler perf_event_open (2) ;

-

utiliser diverses opérations BPF qui ont des incidences sur les performances.

Cette capacité a été ajoutée dans Linux 5.8 pour séparer la fonctionnalité de suivi des performances de la capacité CAP_SYS_ADMIN surchargée. Consultez aussi le fichier source du noyau Documentation/admin-guide/perf-security.rst .

CAP_SETGID

-

Faire des manipulations arbitraires des GID et de la liste de GID additionnels des processus ;

-

simuler des GID lors du passage de références de sockets au moyen de sockets de domaine UNIX ;

-

écrire une projection de GID dans un espace de noms utilisateur (consultez user_namespaces (7)).

CAP_SETFCAP (depuis Linux 2.6.24)

Définir des capacités arbitraires sur un fichier

Depuis Linux 5.12, cette capacitĂ© est aussi nĂ©cessaire pour projeter l’UID 0 dans un nouvel espace de noms utilisateur ; pour en savoir plus consultez user_namespaces (7).

CAP_SETPCAP

Si les capacitĂ©s de fichier sont prises en charge (c’est-Ă -dire depuis Linux 2.6.24) : ajouter toute capacitĂ© de l’ensemble de limitation de capacitĂ©s du thread appelant Ă  son ensemble hĂ©rité ; supprimer les capacitĂ©s de l’ensemble de limitation de capacitĂ©s (avec prctl (2) PR_CAPBSET_DROP ) ; modifier les attributs securebits .

Si les capacitĂ©s de fichier ne sont pas prises en charge (c’est-Ă -dire avec les noyaux antĂ©rieurs Ă  Linux 2.6.24) : accorder ou interdire toute capacitĂ© dans l’ensemble des capacitĂ©s permises de l’appelant vers ou depuis tout autre processus (cette propriĂ©tĂ© de CAP_SETPCAP n’est pas disponible quand le noyau est configurĂ© pour prendre en charge les capacitĂ©s de fichiers, puisque CAP_SETPCAP a une toute autre sĂ©mantique pour ces noyaux).

CAP_SETUID

-

Faire des manipulations arbitraires des UID de processus ( setuid (2), setreuid (2), setresuid (2), setfsuid (2)) ;

-

simuler des UID lors du passage de références de sockets au moyen de sockets de domaine UNIX ;

-

Ă©crire une projection de l’UID dans un espace de noms utilisateur (consultez user_namespaces (7)).

CAP_SYS_ADMIN

Remarque : cette capacité est surchargée : voir les Notes pour les développeurs du noyau ci-dessous.

-

Effectuer certaines opĂ©rations d’administration systĂšme comme : quotactl (2), mount (2), umount (2), pivot_root (2), swapon (2), swapoff (2), sethostname (2) et setdomainname (2) ;

-

effectuer des opĂ©rations syslog (2) nĂ©cessitant des droits (depuis Linux 2.6.37, CAP_SYSLOG doit ĂȘtre utilisĂ©e pour permettre de telles opĂ©rations) ;

-

effectuer une commande VM86_REQUEST_IRQ vm86 (2) ;

-

accĂ©der Ă  la mĂȘme fonctionnalitĂ© checkpoint/restore qui est contrĂŽlĂ©e par CAP_CHECKPOINT_RESTORE (mais cette derniĂšre capacitĂ© plus faible est prĂ©fĂ©rĂ©e pour accĂ©der Ă  cette fonctionnalitĂ©) ;

-

effectuer les mĂȘmes opĂ©rations BPF que celles contrĂŽlĂ©es par CAP_BPF (mais cette derniĂšre capacitĂ© plus faible est prĂ©fĂ©rĂ©e pour accĂ©der Ă  cette fonctionnalitĂ©) ;

-

utiliser les mĂȘmes mĂ©canismes de suivi des performances qui sont contrĂŽlĂ©s par CAP_PERFMON (mais cette derniĂšre capacitĂ© plus faible est prĂ©fĂ©rĂ©e pour accĂ©der Ă  cette fonctionnalitĂ©) ;

-

effectuer des opĂ©rations IPC_SET et IPC_RMID sur n’importe quel objet IPC System V ;

-

ne pas tenir compte de la limite de ressource RLIMIT_NPROC ;

-

effectuer des opérations sur les attributs étendus trusted et security (consultez xattr (7)) ;

-

utiliser lookup_dcookie (2) ;

-

utiliser ioprio_set (2) pour configurer une classe d’ordonnancement d’E/S IOPRIO_CLASS_RT et (avant Linux 2.6.25) IOPRIO_CLASS_IDLE ;

-

simuler des PID lors du passage de références de sockets au moyen de sockets de domaine UNIX ;

-

dépasser /proc/sys/fs/file-max , la limite systÚme du nombre de fichiers ouverts dans les appels systÚme qui ouvrent des fichiers (par exemple accept (2), execve (2), open (2) et pipe (2)) ;

-

utiliser les attributs CLONE_* qui crĂ©ent de nouveaux espaces de noms avec clone (2) et unshare (2) (mais, depuis Linux 3.8, la crĂ©ation d’espaces de noms utilisateur ne nĂ©cessite aucune capacitĂ©) ;

-

accĂ©der aux informations d’évĂ©nements perf nĂ©cessitant des droits ;

-

appeler setns (2) (nĂ©cessite la capacitĂ© CAP_SYS_ADMIN dans l’espace de noms target ;

-

appeler fanotify_init (2) ;

-

effectuer des opérations KEYCTL_CHOWN et KEYCTL_SETPERM de keyctl (2) nécessitant des droits ;

-

effectuer une opération madvise (2) MADV_HWPOISON ;

-

utiliser la commande TIOCSTI de ioctl (2) pour insĂ©rer des caractĂšres dans la file d’entrĂ©es d’un terminal autre que le terminal de contrĂŽle de l’appelant ;

-

utiliser l’appel systùme obsolùte nfsservctl (2) ;

-

utiliser l’appel systùme obsolùte bdflush (2) ;

-

effectuer diverses opérations ioctl (2) sur des périphériques bloc nécessitant des droits ;

-

effectuer diverses opérations ioctl (2) sur des systÚmes de fichiers nécessitant des droits ;

-

effectuer des opérations ioctl (2) nécessitant des droits sur le périphérique /dev/random (consultez random (4)) ;

-

installer un filtre seccomp (2) sans avoir Ă  dĂ©finir d’abord l’attribut de thread no_new_privs ;

-

modifier les rĂšgles d’autorisation ou d’interdiction pour les groupes de contrĂŽle de pĂ©riphĂ©rique ;

-

utiliser l’opĂ©ration PTRACE_SECCOMP_GET_FILTER de ptrace (2) pour vider les filtres seccomp de l’observé ;

-

utiliser l’opĂ©ration PTRACE_SETOPTIONS de ptrace (2) pour suspendre les protections seccomp de l’observĂ© (c’est-Ă -dire l’attribut PTRACE_O_SUSPEND_SECCOMP ) ;

-

effectuer des opĂ©rations d’administration sur de nombreux pilotes de pĂ©riphĂ©riques ;

-

modifier les valeurs de courtoisie de l’autogroupe en Ă©crivant dans /proc/ pid /autogroup (consultez sched (7)).

CAP_SYS_BOOT

Utiliser reboot (2) et kexec_load (2).

CAP_SYS_CHROOT

-

Utiliser chroot (2) ;

-

modifier l’espace de noms montage en utilisant setns (2).

CAP_SYS_MODULE

-

Charger ou décharger des modules noyaux (consultez init_module (2) et delete_module (2)) ;

-

avant Linux 2.6.25 : enlever des capacitĂ©s de l’ensemble de limitation de capacitĂ©s au niveau du systĂšme.

CAP_SYS_NICE

-

Baisser la valeur de courtoisie (« nice ») ( nice (2), setpriority (2)) et changer la courtoisie de n’importe quel processus ;

-

dĂ©finir les politiques d’ordonnancement temps rĂ©el pour le processus appelant et les politiques d’ordonnancement et les prioritĂ©s de n’importe quel processus ( sched_setscheduler (2), sched_setparam (2), sched_setattr (2)) ;

-

dĂ©finir l’affinitĂ© CPU pour n’importe quel processus ( sched_setaffinity (2)) ;

-

dĂ©finir la classe et la prioritĂ© d’ordonnancement d’entrĂ©es/sorties pour n’importe quel processus ( ioprio_set (2)) ;

-

appliquer migrate_pages (2) à n’importe quel processus et migrer un processus vers n’importe quel nƓud ;

-

appliquer move_pages (2) pour n’importe quel processus ;

-

utiliser l’attribut MPOL_MF_MOVE_ALL avec mbind (2) et move_pages (2).

CAP_SYS_PACCT

Utiliser acct (2).

CAP_SYS_PTRACE

-

Suivre n’importe quel processus avec ptrace (2) ;

-

appliquer get_robust_list (2) à n’importe quel processus ;

-

transfĂ©rer les donnĂ©es depuis ou vers la mĂ©moire de n’importe quel processus au moyen de process_vm_readv (2) et de process_vm_writev (2) ;

-

examiner les processus avec kcmp (2).

CAP_SYS_RAWIO

-

Effectuer des opĂ©rations d’entrĂ©es-sorties ( iopl (2) et ioperm (2)) ;

-

accéder à /proc/kcore ;

-

utiliser l’opĂ©ration FIBMAP de ioctl (2) ;

-

ouvrir les pĂ©riphĂ©riques pour accĂ©der aux registres spĂ©cifiques au modĂšle (MSR, consultez msr (4)) d’un processeur x86 ;

-

mettre Ă  jour /proc/sys/vm/mmap_min_addr ;

-

créer des projections en mémoire aux adresses inférieures à la valeur indiquée par /proc/sys/vm/mmap_min_addr ;

-

projeter les fichiers dans /proc/bus/pci ;

-

ouvrir /dev/mem et /dev/kmem ;

-

effectuer diverses commandes de périphérique SCSI ;

-

effectuer certaines opérations sur les périphériques hpsa (4) et cciss (4) ;

-

effectuer certaines opĂ©rations spĂ©cifiques Ă  un pĂ©riphĂ©rique sur d’autres pĂ©riphĂ©riques.

CAP_SYS_RESOURCE

-

Utiliser de l’espace rĂ©servĂ© sur des systĂšmes de fichiers ext2 ;

-

effectuer des appels ioctl (2) pour contrÎler la journalisation ext3 ;

-

ne pas tenir compte des limites de quota disque ;

-

augmenter les limites de ressources (consultez setrlimit (2)) ;

-

ne pas tenir compte de la limite de ressource RLIMIT_NPROC ;

-

ne pas tenir compte du nombre maximal de consoles sur l’allocation de console ;

-

ne pas tenir compte du nombre maximal de dispositions de clavier ;

-

permettre des interruptions Ă  plus de 64 Hz depuis l’horloge temps rĂ©el ;

-

augmenter la limite msg_qbytes pour la file de messages System V au-dessus de la limite /proc/sys/kernel/msgmnb (consultez msgop (2) et msgctl (2)) ;

-

permettre le contournement de la limite de ressource RLIMIT_NOFILE sur le nombre de descripteurs de fichiers « en cours » lors de leur transmission Ă  un autre processus au moyen d’un socket de domaine UNIX (consultez unix (7)) ;

-

ne pas tenir compte de la limite /proc/sys/fs/pipe-size-max lors du rĂ©glage de la capacitĂ© d’un tube avec la commande fcntl (2) avec l’argument F_SETPIPE_SZ ;

-

utiliser F_SETPIPE_SZ pour augmenter la capacitĂ© d’un tube au-dessus de la limite spĂ©cifiĂ©e par /proc/sys/fs/pipe-max-size ;

-

ne pas tenir compte des limites /proc/sys/fs/mqueue/queues_max , /proc/sys/fs/mqueue/msg_max et /proc/sys/fs/mqueue/msgsize_max lors de la création de files de messages POSIX (consultez mq_overview (7)) ;

-

utiliser l’opĂ©ration PR_SET_MM de prctl (2) ;

-

affecter à /proc/ pid /oom_score_adj une valeur inférieure à la derniÚre valeur affectée par un processus avec CAP_SYS_RESOURCE .

CAP_SYS_TIME

Modifier l’heure systĂšme ( settimeofday (2), stime (2), adjtimex (2)) ; modifier l’horloge temps rĂ©el (matĂ©rielle).

CAP_SYS_TTY_CONFIG

Utiliser vhangup (2) ; employer diverses opérations ioctl (2) nécessitant des droits sur des terminaux virtuels.

CAP_SYSLOG (depuis Linux 2.6.37)

-

Effectuer des opérations syslog (2) nécessitant des droits. Consultez syslog (2) pour savoir quelles opérations nécessitent des droits.

-

Inspecter les adresses du noyau exposĂ©es par /proc et d’autres interfaces lorsque /proc/sys/kernel/kptr_restrict a la valeur 1. (Voir la discussion sur kptr_restrict dans proc (5).)

CAP_WAKE_ALARM (depuis Linux 3.0)

Déclencher quelque chose qui réveillera le systÚme (réglage des alarmes CLOCK_REALTIME_ALARM et CLOCK_BOOTTIME_ALARM ).

Implémentations passées et actuelles

Une implémentation complÚte des capacités nécessite que :

-

pour toutes les opérations privilégiées, le noyau doit vérifier si le thread a la capacité requise dans son ensemble effectif ;

-

le noyau doit fournir des appels systĂšme permettant de changer et rĂ©cupĂ©rer les ensembles de capacitĂ©s d’un thread ;

-

le systĂšme de fichiers doit permettre d’attacher des capacitĂ©s aux fichiers exĂ©cutables pour qu’un processus en dispose quand le fichier est exĂ©cutĂ©.

Avant Linux 2.6.24, seules les deux premiÚres exigences sont remplies ; depuis Linux 2.6.24, ces trois exigences sont remplies.

Remarques pour les développeurs du noyau

Lors de l’ajout d’une nouvelle fonctionnalitĂ© du noyau qui pourrait ĂȘtre contrĂŽlĂ©e par une capacitĂ©, veuillez prendre en considĂ©ration les points suivants :

-

Le but des capacitĂ©s est de dĂ©couper le pouvoir du superutilisateur en plusieurs aptitudes de telle sorte que si un programme qui a une ou plusieurs capacitĂ©s est compromis, son pouvoir d’endommager le systĂšme soit moindre que si le programme est exĂ©cutĂ© avec les privilĂšges du superutilisateur.

-

Vous pouvez choisir de crĂ©er une nouvelle capacitĂ© pour votre nouvelle fonctionnalitĂ©, ou d’associer la fonctionnalitĂ© Ă  l’une des capacitĂ©s existantes. Afin que l’ensemble des capacitĂ©s garde une taille gĂ©rable, la seconde solution est prĂ©fĂ©rable, Ă  moins qu’il y ait des raisons convaincantes de choisir la premiĂšre option (il existe aussi une limite technique : la taille des ensembles de capacitĂ©s est actuellement limitĂ©e Ă  64 bits).

-

Pour dĂ©terminer parmi les capacitĂ©s existantes laquelle est la mieux adaptĂ©e pour ĂȘtre associĂ©e Ă  la nouvelle fonctionnalitĂ©, examinez la liste de capacitĂ©s ci-dessus pour trouver un « silo » dans lequel la nouvelle capacitĂ© est la mieux adaptĂ©e. Une des options est de dĂ©terminer s’il y a d’autres fonctionnalitĂ©s exigeant des capacitĂ©s qui seront toujours utilisĂ©es avec la nouvelle fonctionnalitĂ©. Si la nouvelle fonctionnalitĂ© ne sert Ă  rien sans les autres fonctions, vous devriez utiliser la mĂȘme capacitĂ© que ces autres fonctions.

-

Ne choisissez pas CAP_SYS_ADMIN si vous pouvez l’éviter ! Une forte proportion de vĂ©rifications de capacitĂ©s existantes lui sont associĂ©e (voir une liste partielle plus haut). Elle pourrait plausiblement ĂȘtre appelĂ©e « la nouvelle racine », dans la mesure oĂč d’une part, elle confĂšre une large palette de pouvoirs, et d’autre part, sa vaste portĂ©e signifie que c’est la capacitĂ© qui est requise par de nombreux programmes privilĂ©giĂ©s. Ne rendez pas le problĂšme encore plus compliquĂ©. Les seules nouvelles fonctionnalitĂ©s qui pourraient ĂȘtre associĂ©es Ă  CAP_SYS_ADMIN sont celles qui correspondent de façon Ă©troite aux usages existants dans ce silo.

-

Si vous avez Ă©tabli qu’il Ă©tait rĂ©ellement nĂ©cessaire de crĂ©er une nouvelle capacitĂ© pour votre fonctionnalitĂ©, ne la crĂ©ez pas ou ne la nommez pas comme une capacitĂ© « à usage unique ». Par consĂ©quent, par exemple, l’ajout de la capacitĂ© trĂšs spĂ©cifique CAP_SYS_PACCT Ă©tait probablement une erreur. Essayez plutĂŽt d’identifier et de nommer votre nouvelle capacitĂ© comme un silo plus gĂ©nĂ©ral dans lequel d’autres futures cas d’usage semblable pourraient s’intĂ©grer.

Ensembles de capacités des threads

Chaque thread a les ensembles de capacités suivants contenant zéro ou plus des capacités ci-dessus :
Permitted
(permis)

Il s’agit d’un surensemble limitant les capacitĂ©s effectives que le thread peut prendre. Il limite Ă©galement les capacitĂ©s qui peuvent ĂȘtre ajoutĂ©es Ă  l’ensemble hĂ©ritable par un thread qui n’a pas la capacitĂ© CAP_SETPCAP dans son ensemble effectif.

Si un processus supprime une capacitĂ© de son ensemble de capacitĂ©s permises, il ne peut plus jamais la rĂ©cupĂ©rer (sauf s’il appelle execve (2) sur un programme set-user-ID-root ou un programme dont les capacitĂ©s associĂ©es au fichier accordent cette capacitĂ©).

Inheritable (héritable)

Il s’agit d’un ensemble de capacitĂ©s prĂ©servĂ©es au travers d’un execve (2). Les capacitĂ©s hĂ©ritables restent hĂ©ritables lors de l’exĂ©cution d’un programme et les capacitĂ©s hĂ©ritables sont ajoutĂ©es Ă  l’ensemble de capacitĂ©s permises lors de l’exĂ©cution d’un programme qui a les bits correspondant activĂ©s dans l’ensemble hĂ©ritable du fichier.

Parce que les capacitĂ©s hĂ©ritables ne sont gĂ©nĂ©ralement pas prĂ©servĂ©es au travers d’un execve (2) lors d’une exĂ©cution en tant qu’utilisateur ordinaire, les applications qui souhaitent exĂ©cuter des programmes d’assistance avec des capacitĂ©s plus Ă©levĂ©es devraient envisager d’utiliser les capacitĂ©s ambiantes, dĂ©crites ci-dessous.

Effective (effectif)

Il s’agit de l’ensemble des capacitĂ©s utilisĂ©es par le noyau pour vĂ©rifier les permissions du thread.

Bounding (limitation) (par processus depuis Linux 2.6.25)

L’ensemble de limitation des capacitĂ©s (« capability bounding set ») est un mĂ©canisme qui peut ĂȘtre utilisĂ© pour limiter les capacitĂ©s qui peuvent ĂȘtre obtenues lors d’un execve (2).

Depuis Linux 2.6.25, c’est un ensemble de capacitĂ©s par thread. Dans les noyaux plus anciens, la limitation des capacitĂ©s Ă©tait un attribut pour l’ensemble du systĂšme, partagĂ© par tous les threads du systĂšme.

Pour plus de détails, voir Ensemble de limitation des capacités , ci-dessous.

Ambient (ambiant) (depuis Linux 4.3)

Il s’agit d’un ensemble de capacitĂ©s prĂ©servĂ©es au travers d’un execve (2) d’un programme non privilĂ©giĂ©. L’ensemble de capacitĂ©s ambiantes obĂ©it Ă  la rĂšgle invariable qu’aucune capacitĂ© ne peut ĂȘtre ambiante si elle n’est pas Ă  la fois permise et hĂ©ritable.

L’ensemble de capacitĂ©s ambiantes peut ĂȘtre directement modifiĂ© avec prctl (2). Les capacitĂ©s ambiantes sont automatiquement diminuĂ©es si une capacitĂ©s soit permises soit hĂ©ritables correspondantes sont diminuĂ©es.

L’exĂ©cution d’un programme qui change l’UID ou le GID Ă  cause des bits set-user-ID ou set-group-ID, ou l’exĂ©cution d’un programme qui a un ensemble de capacitĂ©s de fichier supprimera l’ensemble ambiant. Les capacitĂ©s ambiantes sont ajoutĂ©es Ă  l’ensemble des capacitĂ©s permises et assignĂ©es Ă  l’ensemble des capacitĂ©s effectives quand execve (2) est appelĂ©. Si les capacitĂ©s ambiantes font que les capacitĂ©s permises et ambiantes d’un processus sont accrues durant un execve (2), cela ne dĂ©clenche pas le mode « secure-execution » dĂ©crit dans ld.so (8).

Un enfant créé par fork (2) hĂ©rite d’une copie des ensembles de capacitĂ©s de son parent. Pour des dĂ©tails sur la façon dont execve (2) affecte les capacitĂ©s, voir Transformation des capacitĂ©s lors d’un appel execve() plus bas.

En utilisant capset (2), un thread peut manipuler ses propres ensembles de capacités ; voir Ajuster les ensembles de capacités par programmation ci-dessous).

À partir de Linux 3.2, le fichier /proc/sys/kernel/cap_last_cap contient la valeur numĂ©rique de la capacitĂ© la plus Ă©levĂ©e qui soit acceptĂ©e par le noyau en cours d’exĂ©cution ; cette valeur peut ĂȘtre utilisĂ©e pour dĂ©terminer le bit le plus Ă©levĂ© qui puisse ĂȘtre dĂ©fini dans un ensemble de capacitĂ©s.

Capacités de fichier

Depuis Linux 2.6.24, le noyau prend en charge l’association d’ensembles de capacitĂ©s avec un fichier exĂ©cutable Ă  l’aide de setcap (8). Les ensembles de capacitĂ©s du fichier sont stockĂ©s dans un attribut Ă©tendu (consultez setxattr (2) et xattr (7)) appelĂ© security.capability . Écrire dans cet attribut Ă©tendu nĂ©cessite la capacitĂ© CAP_SETFCAP . Les ensembles de capacitĂ©s d’un fichier, combinĂ©s avec les ensembles de capacitĂ©s du thread, dĂ©terminent les capacitĂ©s d’un thread aprĂšs un execve (2).

Les trois ensembles de capacités de fichier sont :
Permitted
(anciennement forced (forcé)) :

Ces capacités sont automatiquement permises au thread, quelles que soient ses capacités héritables.

Inheritable (anciennement allowed (autorisé)) :

Cet ensemble est combinĂ© par un ET avec l’ensemble hĂ©ritable du thread pour savoir quelles capacitĂ©s de l’ensemble des capacitĂ©s hĂ©ritables sont permises dans l’ensemble permis du thread aprĂšs l’appel Ă  execve (2).

Effective (effectif) :

Il ne s’agit pas d’un ensemble, mais plutĂŽt d’un unique bit. Si le bit est positionnĂ©, alors, lors d’un execve (2), toutes les nouvelles capacitĂ©s permises pour le thread sont Ă©galement positionnĂ©es dans l’ensemble effectif. Si ce bit n’est pas positionnĂ©, alors, aprĂšs un execve (2), aucune des nouvelles capacitĂ©s permises ne se trouvera dans le nouvel ensemble effectif.

Activer le bit des capacitĂ©s effectives d’un fichier implique que toute capacitĂ© de fichier permise ou hĂ©ritable qui permet Ă  un thread d’obtenir les capacitĂ©s permises correspondantes lors d’un execve (2) (consultez Transformation des capacitĂ©s lors d’un appel execve() ci-dessous) fera que ce fichier aura aussi cette capacitĂ© dans son ensemble effectif. Ainsi, lors de l’ajout de capacitĂ©s Ă  un fichier ( setcap (8), cap_set_file (3), cap_set_fd (3)), si l’attribut effectif pour une des capacitĂ©s est activĂ©, alors l’attribut effectif doit Ă©galement ĂȘtre activĂ© pour toutes les autres capacitĂ©s dont l’attribut permis ou hĂ©ritable correspondant est activĂ©.

Versionnage d’attributs Ă©tendus de capacitĂ© de fichier

Pour permettre l’extensibilitĂ©, le noyau prend en charge un systĂšme pour coder un numĂ©ro de version dans l’attribut Ă©tendu security.capability qui est utilisĂ© pour implĂ©menter les capacitĂ©s de fichier. Ces numĂ©ros de version sont intĂ©grĂ©s Ă  l’implĂ©mentation et pas directement visibles aux applications de l’espace utilisateur. À ce jour, les versions suivantes sont prise en charge :
VFS_CAP_REVISION_1

C’était l’implĂ©mentation d’origine de la capacitĂ© de fichier qui prenait en charge les masques 32 bits pour les capacitĂ©s de fichier.

VFS_CAP_REVISION_2 (depuis Linux 2.6.25)

Cette version permet des masques de capacitĂ© de fichier d’une taille de 64 bits, ce qui Ă©tait nĂ©cessaire, car le nombre de capacitĂ©s prises en charge dĂ©passait 32. Le noyau continue de façon transparente Ă  prendre en charge l’exĂ©cution de fichiers qui ont des masques de capacitĂ© version 1 32 bits, mais lors de l’ajout de capacitĂ©s Ă  des fichiers qui n’avaient pas encore de capacitĂ©s ou lors de la modification des capacitĂ©s de fichiers existants, il utilise automatiquement le systĂšme de la version 2 (ou Ă©ventuellement la version 3, comme dĂ©crit plus bas).

VFS_CAP_REVISION_3 (depuis Linux 4.14)

Les capacités de fichier version 3 sont fournies pour prendre en charge les capacités de fichier mises dans un espace de noms (décrites plus bas).

Comme avec les capacitĂ©s de fichier version 2, les masques de capacitĂ© version 3 ont une longueur de 64 bits. Mais en complĂ©ment, l’UID root de l’espace de noms est codĂ© dans l’attribut Ă©tendu security.capability (un UID root d’espace de noms est la valeur Ă  laquelle l’UID 0 dans cet espace de noms correspond dans l’espace de noms utilisateur initial).

Les capacitĂ©s de fichier version 3 sont conçues pour coexister avec les capacitĂ©s version 2 ; c’est-Ă -dire que, sur un systĂšme Linux moderne, il peut y avoir certains fichiers avec des capacitĂ©s version 2 tandis que d’autres ont des capacitĂ©s version 3.

Avant Linux 4.14, le seul type d’attribut Ă©tendu de capacitĂ© de fichier qui pouvait ĂȘtre attachĂ© Ă  un fichier Ă©tait un attribut VFS_CAP_REVISION_2 . Depuis Linux 4.14, la version de l’attribut Ă©tendu security.capability attachĂ© Ă  un fichier dĂ©pend des circonstances dans lesquelles l’attribut a Ă©tĂ© créé.

À partir de Linux 4.14, un attribut Ă©tendu security.capability est créé automatiquement (ou converti) en attribut version 3 ( VFS_CAP_REVISION_3 ) si les deux conditions suivantes sont vraies :

-

Le thread qui Ă©crit l’attribut rĂ©side dans un espace de noms utilisateur non initial (plus prĂ©cisĂ©ment, le thread rĂ©side dans un espace de noms utilisateur autre que celui Ă  partir duquel le systĂšme de fichiers sous-jacent a Ă©tĂ© montĂ©).

-

Le thread a la capacitĂ© CAP_SETFCAP sur l’inƓud du fichier, ce qui veut dire que (a) le thread a la capacitĂ© CAP_SETFCAP dans son propre espace de noms utilisateur et (b) l’UID et le GID de l’inƓud du fichier a des correspondances dans l’espace de noms utilisateur de celui qui Ă©crit.

Quand un attribut Ă©tendu security.capability VFS_CAP_REVISION_3 est créé, l’UID root de l’espace de noms utilisateur du thread qui crĂ©e l’attribut est enregistrĂ© dans l’attribut Ă©tendu.

Par contre, la crĂ©ation ou la modification d’un attribut Ă©tendu security.capability Ă  partir d’un thread privilĂ©giĂ© ( CAP_SETFCAP ) qui rĂ©side dans l’espace de noms oĂč le systĂšme de fichiers sous-jacent a Ă©tĂ© montĂ© (ce qui correspond normalement Ă  l’espace de noms utilisateur initial) a automatiquement pour consĂ©quence la crĂ©ation d’un attribut version 2 ( VFS_CAP_REVISION_2 ).

Veuillez noter que la crĂ©ation d’un attribut Ă©tendu security.capability version 3 est automatique. C’est-Ă -dire que losrsqu’une application de l’espace utilisateur Ă©crit ( setxattr (2)) un attribut security.capability au format de la version 2, le noyau crĂ©era automatiquement un attribut version 3 si l’attribut est créé dans les conditions dĂ©crites plus haut. En parallĂšle, quand un attribut security.capability version 3 est rĂ©cupĂ©rĂ© ( getxattr (2)) par un processus qui rĂ©side dans un espace de noms utilisateur qui a Ă©tĂ© créé par l’UID root (ou un descendant de cet espace de noms utilisateur), l’attribut renvoyĂ© est (automatiquement) simplifiĂ© pour apparaĂźtre comme un attribut version 2 (c’est-Ă -dire que la valeur renvoyĂ©e est la taille de l’attribut version 2 et n’inclut pas l’UID root). Ces transpositions automatiques signifient qu’aucune modification n’est requise pour les outils de l’espace utilisateur (par exemple setcap (1) getcap (1)) pour que ces outils soient utilisĂ©s pour crĂ©er et rĂ©cupĂ©rer des attributs security.capability version 3.

Veuillez noter qu’un fichier peut se voir associĂ© un attribut Ă©tendu security.capability version 2 ou version 3, mais pas les deux Ă  la fois : la crĂ©ation ou la modification de l’attribut Ă©tendu security.capability modifiera automatiquement la version selon les conditions dans lesquelles l’attribut Ă©tendu est créé ou modifiĂ©.

Transformation des capacitĂ©s lors d’un appel execve()

Durant un execve (2), le noyau calcule les nouvelles capacitĂ©s du processus en utilisant l’algorithme suivant :

P’(ambient) = (le fichier est privilĂ©giĂ©) ? 0 : P(ambient)
P’(permitted) = (P(inheritable) & F(inheritable)) |
(F(permitted) & P(bounding)) | P’(ambient)
P’(effective) = F(effective) ? P’(permitted) : P’(ambient)
P’(inheritable) = P(inheritable) [c’est-Ă -dire inchangĂ©]
P’(bounding) = P(bounding) [c’est-Ă -dire inchangĂ©]

oĂč :

P()

indique la valeur d’un ensemble de capacitĂ©s du thread avant le execve (2)

P’()

indique la valeur d’un ensemble de capacitĂ©s du thread aprĂšs le execve (2)

F()

indique la valeur d’un ensemble de capacitĂ©s du fichier

Veuillez noter les détails suivants concernant les rÚgles de transformation de capacités ci-dessus :

-

L’ensemble de capacitĂ©s ambiantes est prĂ©sent seulement depuis Linux 4.3. Lors de la dĂ©termination de la transformation de l’ensemble ambiant durant un execve (2), un fichier privilĂ©giĂ© est un fichier qui a des capacitĂ©s ou le bit set-user-ID ou le bit set-group-ID positionnĂ©.

-

Avant Linux 2.6.25, l’ensemble de limitation de capacitĂ©s Ă©tait un attribut au niveau du systĂšme, partagĂ© par tous les threads. Cette valeur au niveau du systĂšme Ă©tait employĂ©e pour calculer le nouvel ensemble de capacitĂ©s permises durant un execve (2) de la mĂȘme maniĂšre que cela est montrĂ© plus haut pour P(bounding) .

Note : durant les transitions de capacitĂ© dĂ©crite plus haut, les capacitĂ©s de fichier peuvent ĂȘtre ignorĂ©es (traitĂ©es comme si elles Ă©taient vides) pour les mĂȘmes raisons que les bits set-user-ID et set-group-ID sont ignorĂ©s ; voir execve (2). Les capacitĂ©s de fichier sont ignorĂ©es de la mĂȘme maniĂšre si le noyau a Ă©tĂ© lancĂ© avec l’option no_file_caps .

Note : conformément aux rÚgles ci-dessus, si un processus avec des UID différents de zéro exécutent un execve (2), alors toutes les capacités présentes dans son ensemble de capacités permises et effectives seront supprimées. Pour le traitement de capacités quand un processus avec un UID de zéro exécute un execve (2), consultez ci-dessous Capacités et exécution de programmes par le superutilisateur .

Vérification de sécurité pour les binaires passives aux capacités

Un binaire passif aux capacitĂ©s est une application qui a Ă©tĂ© marquĂ©e pour avoir des capacitĂ©s de fichier, mais n’a pas Ă©tĂ© convertie pour utiliser l’API libcap (3) pour manipuler ses capacitĂ©s (en d’autres mots, c’est un programme set-user-iD-root traditionnel qui a Ă©tĂ© modifiĂ© pour utiliser des capacitĂ©s de fichier, mais dont le code n’a pas Ă©tĂ© modifiĂ© pour comprendre les capacitĂ©s). Pour ce type d’application, le bit de capacitĂ© effective est dĂ©fini sur le fichier, de telle sorte que les capacitĂ©s de fichier permises soient activĂ©es automatiquement dans l’ensemble de capacitĂ©s effectives du processus lors de l’exĂ©cution du fichier. Le noyau reconnaĂźt un fichier qui a un bit de capacitĂ© effective dĂ©fini comme passif aux capacitĂ©s en vue de la vĂ©rification dĂ©crite ici.

Lors de l’exĂ©cution d’un binaire passif aux capacitĂ©s, le noyau vĂ©rifie si le processus a obtenu toutes les capacitĂ©s permises qui sont spĂ©cifiĂ©es dans l’ensemble de capacitĂ©s permises de fichier, aprĂšs que les transformations de capacitĂ© dĂ©crites plus haut ont Ă©tĂ© exĂ©cutĂ©es (la raison habituelle pour laquelle cela pourrait ne pas se produire est que l’ensemble de limitation de capacitĂ©s a interdit certaines des capacitĂ©s dans l’ensemble de capacitĂ©s permises de fichier). Si le processus n’obtient pas l’ensemble complet de capacitĂ©s permises de fichier, alors l’ execve (2) Ă©choue avec l’erreur EPERM . Cela Ă©vite de possibles risques de sĂ©curitĂ© qui pourraient survenir quand une application passive aux capacitĂ©s est exĂ©cutĂ©e avec moins de privilĂšges que nĂ©cessaire. Notez que, par dĂ©finition, l’application ne pourrait pas reconnaĂźtre elle-mĂȘme ce problĂšme, dans la mesure oĂč elle n’emploie pas l’API libcap (3).

Capacités et exécution de programmes par le superutilisateur

Afin de reflĂ©ter les sĂ©mantiques traditionnelles d’UNIX, le noyau effectue un traitement particulier des capacitĂ©s de fichier quand un processus avec l’UID 0 (superutilisateur) exĂ©cute un programme et quand un programme set-user-ID-root est exĂ©cutĂ©.

AprĂšs avoir rĂ©alisĂ© toutes les modifications de l’ID effectif du processus qui ont Ă©tĂ© dĂ©clenchĂ©es par le bit de mode set-user-ID du binaire (par exemple, le changement de l’UID à 0 (superutilisateur) parce qu’un programme set-user-ID-root a Ă©tĂ© exĂ©cutĂ©), le noyau calcule les ensembles de capacitĂ©s de fichier comme suit :

(1)

Si l’UID rĂ©el ou effectif du processus est 0 (superutilisateur), alors les ensembles de capacitĂ©s hĂ©ritables et permises de fichier sont ignorĂ©s ; ils sont plutĂŽt considĂ©rĂ©s thĂ©oriquement comme remplis de uns (c’est-Ă -dire, toutes les capacitĂ©s activĂ©es). Il y a une exception Ă  ce comportement, dĂ©crite ci-dessous dans la section Programmes set-user-ID-root qui ont des capacitĂ©s de fichier .

(2)

Si l’UID effectif du processus est 0 (superutilisateur) ou le bit des capacitĂ©s effectives du fichier est en fait activĂ©, alors le bit des capacitĂ©s effectives du fichier est thĂ©oriquement dĂ©fini Ă  un (activĂ©).

Ces valeurs thĂ©oriques pour les ensembles de capacitĂ©s de fichier sont alors utilisĂ©es comme dĂ©crites ci-dessus pour calculer la transformation des capacitĂ©s du processus durant l’ execve (2).

Alors, quand un processus avec des UID diffĂ©rents de zĂ©ro appelle execve (2) sur un programme set-user-ID-root qui n’a pas de capacitĂ©s attachĂ©es ou quand un processus dont les UID rĂ©el et effectif sont zĂ©ro applique execve (2) sur un programme, le calcul des nouvelles capacitĂ©s permises du processus est simplifiĂ© à :

P’(permitted) = P(inheritable) | P(bounding)
P’(effective) = P’(permitted)

En consĂ©quence, le processus obtient toutes les capacitĂ©s dans ses ensembles de capacitĂ©s permises et effectives, Ă  l’exception de celles supprimĂ©es par l’ensemble de limitation de capacitĂ©s (dans le calcul de P’(permitted), le terme P’(ambient) peut ĂȘtre simplifiĂ© parce qu’il est par dĂ©finition un sous-ensemble propre de P(inheritable)).

Les traitements particuliers de l’UID 0 (superutilisateur) dĂ©crits dans cette sous-section peuvent ĂȘtre dĂ©sactivĂ©s en utilisant le mĂ©canisme de « securebits » dĂ©crit plus bas.

Les programmes set-user-ID-root qui ont des capacités de fichier

Il y a une exception au comportement dĂ©crit dans CapacitĂ©s et exĂ©cution de programmes par le superutilisateur ci-dessus. Si (a) le binaire qui est en cours d’exĂ©cution a des capacitĂ©s attachĂ©es, (b) l’UID rĂ©elle du processus n’est pas 0 (supertutilisateur) et (c) l’UID effectif du processus est 0 (superutilisateur), alors les bits de capacitĂ© de fichier sont honorĂ©s (c’est-Ă -dire qu’ils ne sont pas thĂ©oriquement considĂ©rĂ©s comme remplis de uns). La circonstance habituelle dans laquelle cette situation peut se produire est lors de l’exĂ©cution d’un programme set-user-ID-root qui a aussi les capacitĂ©s de fichier. Quand un programme de ce type est exĂ©cutĂ©, le processus obtient simplement les capacitĂ©s accordĂ©es par le programme (c’est-Ă -dire pas toutes les capacitĂ©s comme cela pourrait se produire lors de l’exĂ©cution d’un programme set-user-ID-root qui ne possĂšde aucune capacitĂ© de fichier associĂ©e).

Notez qu’il est possible d’assigner un ensemble de capacitĂ©s vide Ă  un fichier de programme et donc qu’il est possible de crĂ©er un programme set-user-ID-root qui modifie en 0 le set-user-ID effectif et sauvegardĂ© du processus qui exĂ©cute le programme, mais ne confĂšre aucune capacitĂ© Ă  ce processus.

Ensemble de limitation des capacités

L’ensemble de limitation des capacitĂ©s (« capability bounding set ») est un mĂ©canisme de sĂ©curitĂ© qui peut ĂȘtre utilisĂ© pour limiter les capacitĂ©s qui peuvent ĂȘtre obtenues lors d’un execve (2). L’ensemble de limitation de capacitĂ©s est utilisĂ© de cette façon :

-

Lors d’un execve (2), l’ensemble de limitation de capacitĂ©s est combinĂ©e par un ET binaire avec l’ensemble des capacitĂ©s autorisĂ©es du fichier, et le rĂ©sultat de cette opĂ©ration est placĂ© dans l’ensemble des capacitĂ©s autorisĂ©es du thread. L’ensemble de limitation de capacitĂ©s permet donc de limiter les capacitĂ©s permises qui peuvent ĂȘtre accordĂ©es par un fichier exĂ©cutable.

-

(Depuis Linux 2.6.25) L’ensemble de limitation de capacitĂ©s agit comme un surensemble limitant les capacitĂ©s qu’un thread peut ajouter Ă  son ensemble de capacitĂ©s hĂ©ritables en utilisant capset (2). Cela signifie que si une capacitĂ© ne se trouve pas dans l’ensemble de limitation des capacitĂ©s, alors un thread ne peut ajouter cette capacitĂ© dans son ensemble de capacitĂ©s hĂ©ritables, mĂȘme si elle se trouvait dans son ensemble de capacitĂ©s permises, et ne peut donc pas conserver cette capacitĂ© dans son ensemble de capacitĂ©s permises lorsqu’il exĂ©cute avec execve (2) un fichier qui a cette capacitĂ© dans son ensemble de capacitĂ©s hĂ©ritables.

Notez que l’ensemble de limitation de capacitĂ©s masque les capacitĂ©s permises du fichier, mais pas les capacitĂ©s hĂ©ritĂ©es. Si un thread conserve une capacitĂ© dans son ensemble de capacitĂ©s hĂ©ritĂ©es et que cette capacitĂ© ne se trouve pas dans l’ensemble de limitation des capacitĂ©s, alors il peut toujours obtenir cette capacitĂ© dans son ensemble de capacitĂ©s permises en exĂ©cutant un fichier qui a la capacitĂ© dans son ensemble de capacitĂ©s hĂ©ritĂ©es.

Suivant la version du noyau, l’ensemble de limitation de capacitĂ©s est un attribut au niveau du systĂšme ou un attribut par processus.

Ensemble de limitation de capacités aprÚs Linux 2.6.25

Depuis Linux 2.6.25, l’ ensemble de limitation de capacitĂ©s est un attribut par thread. (L’ensemble de limitation de capacitĂ©s au niveau du systĂšme dĂ©crite ci-dessous n’existe plus.)

L’ensemble de limitation est hĂ©ritĂ© du parent du thread au travers d’un fork (2) et est prĂ©servĂ© au travers d’un execve (2).

Un thread peut enlever des capacitĂ©s de son ensemble de limitation de capacitĂ©s en utilisant l’opĂ©ration PR_CAPBSET_DROP de prctl (2), Ă  condition qu’il possĂšde la capacitĂ© CAP_SETPCAP . Une fois qu’une capacitĂ© a Ă©tĂ© supprimĂ©e de l’ensemble de limitation, elle ne peut y ĂȘtre remise. Un thread peut dĂ©terminer si une capacitĂ© est dans son ensemble de limitation de capacitĂ©s en utilisant l’opĂ©ration PR_CAPBSET_READ de prctl (2).

La suppression de capacitĂ©s dans l’ensemble de limitation des capacitĂ©s n’est prise en charge que si les capacitĂ©s de fichier sont compilĂ©es dans le noyau. Avant Linux 2.6.33, les capacitĂ©s de fichier Ă©taient une fonctionnalitĂ© optionnelle configurable ua moyen de l’option CONFIG_SECURITY_FILE_CAPABILITIES . Depuis Linux 2.6.33, l’option de configuration a Ă©tĂ© supprimĂ©e et les capacitĂ©s de fichier font maintenant toujours partie du noyau. Quand les capacitĂ©s de fichier sont compilĂ©es dans le noyau, le processus init (l’ancĂȘtre de tous les processus) dĂ©marre avec un ensemble de limitation complet. Si les capacitĂ©s de fichier ne sont pas compilĂ©es dans le noyau, init dĂ©marre alors avec un ensemble de limitation complet, Ă  l’exception de CAP_SETPCAP , parce que cette capacitĂ© a une autre signification quand il n’y a pas de capacitĂ©s de fichier.

Supprimer une capacitĂ© de l’ensemble de limitation de capacitĂ©s ne la supprime pas de l’ensemble hĂ©ritable d’un thread. Cependant, il empĂȘche de rajouter la capacitĂ© dans l’ensemble hĂ©ritable du thread par la suite.

Ensemble de limitation de capacités avant Linux 2.6.25

Avant Linux  2.6.25, l’ensemble de limitation de capacitĂ©s est un attribut au niveau du systĂšme qui affecte tous les threads. L’ensemble de limitation de capacitĂ©s est accessible par le fichier /proc/sys/kernel/cap-bound (le masque de bits est exprimĂ© comme un nombre dĂ©cimal signĂ© dans /proc/sys/kernel/cap-bound , ce qui entretient les confusions).

Seul le processus init peut configurer des capacitĂ©s dans l’ensemble de limitation de capacitĂ©s ; en dehors de cela, le superutilisateur (plus prĂ©cisĂ©ment : un processus avec la capacitĂ© CAP_SYS_MODULE ) peut uniquement supprimer des capacitĂ©s de cet ensemble.

Sur un systĂšme standard, l’ensemble de limitation Ă©limine toujours la capacitĂ© CAP_SETPCAP . Pour supprimer cette restriction (attention, c’est dangereux !), modifiez la dĂ©finition de CAP_INIT_EFF_SET dans include/linux/capability.h et recompilez le noyau.

L’ensemble de limitation de capacitĂ©s pour tout le systĂšme a Ă©tĂ© ajoutĂ©e Ă  Linux 2.2.11.

Effet des modifications d’UID sur les capacitĂ©s

Afin de prĂ©server la sĂ©mantique traditionnelle pour les transitions entre des UID 0 et des UID diffĂ©rents de zĂ©ro, le noyau modifie les ensembles de capacitĂ©s d’un thread de la façon suivante lors de modifications des UID rĂ©el, effectif, sauvegardĂ© et du systĂšme de fichiers (avec setuid (2), setresuid (2) et compagnie) :

-

Si un ou plus des UID rĂ©els, effectifs ou sauvĂ©s Ă©taient Ă©gal à 0, et qu’à la suite de la modification d’UID, tous ces ID ont une valeur diffĂ©rente de zĂ©ro, et toutes les capacitĂ©s sont supprimĂ©es des ensembles de capacitĂ©s permises, effectives et ambiantes.

-

Si l’UID effectif Ă©tait 0 et devient diffĂ©rent de zĂ©ro, toutes les capacitĂ©s sont supprimĂ©es de l’ensemble effectif.

-

Si l’UID effectif est modifiĂ© d’une valeur diffĂ©rente de zĂ©ro à 0, l’ensemble des capacitĂ©s permises est copiĂ© dans l’ensemble des capacitĂ©s effectives.

-

Si l’UID du systĂšme de fichiers est modifiĂ© de 0 Ă  une valeur diffĂ©rente de zĂ©ro (consultez setfsuid (2)), les capacitĂ©s suivantes sont supprimĂ©es de l’ensemble effectif : CAP_CHOWN , CAP_DAC_OVERRIDE , CAP_DAC_READ_SEARCH , CAP_FOWNER , CAP_FSETID , CAP_LINUX_IMMUTABLE (depuis Linux 2.6.30), CAP_MAC_OVERRIDE et CAP_MKNOD (depuis Linux 2.6.30). Si l’UID du systĂšme de fichiers devient 0, chacune de ces capacitĂ©s est activĂ©e dans l’ensemble des capacitĂ©s effectives si elle faisait partie de l’ensemble des capacitĂ©s permises.

Si un thread qui a une valeur 0 pour un ou plus de ses UID ne veut pas que son ensemble de capacitĂ©s permises soit vidĂ© lorsqu’il redĂ©finit tous ses UID Ă  des valeurs non nulles, il peut le faire avec l’attribut « securebits » de SECBIT_KEEP_CAPS dĂ©crit ci-dessous.

Ajuster les ensembles de capacités par programmation

Un thread peut obtenir ou modifier ses ensembles de capacitĂ©s permises, effectives et hĂ©ritĂ©es en utilisant les appels systĂšme capget (2) et capset (2). Cependant, il faut leur prĂ©fĂ©rer l’utilisation de cap_get_proc (3) et cap_set_proc (3), toutes deux fournies par le paquet libcap . Les rĂšgles suivantes gouvernent les modifications des ensembles de capacitĂ©s d’un thread :

-

Si l’appelant n’a pas la capacitĂ© CAP_SETPCAP , le nouvel ensemble des capacitĂ©s hĂ©ritables doit ĂȘtre un sous-ensemble de l’union des ensembles de capacitĂ©s hĂ©ritables et des capacitĂ©s permises.

-

(Depuis Linux 2.6.25) Le nouvel ensemble hĂ©ritable doit ĂȘtre un sous-ensemble de l’ensemble hĂ©ritable existant et de l’ensemble de limitation de capacitĂ©s.

-

Le nouvel ensemble des capacitĂ©s permises doit ĂȘtre un sous-ensemble de l’ensemble des capacitĂ©s permises existant (c’est-Ă -dire qu’il n’est pas possible d’obtenir des capacitĂ©s permises que le thread n’a pas actuellement).

-

Le nouvel ensemble effectif doit ĂȘtre un sous-ensemble du nouvel ensemble des capacitĂ©s permises.

Les attributs « securebits » : configuration d’un environnement restreintaux capacitĂ©s de fichier.

À partir de Linux 2.6.26, si les capacitĂ©s de fichier sont activĂ©es dans le noyau, Linux implĂ©mente un ensemble d’attributs securebits par thread qui peuvent ĂȘtre utilisĂ©s pour dĂ©sactiver la gestion particuliĂšre des capacitĂ©s pour l’UID 0 ( root ). Ces attributs sont les suivants :
SECBIT_KEEP_CAPS

Activer cet attribut permet Ă  un thread qui a un UID (ou plus) Ă©gal à 0 de conserver ses capacitĂ©s dans son ensemble des capacitĂ©s permises quand il change tous ses UID et que plus aucun n’est zĂ©ro. Si cet attribut est dĂ©sactivĂ©, alors ces changements d’UID feront perdre au thread toutes ses capacitĂ©s permises. Cet attribut est toujours dĂ©sactivĂ© lors d’un execve (2).

Notez que mĂȘme quand l’attribut SECBIT_KEEP_CAPS est actif, les capacitĂ©s effectives d’un thread sont supprimĂ©es quand il change son UID effectif pour une valeur diffĂ©rente de zĂ©ro. NĂ©anmoins, si le thread a activĂ© cet attribut et que son UID effectif est dĂ©jĂ  diffĂ©rent de zĂ©ro et si le thread change ensuite tous les autres UID pour des valeurs diffĂ©rentes de zĂ©ro, alors, les capacitĂ©s effectives ne seront pas supprimĂ©es.

L’activation de l’attribut SECBIT_KEEP_CAPS est ignorĂ©e si l’attribut SECBIT_NO_SETUID_FIXUP est actif (ce dernier attribut fournit un surensemble des effets de l’attribut prĂ©cĂ©dent).

Cet attribut fournit la mĂȘme fonctionnalitĂ© que l’ancienne opĂ©ration PR_SET_KEEPCAPS de prctl (2).

SECBIT_NO_SETUID_FIXUP

Activer cet attribut stoppe l’ajustement des ensembles de capacitĂ©s permises, effectives et ambiantes du processus par le noyau lorsque les UID effectifs et du systĂšme de fichiers du thread passent d’une valeur zĂ©ro Ă  une valeur diffĂ©rente de zĂ©ro. Consultez Effet des modifications d’UID sur les capacitĂ©s plus haut.

SECBIT_NOROOT

Si cet attribut est activĂ©, alors le noyau n’accorde pas les capacitĂ©s lorsqu’un programme set-user-ID-root est exĂ©cutĂ© ou lorsqu’un processus dont l’UID effectif ou rĂ©el est zĂ©ro appelle execve (2) (consultez CapacitĂ©s et exĂ©cution de programmes par le superutilisateur ci-dessus).

SECBIT_NO_CAP_AMBIENT_RAISE

Activer cet attribut dĂ©sactive l’élĂ©vation des capacitĂ©s ambiantes au moyen de l’opĂ©ration PR_CAP_AMBIENT_RAISE de prctl (2).

Chacun des attributs de « base » ci-dessus a un attribut compagnon « verrouillé ». L’activation d’un attribut « verrouillé » est irrĂ©versible et permet d’éviter toute modification ultĂ©rieure de l’attribut de « base » correspondant. Les attributs « verrouillé » sont : SECBIT_KEEP_CAPS_LOCKED , SECBIT_NO_SETUID_FIXUP_LOCKED , SECBIT_NOROOT_LOCKED et SECBIT_NO_CAP_AMBIENT_RAISE_LOCKED .

Les attributs securebits peuvent ĂȘtre modifiĂ©s et rĂ©cupĂ©rĂ©s en utilisant les opĂ©rations PR_SET_SECUREBITS et PR_GET_SECUREBITS de prctl (2). La capacitĂ© CAP_SETPCAP est nĂ©cessaire pour modifier ces attributs. Notez que les constantes SECBIT_* ne sont disponibles qu’aprĂšs l’inclusion du fichier d’en-tĂȘte <linux/securebits.h> .

Les attributs securebits sont hĂ©ritĂ©s par les processus enfants. Lors d’un execve (2), tous les attributs sont conservĂ©s, Ă  l’exception de SECBIT_KEEP_CAPS qui est toujours dĂ©sactivĂ©.

Une application peut utiliser l’appel suivant pour se verrouiller elle-mĂȘme, ainsi que tous ses descendants, dans un environnement oĂč la seule façon d’obtenir des capacitĂ©s est d’exĂ©cuter un programme avec les capacitĂ©s de fichiers associĂ©es :

prctl(PR_SET_SECUREBITS,
/* SECBIT_KEEP_CAPS désactivé */
SECBIT_KEEP_CAPS_LOCKED |
SECBIT_NO_SETUID_FIXUP |
SECBIT_NO_SETUID_FIXUP_LOCKED |
SECBIT_NOROOT |
SECBIT_NOROOT_LOCKED);
/* Activation/verrouillage de SECBIT_NO_CAP_AMBIENT_RAISE
non requis */

Programmes « set-user_ID-root » par espace de noms utilisateur

Un programme set-user-ID dont l’UID correspond Ă  l’UID qui a créé par un espace de noms utilisateur donnera des capacitĂ©s dans les ensembles de capacitĂ©s permises et effectives du processus lorsqu’il Ă©tait utilisĂ© par un processus dans l’espace de noms ou tout espace de noms utilisateur qui en est issu.

Les rĂšgles de transformation des capacitĂ©s du processus pendant un execve (2) sont exactement comme dĂ©crites dans Transformation des capacitĂ©s lors d’un appel execve() et CapacitĂ©s et exĂ©cution de programmes par le superutilisateur ci-dessus;Ă  la diffĂ©rence que, dans la seconde sous-section, « root » est l’UID du crĂ©ateur de l’espace de noms utilisateur.

Capacités de fichier mises dans un espace de noms

Les capacitĂ©s de fichier traditionnelles (c’est-Ă -dire version 2) n’associent qu’un ensemble de masques de capacitĂ© Ă  un fichier binaire exĂ©cutable. Quand un processus exĂ©cute un binaire avec des capacitĂ©s de ce type, il obtient les capacitĂ©s associĂ©es (dans son espace de noms utilisateur) comme pour les rĂšgles dĂ©crites ci-dessus dans Transformation des capacitĂ©s lors d’un appel execve() .

Étant donnĂ© que les capacitĂ©s de fichier version 2 confĂšrent des capacitĂ©s pour l’exĂ©cution de processus quel que soit l’espace de noms utilisateur dans lequel il rĂ©side, seuls les processus privilĂ©giĂ©s ont le droit d’associer des capacitĂ©s avec un fichier. Ici, « privilĂ©gié » veut dire un processus qui a la capacitĂ© CAP_SETFCAP dans l’espace de noms utilisateur oĂč le systĂšme de fichiers a Ă©tĂ© montĂ© (normalement, l’espace de noms initial de l’utilisateur). Cette limitation rend les capacitĂ©s de fichier inutiles dans certains cas d’usage. Par exemple, dans les conteneurs d’un espace de noms utilisateur, il peut ĂȘtre souhaitable de pouvoir crĂ©er un binaire qui confĂšre des capacitĂ©s uniquement au processus exĂ©cutĂ© dans ce conteneur, mais pas aux processus exĂ©cutĂ©s en dehors du conteneur.

Linux 4.14 a ajoutĂ© des capacitĂ©s de fichier appelĂ©es « mises dans un espace de noms » pour gĂ©rer ce genre de cas d’usage. Les capacitĂ©s de fichier mises dans un espace de noms sont enregistrĂ©es en tant qu’attribut Ă©tendu security.capability version 3 (c’est-Ă -dire VFS_CAP_REVISION_3 ). Un attribut de ce type est créé automatiquement dans les circonstances dĂ©crites ci-dessus dans Versionnage d’attributs Ă©tendus de capacitĂ© de fichier . Quand un attribut Ă©tendu security.capability version 3 est créé, le noyau n’enregistre pas que les masques de capacitĂ© dans l’attribut Ă©tendu, mais aussi l’UID root de l’espace de noms.

Comme c’est le cas avec un binaire qui possĂšde des capacitĂ©s de fichier VFS_CAP_REVISION_2 , un binaire avec des capacitĂ©s de fichier VFS_CAP_REVISION_3 confĂšre des capacitĂ©s Ă  un processus durant un execve (). NĂ©anmoins, ces capacitĂ©s ne sont confĂ©rĂ©es que si le processus est exĂ©cutĂ© par un processus qui rĂ©side dans un espace de noms utilisateur dont l’UID 0 correspond Ă  l’UID root qui est sauvegardĂ© dans l’attribut Ă©tendu, ou quand il est exĂ©cutĂ© par un processus qui rĂ©side dans un descendant de ce type d’espace de noms.

Interaction avec les espaces de noms

Pour en savoir plus sur les interactions entre les capacités et les espaces de noms utilisateur, consultez user_namespaces (7).

STANDARDS

Il n’y a pas de vĂ©ritable norme pour les capacitĂ©s, mais l’implĂ©mentation de Linux est basĂ©e sur une interprĂ©tation de l’avant-projet de norme (retirĂ©) POSIX.1e https://archive.org/details/posix_1003.1e-990310 .

NOTES

Quand vous tentez de suivre avec strace (1) des binaires qui ont des capacitĂ©s (ou des binaires set-user-UID-root), vous pouvez trouver l’option -u <username> . Quelque chose comme ceci :

$ sudo strace -o trace.log -u ceci ./mon_prog_privé

De Linux 2.5.27 Ă  Linux 2.6.26, les capacitĂ©s Ă©taient un composant optionnel du noyau et pouvaient ĂȘtre activĂ©es ou dĂ©sactivĂ©es avec l’option de configuration CONFIG_SECURITY_CAPABILITIES du noyau.

Le fichier /proc/ pid /task/TID/status peut ĂȘtre utilisĂ© pour voir les ensembles de capacitĂ©s d’un thread. Le fichier /proc/ pid /status indique les ensembles de capacitĂ©s du thread principal d’un processus. Avant Linux 3.8, les capacitĂ©s inexistantes Ă©taient vues comme activĂ©es (1) dans ces ensembles. Depuis Linux 3.8, toutes les capacitĂ©s inexistantes (supĂ©rieures Ă  la valeur de CAP_LAST_CAP ) sont vues comme dĂ©sactivĂ©es (0).

Le paquet libcap fournit un ensemble de routines pour Ă©crire et connaĂźtre les capacitĂ©s d’un processus de maniĂšre plus simple et moins susceptible de changer que l’interface fournie par capset (2) et capget (2). Ce paquet fournit Ă©galement les programmes setcap (8) et getcap (8). Il peut ĂȘtre trouvĂ© Ă  l’adresse :
https://git.kernel.org/pub/scm/libs/libcap/libcap.git/refs/ .

Avant Linux 2.6.24, et de Linux 2.6.24 Ă  Linux 2.6.32, si les capacitĂ©s de fichier ne sont pas activĂ©es, un thread avec la capacitĂ© CAP_SETPCAP peut manipuler les capacitĂ©s des autres threads. Cependant, ce n’est possible qu’en thĂ©orie puisqu’aucun thread n’a la capacitĂ© CAP_SETPCAP dans un des cas suivants :

-

Dans l’implĂ©mentation antĂ©rieure au noyau 2.6.25, l’ensemble de limitation de capacitĂ©s du systĂšme, /proc/sys/kernel/cap-bound , masque toujours la capacitĂ© CAP_SETPCAP et cela ne peut pas ĂȘtre changĂ© sans modifier les sources du noyau et le recompiler.

-

Si les capacitĂ©s de fichier sont dĂ©sactivĂ©es (c’est-Ă -dire si l’option CONFIG_SECURITY_FILE_CAPABILITIES du noyau est dĂ©sactivĂ©e), alors init dĂ©marre sans la capacitĂ© CAP_SETPCAP dans l’ensemble de limitation de capacitĂ©s par processus, et cet ensemble de limitation de capacitĂ© est hĂ©ritĂ© par tous les processus créés sur le systĂšme.

VOIR AUSSI

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), getpcaps (8), netcap (8), pscap (8), setcap (8)

include/linux/capability.h dans les sources du noyau Linux

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Cédric Boutillier <cedric.boutillier@gmail.com>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .