Я работаю над проектом, который использует огромное количество shellscripts для всех целей, а производительность и мобильность важны. Некоторые из этих сценариев используют файлы конфигурации, которые имеют следующий формат:Как фильтровать опасные символы в сценарии bash?
VARIABLE1="value"
VARIABLE2="several words, several values"
VARIABLE3="a,list,of,words"
Затем, чтобы использовать эти переменные, которые мы просто должны TDO следующее:
#!/bin/sh
. /path/to/the/configuration.file
echo "Var 1 is: $VARIABLE1"
echo "Var 2 is: $VARIABLE2"
echo "Var 3 is: $VARIABLE3"
Простой, правильно?
Не так много. Дело в том, что в то время как мы можем защитить скрипты против модификации с простым chown root file.sh; chmod 0711 file.sh
, конфигурационные файлы должны быть доступны для записи, а затем выяснить, что неприятные вещи, как это может произойти:
VARIABLE1="value"; rm requiredfile.data
VARIABLE2="you dont want to see this: `rm anotherimportantfile.data`
rm thelastrequiredfile.bin
Так что, когда файл конфигурации вызывается, введенные в него инструкции будут , выполняемые с привилегиями любого пользователя, который фактически вызывает его.
Я знаю, что я прошу сложно, но я хотел бы иметь возможность фильтровать все опасные синтаксисы, которые могут привести к несанкционированному выполнению кода.
Что я сделал до сих пор:
FILTER='
/^$/d # Delete empty lines
/^#/d # Delete comments
/^[A-Z0-9_]\+=.\+$/{ # Select assignments
/`/p # alert with `
/\$/p # alert with $
/\\/p # alert with \
/;/p # alert with ;
d # Accept the rest
}
'
C=`sed -e "$FILTER" $1 | wc -l` 2>/dev/null
if test $C -gt 0; then
echo "#ERR Suspicious strings in configuration file"
fi
Что мне не хватает? Любые улучшения?
PS: Я знаю, что можно было бы безопасно читать каждую переменную с помощью комбинации grep
/cut
, но о проблемах с производительностью не может быть и речи.
Для начала вам не хватает bashism '$ (...)', который является эквивалентом '\' ... \ ''. – Phylogenesis
Спасибо, @Phylogenesis. Я забыл об этом. Добавьте его. – opalenzuela
@JakubJirutka не только производительность - это ключ, но и переносимость между платформами с разными архитектурами. Возьмите его как ограничивающее ограничение :) – opalenzuela