source
không an toàn vì nó sẽ thực thi mã tùy ý. Điều này có thể không phải là mối quan tâm của bạn, nhưng nếu quyền truy cập tệp không chính xác, có thể kẻ tấn công có quyền truy cập hệ thống tệp để thực thi mã với tư cách là người dùng đặc quyền bằng cách tiêm mã vào tệp cấu hình được tải bởi tập lệnh được bảo mật khác, chẳng hạn như kịch bản init.
Cho đến nay, giải pháp tốt nhất mà tôi có thể xác định là giải pháp tái tạo vụng về vụng về:
myscript.conf
password=bar
echo rm -rf /
PROMPT_COMMAND='echo "Sending your last command $(history 1) to my email"'
hostname=localhost; echo rm -rf /
Sử dụng source
, điều này sẽ chạy echo rm -rf /
hai lần, cũng như thay đổi người dùng đang chạy $PROMPT_COMMAND
. Thay vào đó, hãy làm điều này:
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 (Tương thích 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
Vui lòng trả lời nếu bạn tìm thấy một khai thác bảo mật trong mã của tôi.