source
ไม่ปลอดภัยเนื่องจากจะใช้รหัสโดยอำเภอใจ สิ่งนี้อาจไม่เป็นปัญหาสำหรับคุณ แต่หากสิทธิ์ของไฟล์ไม่ถูกต้องอาจเป็นไปได้ที่ผู้โจมตีที่มีสิทธิ์เข้าถึงระบบไฟล์เพื่อเรียกใช้รหัสในฐานะผู้ใช้ที่มีสิทธิ์โดยการฉีดรหัสเข้าไปในไฟล์ปรับแต่งที่โหลดโดยสคริปต์ที่ปลอดภัย สคริปต์ init
จนถึงตอนนี้ทางออกที่ดีที่สุดที่ฉันสามารถระบุได้คือวิธีแก้ปัญหาซ้ำซาก - ล้อ:
myscript.conf
password=bar
echo rm -rf /
PROMPT_COMMAND='echo "Sending your last command $(history 1) to my email"'
hostname=localhost; echo rm -rf /
การใช้source
สิ่งนี้จะทำงานecho rm -rf /
สองครั้งรวมถึงเปลี่ยนผู้ใช้ที่กำลังทำงาน$PROMPT_COMMAND
อยู่ ให้ทำสิ่งนี้แทน:
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 (รองรับ 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
โปรดตอบกลับหากคุณพบช่องโหว่ด้านความปลอดภัยในรหัสของฉัน