Non c'è suddivisione di parole (come nella funzione che divide le variabili su espansioni non quotate) in quel codice in quanto $myvarnon è quotato.
Esiste tuttavia una vulnerabilità nell'iniezione di comandi che $myvarviene espansa prima di essere passata a bash. Quindi il suo contenuto è interpretato come codice bash!
Gli spazi all'interno causeranno il passaggio di numerosi argomenti cd, non a causa della divisione delle parole , ma perché verranno analizzati come diversi token nella sintassi della shell. Con un valore di bye;reboot, questo verrà riavviato! ¹
Qui, vorresti:
sudo bash -c 'cd -P -- "$1"' bash "$myvar"
(dove passi il contenuto $myvarcome primo argomento di quello script inline; nota come entrambi $myvare $1sono stati quotati per la loro rispettiva shell per prevenire la divisione delle parole IFS (e il globbing)).
O:
sudo MYVAR="$myvar" bash -c 'cd -P -- "$MYVAR"'
(dove passi il contenuto di $myvaruna variabile d'ambiente).
Ovviamente non otterrai nulla di utile eseguendo solo cd in quello script inline (oltre a verificare se è rootpossibile cdentrare lì). Presumibilmente, vuoi che lo script sia cdlì e poi fai qualcos'altro come:
sudo bash -c 'cd -P -- "$1" && do-something' bash "$myvar"
Se l'intenzione era quella sudodi essere in grado di accedere a cduna directory a cui altrimenti non si ha accesso, allora non può davvero funzionare.
sudo sh -c 'cd -P -- "$1" && exec bash' sh "$myvar"
avvierà un interattivo bashcon la sua directory corrente in $myvar. Ma quella shell funzionerà come root.
Potresti fare:
sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
Per ottenere un'interattività senza privilegi bashcon la directory corrente $myvar, ma se non avessi i permessi per accedere a cdquella directory in primo luogo, non sarai in grado di fare nulla in quella directory anche se è la tua directory di lavoro corrente.
$ 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
Un'eccezione sarebbe se si dispone dell'autorizzazione di ricerca per la directory stessa ma non per uno dei componenti della directory del suo percorso:
$ 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
¹ a rigor di termini, per valori di $myvarlike $(seq 10)(letteralmente), ci sarebbe naturalmente una divisione delle parole all'espansione di quel comando di sostituzione da parte della bash shell iniziata comeroot
cdunico ha effetto all'interno dellabash -cshell.