Man page - capabilities(7)
Packages contains this manual
- shm_overview(7)
- nss(5)
- proc_mtrr(5)
- intro(7)
- tcp(7)
- iso_8859-9(7)
- armscii-8(7)
- proc_kpagecount(5)
- initrd(4)
- mouse(4)
- proc_stat(5)
- x25(7)
- proc_interrupts(5)
- fifo(7)
- repertoiremap(5)
- icmp(7)
- futex(7)
- feature_test_macros(7)
- lp(4)
- bpf-helpers(7)
- epoll(7)
- proc_sys_dev(5)
- namespaces(7)
- proc_sysrq-trigger(5)
- proc_bus(5)
- cp1251(7)
- proc_pid_maps(5)
- proc_sys_vm(5)
- proc_pid_projid_map(5)
- st(4)
- proc_pid(5)
- issue(5)
- pid_namespaces(7)
- unicode(7)
- inode(7)
- hosts.equiv(5)
- iso-8859-13(7)
- proc_fb(5)
- proc_modules(5)
- proc_pid_autogroup(5)
- keyrings(7)
- sysvipc(7)
- proc_kmsg(5)
- cgroups(7)
- latin6(7)
- proc_pid_uid_map(5)
- unix(7)
- proc_pid_io(5)
- pts(4)
- packet(7)
- ld-linux.so(8)
- tzselect(8)
- iconv(1)
- proc_pid_syscall(5)
- proc_pid_net(5)
- proc_pid_pagemap(5)
- tty(4)
- proc_profile(5)
- standards(7)
- proc_pid_mounts(5)
- filesystems(5)
- iso-8859-15(7)
- locale(5)
- iso_8859_3(7)
- xattr(7)
- iso-8859-2(7)
- proc_uptime(5)
- persistent-keyring(7)
- credentials(7)
- proc_pid_timers(5)
- utmpx(5)
- vcsa(4)
- proc_pid_exe(5)
- proc_net(5)
- proc_timer_stats(5)
- ip(7)
- proc_pid_fd(5)
- ptmx(4)
- user_namespaces(7)
- resolv.conf(5)
- url(7)
- iso_8859_5(7)
- iso_8859-8(7)
- urn(7)
- process-keyring(7)
- proc_pid_auxv(5)
- proc_ksyms(5)
- proc_ide(5)
- veth(4)
- ldd(1)
- proc_swaps(5)
- landlock(7)
- proc_vmstat(5)
- system_data_types(7)
- cp1252(7)
- lirc(4)
- proc_kpageflags(5)
- random(7)
- precedence(7)
- cpuset(7)
- proc_pid_ns(5)
- acct(5)
- latin4(7)
- proc_pid_cgroup(5)
- proc_cpuinfo(5)
- iso_8859-2(7)
- proc_keys(5)
- charsets(7)
- pldd(1)
- proc_pid_stat(5)
- rtnetlink(7)
- netlink(7)
- ram(4)
- mem(4)
- iso-8859-6(7)
- proc_key-users(5)
- iso_8859_15(7)
- fanotify(7)
- proc_sys_net(5)
- sysfs(5)
- math_error(7)
- latin1(7)
- proc_pid_root(5)
- nptl(7)
- proc_cgroups(5)
- proc_iomem(5)
- proc_pid_statm(5)
- sem_overview(7)
- hier(7)
- full(4)
- proc_pid_status(5)
- proc_pid_cwd(5)
- proc_pid_cpuset(5)
- proc_scsi(5)
- uri(7)
- proc_diskstats(5)
- iso_8859_6(7)
- latin2(7)
- latin5(7)
- man-pages(7)
- ld.so(8)
- uts_namespaces(7)
- proc_pid_mountstats(5)
- intro(3)
- proc_pid_seccomp(5)
- proc_pid_wchan(5)
- attributes(7)
- symlink(7)
- mount_namespaces(7)
- charmap(5)
- tis-620(7)
- iso-8859-10(7)
- getent(1)
- proc_buddyinfo(5)
- ttytype(5)
- rtc(4)
- proc_malloc(5)
- suffixes(7)
- sln(8)
- signal(7)
- proc_sys_abi(5)
- signal-safety(7)
- time_namespaces(7)
- proc_pid_comm(5)
- raw(7)
- gai.conf(5)
- proc_crypto(5)
- locale(1)
- iso-8859-3(7)
- motd(5)
- proc_meminfo(5)
- iso-8859-8(7)
- protocols(5)
- proc_pid_map_files(5)
- pthreads(7)
- null(4)
- proc(5)
- zdump(8)
- socket(7)
- proc_sys_kernel(5)
- ddp(7)
- memusagestat(1)
- hd(4)
- iso-8859-14(7)
- shells(5)
- pipe(7)
- glob(7)
- proc_self(5)
- network_namespaces(7)
- utmp(5)
- proc_kcore(5)
- nsswitch.conf(5)
- sd(4)
- iso-8859-5(7)
- iso_8859_16(7)
- man(7)
- iso_8859-6(7)
- dir_colors(5)
- mq_overview(7)
- vsock(7)
- ascii(7)
- thread-keyring(7)
- fs(5)
- proc_pid_attr(5)
- proc_sys_debug(5)
- proc_sys(5)
- proc_pid_cmdline(5)
- pty(7)
- services(5)
- cgroup_namespaces(7)
- securetty(5)
- netdevice(7)
- iso_8859_13(7)
- host.conf(5)
- proc_pid_setgroups(5)
- proc_slabinfo(5)
- sock_diag(7)
- iso_8859-14(7)
- iso-8859-11(7)
- iso_8859_11(7)
- operator(7)
- regex(7)
- wavelan(4)
- proc_sys_fs(5)
- nologin(5)
- proc_pci(5)
- koi8-r(7)
- erofs(5)
- intro(2)
- utf8(7)
- proc_kallsyms(5)
- proc_sysvipc(5)
- queue(7)
- proc_sys_sunrpc(5)
- intro(5)
- latin8(7)
- mtrace(1)
- ipc_namespaces(7)
- dsp56k(4)
- iso_8859_4(7)
- proc_pid_smaps(5)
- proc_cmdline(5)
- rpc(5)
- proc_tty(5)
- proc_version(5)
- smartpqi(4)
- proc_pid_timerslack_ns(5)
- aio(7)
- session-keyring(7)
- resolver(5)
- slabinfo(5)
- wtmp(5)
- iso_8859_9(7)
- proc_locks(5)
- mailaddr(7)
- proc_pid_oom_score(5)
- kmem(4)
- iconvconfig(8)
- iso_8859-7(7)
- glibc(7)
- hostname(7)
- proc_thread-self(5)
- ipv6(7)
- iso_8859_7(7)
- proc_kpagecgroup(5)
- core(5)
- time(7)
- units(7)
- proc_dma(5)
- loop(4)
- address_families(7)
- zero(4)
- intro(4)
- procfs(5)
- iso_8859-4(7)
- vdso(7)
- tmpfs(5)
- iso-8859-16(7)
- iso_8859_10(7)
- user-session-keyring(7)
- libc(7)
- proc_fs(5)
- koi8-u(7)
- latin3(7)
- proc_tid_children(5)
- proc_pid_limits(5)
- proc_pid_coredump_filter(5)
- iso_8859-15(7)
- arp(7)
- urandom(4)
- iso_8859-10(7)
- hpsa(4)
- proc_pid_environ(5)
- boot(7)
- ftm(7)
- ld-linux(8)
- proc_driver(5)
- loop-control(4)
- iso_8859-16(7)
- proc_filesystems(5)
- tzfile(5)
- sprof(1)
- proc_pid_task(5)
- proc_pid_oom_score_adj(5)
- proc_mounts(5)
- iso-8859-4(7)
- iso_8859-1(7)
- utf-8(7)
- iso_8859-13(7)
- intro(6)
- proc_timer_list(5)
- rtld-audit(7)
- iso_8859-3(7)
- group(5)
- sched(7)
- proc_pid_clear_refs(5)
- hosts(5)
- iso_8859-11(7)
- numa(7)
- iso_8859_2(7)
- locale(7)
- iso-8859-1(7)
- fuse(4)
- proc_tid(5)
- proc_execdomains(5)
- proc_pid_mountinfo(5)
- intro(8)
- iso_8859_8(7)
- proc_loadavg(5)
- proc_pid_oom_adj(5)
- re_format(7)
- iso_8859_14(7)
- zic(8)
- bootparam(7)
- inotify(7)
- posixoptions(7)
- proc_partitions(5)
- iso-8859-9(7)
- proc_pid_mem(5)
- networks(5)
- proc_sys_user(5)
- udp(7)
- proc_zoneinfo(5)
- latin10(7)
- proc_pid_fdinfo(5)
- proc_pid_stack(5)
- memusage(1)
- spufs(7)
- pkeys(7)
- path_resolution(7)
- proc_ioports(5)
- intro(1)
- ldconfig(8)
- msr(4)
- svipc(7)
- port(4)
- proc_pid_personality(5)
- cciss(4)
- latin9(7)
- capabilities(7)
- localedef(1)
- vcs(4)
- iso_8859-5(7)
- elf(5)
- proc_sys_proc(5)
- console_codes(4)
- random(4)
- iso-8859-7(7)
- termcap(5)
- cpuid(4)
- environ(7)
- string_copying(7)
- proc_pid_gid_map(5)
- queue(3)
- termio(7)
- user-keyring(7)
- complex(7)
- latin7(7)
- proc_config.gz(5)
- udplite(7)
- kernel_lockdown(7)
- proc_devices(5)
- proc_apm(5)
- iso_8859_1(7)
- proc_pid_numa_maps(5)
apt-get install manpages
Available languages:
en fr pt_BR pl ja ru ro deManual
Capacités
NOMDESCRIPTION
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 .