Provided by: manpages-fr-dev_4.21.0-2_all bug

NOM

       access, faccessat, faccessat2 - Vérifier les permissions utilisateur d'un fichier

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

       #include <unistd.h>

       int access(const char *chemin, int mode);

       #include <fcntl.h>            /* Définition des constantes AT_* */
       #include <unistd.h>

       int faccessat(int dirfd, const char *chemin, int mode, int argument);
                       /* Mais voir les différences entre la bibliothèque C
                          et le noyau ci-dessous. */

       #include <fcntl.h>            /* Définition des constantes AT_* */
       #include <sys/syscall.h>      /*  Définition des constantes
                                                     SYS_* */
       #include <unistd.h>

       int syscall(SYS_faccessat2,
                   int dirfd, const char *chemin, int mode, int arguments);

   Exigences de macros de test de fonctionnalités pour la glibc (consulter feature_test_macros(7)) :

       faccessat() :
           Depuis la glibc 2.10 :
               _POSIX_C_SOURCE >= 200809L
           Avant la glibc 2.10 :
               _ATFILE_SOURCE

DESCRIPTION

       access()  vérifie  si  le  processus  appelant  peut  accéder  au  fichier  chemin. Si chemin est un lien
       symbolique, il est déréférencé.

       Le mode indique les vérifications d'accès à effectuer. Il prend la valeur F_OK ou un masque contenant  un
       OU binaire d'une ou plus des valeurs R_OK, W_OK et X_OK. F_OK teste l'existence du fichier. R_OK, W_OK et
       X_OK testent si le fichier existe et autorisent respectivement la lecture, l'écriture et l'exécution.

       Le test est effectué avec les UID et GID réels du processus appelant, plutôt qu'avec les ID effectifs qui
       sont  utilisés  lorsque l'on tente une opération (comme open(2)) sur le fichier. De la même manière, pour
       le superutilisateur, le test utilise  un  ensemble  de  capacités  permises  plutôt  que  l’ensemble  des
       capacités  effectives,  et  pour  les utilisateurs non privilégiés, le test utilise un ensemble vierge de
       capacités.

       Cela permet aux programmes Setuid et dotés de capacités de déterminer les autorisations de  l'utilisateur
       ayant  invoqué  le  programme.  En  d'autres  termes,  access()  ne  répond  pas  à la question « puis-je
       lire/écrire/exécuter ce fichier ? ». Il répond à une question légèrement différente : « en supposant  que
       je  suis  un binaire Setuid, l'utilisateur qui m'a appelé peut-il lire/écrire/exécuter ce fichier ? », ce
       qui donne aux programmes Setuid la possibilité d'empêcher  des  utilisateurs  malveillants  de  lire  des
       fichiers qu'un utilisateur ne devrait pas lire.

       Si le processus appelant est privilégié (c'est-à-dire son UID réel est zéro), alors une vérification X_OK
       réussit pour un fichier régulier si l'exécution est permise pour l'utilisateur propriétaire, le groupe ou
       pour les autres.

   faccessat()
       faccessat() opère exactement de la même manière que access(), excepté les différences décrites ici.

       Si  le  nom  de  chemin  fourni  dans  chemin  est  relatif, il est interprété relativement au répertoire
       référencé par le descripteur de fichier dirfd (plutôt que relativement au répertoire de  travail  courant
       du processus appelant, comme cela est fait par access() pour un chemin relatif).

       Si chemin est relatif et que dirfd est la valeur spéciale AT_FDCWD, chemin est interprété relativement au
       répertoire de travail courant du processus appelant (comme avec access()).

       Si pathname est absolu, alors dirfd est ignoré.

       argument est construit en réalisant un OU logique entre zéro ou plusieurs des valeurs suivantes :

       AT_EACCESS
              Réaliser  les vérifications d'accès en utilisant les UID et GID effectifs. Par défaut, faccessat()
              utilise les ID réels (comme access()).

       AT_SYMLINK_NOFOLLOW
              Si chemin est un lien symbolique, ne pas le déréférencer, mais renvoyer des  informations  sur  le
              lien lui-même.

       Consultez openat(2) pour une explication sur la nécessité de faccessat().

   faccessat2()
       La description de faccessat() donnée ci-dessus correspond à POSIX.1 et à l'implémentation fournie dans la
       glibc.  Cependant, l'implémentation de la glibc était une émulation imparfaite (voir BOGUES) qui masquait
       le fait que l'appel système faccessat() brut de Linux n'a pas  de  paramètre  argument.  Pour  avoir  une
       implémentation  correcte,  Linux 5.8 a ajouté l'appel système faccessat2() qui gère le paramètre argument
       et permet une bonne implémentation de la fonction enveloppe faccessat().

VALEUR RENVOYÉE

       En cas de succès (toutes les permissions demandées sont accordées,  ou  mode  vaut  F_OK  et  le  fichier
       existe),  0  est renvoyé. En cas d'erreur (au moins une permission de mode est refusée, ou mode vaut F_OK
       et le fichier n'existe pas, ou d'autres  erreurs  se  sont  produites),  -1  est  renvoyé  et  errno  est
       positionné pour indiquer l'erreur.

