Le script bash peut-il réinitialiser et désinfecter l'environnement * entier * et comment?

Vous connaissez ce truc sudo :

Defaults env_reset

ce qui rend l'injection d'environnement impossible. J'étais errant si cette fonctionnalité peut être obtenue directement à partir du script bash, "de l'intérieur"?

Au less une partie peut le faire, c'est certain. Exemple:

 #!/usr/bin/env php <?php //... // sanitizes $PATH putenv("PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"); // unsets $LD_LIBRARY_PATH, as it should be in Ubuntu putenv('LD_LIBRARY_PATH'); //... 

Pouvons-nous faire env_reset dans le script en cours d'exécution comme le fait sudo et comment?

MODIFIER:

Je ne cherche pas le moyen de le faire "de l'extérieur" comme la env -i command mais de l'intérieur même du script. Mon intention est d'assurer la security, peu importe qui (quel user) et comment (dans quelles circonstances, c'est-à-dire les variables env) l'exécute.

bash utilise lui-même des variables d'environnement. Au moment où bash est démarré et prêt à interpréter sa première command, il est déjà trop tard, un environnement malveillant peut avoir déjà fait des dégâts.

Vous avez besoin que l'environnement ait été assaini avant que bash soit appelé. Vous pouvez effacer l'environnement avec la fonction clearenv() C sur la plupart des systèmes ou vous pouvez simplement appeler execve() sur votre script et transmettre une list vide dans le paramètre envp .

Même avec un script qui contient:

 #! /bin/bash - : 

( : étant un builtin spécial), si l'environnement contient SHELLOPTS=xtrace PS4='$(reboot)' , la command reboot sera invoquée sur SHELLOPTS=xtrace PS4='$(reboot)'

Si bash est lié dynamicment, LD_PRELOAD / LD_LIBRARY_PATH peut faire bash code arbitraire dès qu'il est appelé.

bash honore également le charset de la locale pour son parsing, donc avec LC_* variables LOCPATH et LC_* , vous pouvez même avoir le #! /bin/bash - #! /bin/bash - line invoque le code arbitraire (en rendant les caractères #!/bina vides par exemple).

Voir également:

 env SHELLOPTS=noexec any-bash-script 

Cela arrête de faire quoi que ce soit.

Ce ne sont que quelques exemples.

Notez également que les variables d'environnement ne sont pas les seules choses héritées au démarrage et qui peuvent affecter son comportement (comme les arguments, les umask, les limites, le directory de travail en cours, les descripteurs de files ouverts, la disposition des signaux, le terminal de contrôle …).

Vous pouvez find vos exports avec export -p ou simplement export et replace le declare -x par declare +x sur chaque ligne pour l'annuler:

 eval "$(export|sed s/-/+/)" 

Si vous le placez au début de votre script, aucune variable d'environnement ne sera transmise aux programmes qu'elle exécute, sauf si vous les exportez vous-même. Vous voudrez probablement exporter les variables locales et TZ , et TERM , et plus …