source
no es seguro ya que ejecutará código arbitrario. Esto puede no ser una preocupación para usted, pero si los permisos de los archivos son incorrectos, es posible que un atacante con acceso al sistema de archivos ejecute el código como un usuario privilegiado mediante la inyección de código en un archivo de configuración cargado por un script protegido de otra manera, como un guión de inicio.
Hasta ahora, la mejor solución que he podido identificar es la torpe solución de reinventar la rueda:
myscript.conf
password=bar
echo rm -rf /
PROMPT_COMMAND='echo "Sending your last command $(history 1) to my email"'
hostname=localhost; echo rm -rf /
Utilizando source
, esto se ejecutaría echo rm -rf /
dos veces, así como cambiaría el usuario en ejecución $PROMPT_COMMAND
. En cambio, haz esto:
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 ( compatible 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
Responda si encuentra una vulnerabilidad de seguridad en mi código.