ERREURS

       EACCES L'accès  est  refusé au fichier lui‐même, ou il n'est pas permis de parcourir l'un des répertoires
              du préfixe de chemin (consultez aussi path_resolution(7)).

       EBADF  (faccessat()) pathname est relatif mais dirfd ne vaut ni AT_FDCWD (faccessat()), ni un descripteur
              de fichier valable.

       EFAULT nom_chemin pointe en dehors de l'espace d'adressage accessible.

       EINVAL mode était mal indiqué.

       EINVAL (faccessat()) Attribut non valable indiqué dans flags.

       EIO    Une erreur d'entrée-sortie s'est produite.

       ELOOP  Trop de liens symboliques ont été rencontrés en parcourant nom_chemin.

       ENAMETOOLONG
              nom_chemin est trop long.

       ENOENT Un composant du chemin d'accès chemin n'existe pas ou est un lien symbolique pointant nulle part.

       ENOMEM La mémoire disponible du noyau n'était pas suffisante.

       ENOTDIR
              Un élément, utilisé  comme  répertoire,  du  chemin  d'accès  nom_chemin  n'est  pas  en  fait  un
              répertoire.

       ENOTDIR
              (faccessat())  pathname  est relatif et dirfd est un descripteur de fichier faisant référence à un
              fichier qui n'est pas un dossier.

       EPERM  Une écriture est demandée sur un fichier où  un  attribut  immuable  est  positionné.  Voir  aussi
              ioctl_iflags(2).

       EROFS  Une écriture est demandée sur un système de fichiers en lecture seule.

       ETXTBSY
              Une écriture a été demandée dans un fichier exécutable qui est en cours d'utilisation.

VERSIONS

       faccessat()  a  été ajouté dans Linux 2.6.16 ; la prise en charge de la bibliothèque a été ajouté dans la
       glibc 2.4.

       faccessat2() a été ajouté à Linux 5.8.

STANDARDS

       access() : SVr4, 4.3BSD, POSIX.1-2001, POSIX.1-2008.

       faccessat() : POSIX.1-2008.

       faccessat2() : spécifique à Linux

