fexecve - Exécuter un programme indiqué par un descripteur de
fichier
Bibliothèque C standard (
libc,
-lc)
#include <unistd.h>
int fexecve(int fd, char *const argv[], char *const envp[]);
fexecve() :
Depuis la glibc 2.10 :
_POSIX_C_SOURCE >= 200809L
Avant la glibc 2.10 :
_GNU_SOURCE
fexecve() effectue la même tâche que
execve(2),
excepté que le fichier à exécuter est indiqué
à l’aide d’un descripteur de fichier
fd au lieu
d'un chemin. Le descripteur de fichier
fd doit être ouvert en
lecture seule (
O_RDONLY) ou avec le drapeau
O_PATH, et
l'appelant doit avoir les permissions nécessaires pour exécuter
le fichier lié au descripteur de fichier.
En cas de réussite, la fonction
fexecve() ne rend pas la main. En
cas d'erreur, la fonction renvoie
-1 et
errno est définie
avec le code d'erreur correspondant.
Les erreurs sont les mêmes que pour
execve(2), avec en
plus :
- EINVAL
-
fd n'est pas un descripteur de fichier valable, ou
argv est NULL, ou envp est NULL.
- ENOENT
- Le drapeau close-on-exec est défini pour le
descripteur de fichier fd et fd est associé à
un script. Voir BOGUES.
- ENOSYS
- Le noyau ne prend pas en charge l'appel système
execveat(2) et l'accès à l'arborescence /proc
a échoué.
fexecve() est disponible depuis la glibc 2.3.2.
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
fexecve() |
Sécurité des threads |
MT-Safe |
POSIX.1-2008. Cette fonction n'est pas spécifiée dans POSIX.1-2001
et n'est que rarement disponible sur d'autres systèmes. Cette fonction
est spécifiée dans POSIX.1-2008.
Sous Linux avec les versions 2.26 et antérieures de la glibc,
fexecve() est implémentée en utilisant l'arborescence
proc(5) ;
/proc doit donc être montée et
disponible au moment de l'appel. Depuis la version 2.27 de la glibc et si le
noyau prend en charge l'appel système
execveat(2),
fexecve() est implémenté en utilisant cet appel
système, ce qui a pour avantage de ne pas nécessiter le montage
de
/proc.
L’idée derrière
fexecve() est de permettre à
l’appelant de vérifier (avec une somme de contrôle) le
contenu d’un exécutable avant de l’exécuter. Juste
ouvrir le fichier et calculer la somme de contrôle du contenu avant de
faire un
execve() ne suffirait pas puisque, entre les deux
étapes, la partie chemin du nom du fichier ou le nom de fichier
lui-même pourraient avoir été modifiés (par
exemple en modifiant la cible d’un lien symbolique).
fexecve()
n’atténue pas le problème lié au fait que le
contenu d’un fichier pourrait être modifié entre
le calcul de la somme de contrôle et l’appel à
fexecve(). Pour cela, la solution consiste à s’assurer
que les permissions sur le fichier l’empêchent
d’être modifié par un utilisateur malveillant.
L'idée sous-jacente à l'utilisation de
fexecve() consiste
à définir le drapeau close-on-exec pour le descripteur de
fichier
fd de façon à ce que ce dernier ne se propage pas
vers le programme exécuté. Cette approche est naturelle pour
deux raisons. Premièrement, elle évite une consommation inutile
de descripteurs de fichiers (normalement, le programme exécuté
n'a nul besoin d'un descripteur de fichier associé à
lui-même). Deuxièmement, si
fexecve() est utilisé
de manière récursive, l'emploi du drapeau close-on-exec
empêche l'épuisement des descripteurs de fichiers disponibles
qui pourrait découler du fait que chaque étape du traitement
récursif provoque la transmission d'un ou plusieurs descripteurs de
fichiers au nouveau programme (voir tout de même BOGUES à ce
sujet).
Si le descripteur de fichier
fd est associé à un script
(autrement dit un fichier texte exécutable dont la première
ligne qui commence par les caractères
#! désigne
l'interpréteur du script), et si le drapeau close-on-exec a
été défini pour le descripteur de fichier
fd,
fexecve() échoue avec un code d'erreur
ENOENT. Cette
erreur est due au fait qu'au moment où l'interpréteur du script
s'exécute, le descripteur de fichier
fd a déjà
été fermé à cause de la présence du drapeau
close-on-exec. C'est pourquoi le drapeau close-on-exec ne peut pas être
défini pour le descripteur de fichier
fd si ce dernier est
associé à un script, ce qui provoquerait les problèmes
décrits dans NOTES.
execve(2),
execveat(2)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Lucien Gentis <
[email protected]>
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 à
[email protected]