Provided by: manpages-fr-dev_4.26.0-1_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_EMPTY_PATH (depuis Linux 5.8)
              Si chemin est une chaîne vide, opérer sur le fichier référencé  par  dirfd  (qui  peut  avoir  été
              obtenu  avec  l'attribut  O_PATH  de open(2)). Dans ce cas, dirfd peut faire référence à n'importe
              quel type de fichier, pas seulement à un répertoire. Si dirfd est AT_FDCWD, l'appel opére  sur  le
              répertoire  de  travail  en  cours. Cet attribut est spécifique à Linux ; définir _GNU_SOURCE pour
              obtenir sa définition.

       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
              FS_IOC_SETFLAGS(2const).

       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

       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.

   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.

STANDARDS

       access()
       faccessat()
              POSIX.1-2008.

       faccessat2()
              Linux.

HISTORIQUE

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

       faccessat()
              Linux 2.6.16, glibc 2.4.

       faccessat2()
              Linux 5.8.

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.

       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.

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.9.1                    13 juin 2024                                         access(2)