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 …