Non c'è suddivisione di parole (come nella funzione che divide le variabili su espansioni non quotate) in quel codice in quanto $myvar
non è quotato.
Esiste tuttavia una vulnerabilità nell'iniezione di comandi che $myvar
viene 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 $myvar
come primo argomento di quello script inline; nota come entrambi $myvar
e $1
sono 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 $myvar
una variabile d'ambiente).
Ovviamente non otterrai nulla di utile eseguendo solo cd
in quello script inline (oltre a verificare se è root
possibile cd
entrare lì). Presumibilmente, vuoi che lo script sia cd
lì e poi fai qualcos'altro come:
sudo bash -c 'cd -P -- "$1" && do-something' bash "$myvar"
Se l'intenzione era quella sudo
di essere in grado di accedere a cd
una 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 bash
con 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 bash
con la directory corrente $myvar
, ma se non avessi i permessi per accedere a cd
quella 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 $myvar
like $(seq 10)
(letteralmente), ci sarebbe naturalmente una divisione delle parole all'espansione di quel comando di sostituzione da parte della bash
shell iniziata comeroot
cd
unico ha effetto all'interno dellabash -c
shell.