source
non è sicuro in quanto eseguirà codice arbitrario. Questo potrebbe non essere un problema per te, ma se le autorizzazioni dei file non sono corrette, potrebbe essere possibile per un utente malintenzionato con accesso al filesystem eseguire codice come utente privilegiato iniettando il codice in un file di configurazione caricato da uno script altrimenti protetto come un script init.
Finora, la migliore soluzione che sono stato in grado di identificare è la soluzione goffa che reinventa la ruota:
myscript.conf
password=bar
echo rm -rf /
PROMPT_COMMAND='echo "Sending your last command $(history 1) to my email"'
hostname=localhost; echo rm -rf /
Utilizzando source
, questo verrebbe eseguito echo rm -rf /
due volte, oltre a cambiare l'utente in esecuzione $PROMPT_COMMAND
. Invece, fai questo:
myscript.sh (Bash 4)
#!/bin/bash
typeset -A config # init array
config=( # set default values in config array
[username]="root"
[password]=""
[hostname]="localhost"
)
while read line
do
if echo $line | grep -F = &>/dev/null
then
varname=$(echo "$line" | cut -d '=' -f 1)
config[$varname]=$(echo "$line" | cut -d '=' -f 2-)
fi
done < myscript.conf
echo ${config[username]} # should be loaded from defaults
echo ${config[password]} # should be loaded from config file
echo ${config[hostname]} # includes the "injected" code, but it's fine here
echo ${config[PROMPT_COMMAND]} # also respects variables that you may not have
# been looking for, but they're sandboxed inside the $config array
myscript.sh (compatibile con Mac / Bash 3)
#!/bin/bash
config() {
val=$(grep -E "^$1=" myscript.conf 2>/dev/null || echo "$1=__DEFAULT__" | head -n 1 | cut -d '=' -f 2-)
if [[ $val == __DEFAULT__ ]]
then
case $1 in
username)
echo -n "root"
;;
password)
echo -n ""
;;
hostname)
echo -n "localhost"
;;
esac
else
echo -n $val
fi
}
echo $(config username) # should be loaded from defaults
echo $(config password) # should be loaded from config file
echo $(config hostname) # includes the "injected" code, but it's fine here
echo $(config PROMPT_COMMAND) # also respects variables that you may not have
# been looking for, but they're sandboxed inside the $config array
Ti preghiamo di rispondere se trovi un exploit di sicurezza nel mio codice.