Il n'y a pas de division de mot (comme dans la fonctionnalité qui fractionne les variables lors des extensions non cotées) dans ce code car il $myvar
n'est pas non cité.
Il existe cependant une vulnérabilité d'injection de commandes telle qu'elle $myvar
est développée avant d'être transmise à bash
. Son contenu est donc interprété comme du code bash!
Les espaces qui s'y trouvent entraîneront la transmission de plusieurs arguments cd
, non pas à cause du fractionnement de mots , mais parce qu'ils seront analysés comme plusieurs jetons dans la syntaxe du shell. Avec une valeur de bye;reboot
, cela redémarrera! ¹
Ici, vous voudriez:
sudo bash -c 'cd -P -- "$1"' bash "$myvar"
(où vous passez le contenu de $myvar
comme premier argument de ce script en ligne; notez comment les deux $myvar
et $1
ont été cités pour leur shell respectif afin d'empêcher le fractionnement de mots IFS (et la globalisation)).
Ou:
sudo MYVAR="$myvar" bash -c 'cd -P -- "$MYVAR"'
(où vous passez le contenu de $myvar
dans une variable d'environnement).
Bien sûr, vous n'obtiendrez rien d'utile en exécutant uniquement cd
dans ce script en ligne (à part vérifier si vous root
pouvez cd
y entrer). Vraisemblablement, vous voulez que ce script soit cd
là et ensuite faire autre chose comme:
sudo bash -c 'cd -P -- "$1" && do-something' bash "$myvar"
Si l'intention était d'utiliser sudo
pour pouvoir accéder à cd
un répertoire auquel vous n'avez pas accès autrement, cela ne peut pas vraiment fonctionner.
sudo sh -c 'cd -P -- "$1" && exec bash' sh "$myvar"
lancera une interaction bash
avec son répertoire actuel dans $myvar
. Mais ce shell fonctionnera comme root
.
Vous pourriez faire:
sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
Pour obtenir une interaction non privilégiée bash
avec le répertoire actuel $myvar
, mais si vous n'aviez pas les autorisations pour cd
y accéder en premier lieu, vous ne pourrez rien faire dans ce répertoire même s'il s'agit de votre répertoire de travail actuel.
$ myvar=/var/spool/cron/crontabs
$ sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
bash-4.4$ ls
ls: cannot open directory '.': Permission denied
Une exception serait si vous disposez d'une autorisation de recherche sur le répertoire lui-même mais pas sur l'un des composants de répertoire de son chemin:
$ myvar=1/2
$ mkdir -p "$myvar"
$ chmod 0 1
$ cd 1/2
cd: permission denied: 1/2
$ sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
bash-4.4$ pwd
/home/stephane/1/2
bash-4.4$ mkdir 3
bash-4.4$ ls
3
bash-4.4$ cd "$PWD"
bash: cd: /home/stephane/1/2: Permission denied
¹ à proprement parler, pour des valeurs $myvar
similaires $(seq 10)
(littéralement), il y aurait bien sûr un fractionnement des mots lors de l'expansion de cette substitution de commandes par le bash
shell commencé commeroot
cd
seul a un effet à l'intérieur de labash -c
coque.