source
nie jest bezpieczny, ponieważ wykona dowolny kod. Może to nie stanowić problemu, ale jeśli uprawnienia do plików są niepoprawne, osoba atakująca z dostępem do systemu plików może wykonać kod jako użytkownik uprzywilejowany przez wstrzyknięcie kodu do pliku konfiguracyjnego załadowanego w inny sposób zabezpieczonym skryptem, takim jak skrypt inicjujący.
Jak dotąd najlepszym rozwiązaniem, jakie udało mi się zidentyfikować, jest niezdarne rozwiązanie na nowo:
myscript.conf
password=bar
echo rm -rf /
PROMPT_COMMAND='echo "Sending your last command $(history 1) to my email"'
hostname=localhost; echo rm -rf /
Przy użyciu source
uruchomiłoby się to echo rm -rf /
dwukrotnie, a także zmieniłoby działającego użytkownika $PROMPT_COMMAND
. Zamiast tego wykonaj następujące czynności:
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 (kompatybilny z 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
Proszę odpowiedzieć, jeśli znajdziesz w moim kodzie lukę w zabezpieczeniach.