NOTES

       Attention : Utiliser ces appels pour vérifier si un utilisateur a le  droit,  par  exemple,  d'ouvrir  un
       fichier  avant  d'effectuer  réellement l'ouverture avec open(2), risque de créer un trou de sécurité. En
       effet, l'utilisateur peut exploiter le petit intervalle de temps entre la vérification  et  l'accès  pour
       modifier  le fichier. Pour cette raison, l'utilisation de cet appel système devrait être évitée (dans cet
       exemple,  une  alternative  plus  sûre  serait  de  basculer  temporairement  l'identifiant  effectif  de
       l'utilisateur vers l'identifiant réel et d'appeler open(2)).

       La  fonction  access()  déréférence  toujours  les liens symboliques. Si vous avez besoin de vérifier les
       droits sur un lien symbolique, utilisez faccessat(2) avec l'attribut AT_SYMLINK_NOFOLLOW.

       Ces appels renvoient une erreur si l'un des types d'accès de mode est  refusé,  même  si  d'autres  types
       indiqués dans mode sont autorisés.

       Si  le  processus  appelant a les privilèges suffisants (c'est-à-dire est superutilisateur), POSIX.1-2001
       permet à une implémentation d'indiquer un succès pour X_OK même si le fichier n'a aucun  bit  d'exécution
       positionné. Linux ne le permet pas.

       Un  fichier  n'est  accessible  que  si  les  permissions  de chacun des répertoires du préfixe du chemin
       permettent les recherches (c'est-à-dire l'exécution). Si un répertoire est inaccessible, alors l'appel  à
       access() échouera, sans tenir compte des permissions du fichier lui-même.

       Seuls  les  bits  d'accès  sont  vérifiés  et non le type ou le contenu du fichier. Ainsi, l'autorisation
       d'écriture dans un répertoire indique probablement la possibilité d'y  créer  des  fichiers  et  non  d'y
       écrire  comme  dans  un  fichier. De même, un fichier DOS peut être considéré comme exécutable, alors que
       l'appel execve(2) échouera toujours.

       Ces appels peuvent fonctionner incorrectement sur un serveur NFSv2  si  les  correspondances  d'UID  sont
       activées,  car  ces  correspondances  sont  gérées  par le serveur et masquées au client qui effectue les
       vérifications d'autorisation. Ces vérifications sont effectuées sur le serveur  pour  les  versions 3  et
       supérieures de NFS. Des problèmes similaires peuvent survenir avec les montages FUSE.

   Différences entre bibliothèque C et noyau
       L’appel  système brut faccessat() n’accepte que les trois premiers arguments. Les attributs AT_EACCESS et
       AT_SYMLINK_NOFOLLOW sont en fait implémentés dans la fonction enveloppe de la glibc pour faccessat().  Si
       un  de  ces  attributs  est  indiqué, la fonction enveloppe utilise fstatat(2) pour déterminer les droits
       d'accès, mais voir BOGUES.

   Notes de la glibc
       Sur les anciens noyaux où faccessat()  n'est  pas  disponible  (et  quand  les  attributs  AT_EACCESS  et
       AT_SYMLINK_NOFOLLOW  ne  sont  pas  spécifiés),  la fonction enveloppe de la glibc se rabat sur access().
       Quand chemin est un chemin relatif, la glibc construit  un  chemin  à  partir  du  lien  symbolique  dans
       /proc/self/fd qui correspond au paramètre dirfd.

BOGUES

       L'appel  système  faccessat()  du noyau Linux ne prenant pas en charge le paramètre argument, la fonction
       enveloppe faccessat() fournie dans la glibc 2.32 et antérieure  émule  la  fonctionnalité  nécessaire  en
       utilisant  une combinaison de l'appel système faccessat() et de fstatat(2). Mais cette émulation ne prend
       pas en charge les ACL (listes de contrôle d'accès). À partir de  la  glibc 2.33,  la  fonction  enveloppe
       évite ce bogue en utilisant l'appel système faccessat2() là où il est fourni par le noyau sous-jacent.

       Dans  Linux 2.4  (et  auparavant) les tests X_OK sont gérés de façon bizarre pour le superutilisateur. Si
       toutes les catégories de permission  d'exécution  sont  désactivées  pour  un  fichier  (n'étant  pas  un
       répertoire), access() ne renvoie -1 que si le mode est juste X_OK ; si R_OK ou W_OK est également précisé
       dans  le  mode,  access()  renvoie  0  pour  ce  fichier. Les premiers Linux 2.6 (jusqu'à Linux 2.6.3) se
       comportaient de la même façon que Linux 2.4.

       Avant Linux 2.6.20, ces appels ignoraient l'effet de l'attribut MS_NOEXEC s'il était utilisé pour  monter
       le système de fichiers sous-jacent (avec mount(2)). Depuis Linux 2.6.20, l'attribut MS_NOEXEC est pris en
       compte.

VOIR AUSSI

       chmod(2),    chown(2),   open(2),   setgid(2),   setuid(2),   stat(2),   euidaccess(3),   credentials(7),
       path_resolution(7), symlink(7)

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> et Jean-Philippe MENGUAL <jpmengual@debian.org>

       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.

Pages du manuel de Linux 6.03                    5 février 2023                                        access(2)