Bash ha una funzione che interpreta alcune variabili d'ambiente come definizioni di funzioni. Ad esempio, con la variabile di ambiente HTTP_COOKIE
impostata su () { echo hello; }
, bash analizza il valore della variabile come una definizione di funzione, come se lo script fosse stato avviato con HTTP_COOKIE () { echo hello; }
. Il body della funzione non viene eseguito, a meno che lo script non chiami HTTP_COOKIE
come un comando: è la funzione definizione che viene eseguita.
La vulnerabilità di Shellshock è dovuta all'interpretazione delle variabili come più delle definizioni di funzioni. Ad esempio, se HTTP_COOKIE
è impostato su () { echo hello; }; echo pwned
, quindi bash analizza ed esegue la definizione di funzione all'avvio, e continua felicemente a eseguire il resto del contenuto della variabile, quindi esegue l'istruzione echo pwned
.
Con la patch Shellshock, sono accettate solo definizioni di funzioni ben formate. Un valore come () { echo hello; }; echo pwned
viene rifiutato perché contiene un codice finale dopo la definizione della funzione.
Lo script deve essere scritto con attenzione e non usare HTTP_COOKIE
(o qualunque variabile abbia contenuto che possa essere scelto da un avversario) come nome di comando. Solo i nomi delle variabili utilizzati come nomi dei comandi dallo script possono portare all'iniezione del codice: i nomi delle variabili utilizzati come variabili o non utilizzati nello script non rappresentano un problema.
Una variabile d'ambiente definita in uno script CGI non ha alcuna influenza su una shell avviata in un terminale. Le variabili d'ambiente influenzano i processi e sono ereditate dai sottoprocessi, non saltano magicamente in qualche modo su altri processi che accadono per eseguire la stessa applicazione.