Utilisation standard de getenv et de pratiques sûres

J’essaie d’écrire du code C qui utilise certaines variables ENV dans un environnement UNIX. La question est: les variables de lecture (par exemple, getenv ()) peuvent-elles provoquer un dépassement de tampon? De plus, comment trouver la limite de la taille de la variable env pour ma plate-forme? Par exemple quel fichier d’en-tête?

Enfin, quelles sont les pratiques de code les plus sûres dans la lecture des variables fournies par l’environnement?

La lecture d’une variable d’environnement avec getenv() ne provoquera pas de dépassement de tampon.

Sur Linux, les variables d’environnement héritées et leurs valeurs sont stockées dans l’espace d’adressage du processus par le kernel lors de exec() . La fonction getenv() renvoie simplement un pointeur sur ces données existantes. Comme il ne copie pas de données, il n’y a pas de tampon et il ne peut y avoir de dépassement de tampon.

Si vous essayez de passer trop de variables d’environnement à un nouveau processus, exec() signalera l’erreur E2BIG .

Problèmes de sécurité

Il n’y a pas vraiment de problème de dépassement de tampon avec les variables d’environnement.

Les problèmes de sécurité sont liés au fait que vous ne devriez pas faire confiance au contenu de l’environnement. Si votre programme est exécuté setuid (ou setgid, etc.), l’environnement est un vecteur d’attaque. L’utilisateur peut définir PATH ou LD_PRELOAD ou d’autres variables de manière malveillante.

Cependant, il est rare d’écrire des programmes setuid. C’est une bonne chose, car il y a tant de raisons pour lesquelles il est difficile de sécuriser les programmes setuid.

  #include #include main() { char *hai; printf("The current User name is\n"); hai="USER"; printf("%s\n",getenv(hai)); printf("The current User Directory is\n"); char *hai1="PWD"; printf("%s\n",getenv(hai1)); exit(0); } 

Ce programme transmet l’argument de la fonction getenv () dont les moyens valides obtiennent la sortie

  Output: The current User name is loganaayahee The current User Directory is /home/loganaayahee/AdvanceUnix/ (or) 

Ce n’est pas la variable d’environnement qui signifie que la fonction getenv () retourne NULL.

  hai="HELLO"; if(getenv(hai)==NULL) { printf("This is not Env\n"); } else{ printf("%s\n",getenv(hai)); } 

Sortie: ce n’est pas Env

Cela dépend de ce que vous entendez par “lire”. getenv ne posera aucun problème. Cependant, si vous essayez de copier la chaîne renvoyée dans un tampon quelconque et que vous ne vérifiez pas la limite du tampon, vous risquez de recevoir un dépassement de mémoire tampon. La chaîne renvoyée par getenv peut être volumineuse, sans limite supérieure autre que la mémoire disponible que votre système décide d’affecter à l’environnement.

Ce n’est pas différent de toute autre entrée de chaîne que vous pouvez obtenir – prenez garde à utiliser strcpy et strcpy car ils ne vérifient pas la taille de votre tampon de sortie.

Vous devez faire attention à l’environnement, en particulier si vous souhaitez le transmettre à des processus enfants. Par exemple, l’environnement est supposé contenir une seule valeur pour chaque variable, mais il est facile d’en créer une qui en contient plusieurs. Si vous supprimez le premier et transmettez le résultat, un autre sera exposé. Si vous souhaitez assainir l’environnement pour les enfants, créez-le à partir de zéro et non en supprimant des valeurs de celle que vous avez. David Wheeler a un guide pour la programmation sécurisée sous Unix / Linux sur son site Web .