Man page - access(2)

Packages contains this manual

Available languages:

en fr pl nl ja ru de

Manual

access

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
faccessat()
faccessat2()
VALEUR RENVOYÉE
ERREURS
VERSIONS
Différences entre bibliothÚque C et noyau
Notes de la glibc
STANDARDS
HISTORIQUE
NOTES
BOGUES
VOIR AUSSI
TRADUCTION

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 .