Вот кто хоть раз интересовался безопасностью, наверное помнят всякие инъекции в php и не только...
Напомню, инъекция кода, это из-за недостатка фильтрации данных атакующий может выполнить произвольный код.
По работе часто пишу bash скрипты, для автоматизации, думал в скриптах всё надежно в этом плане, но недавно узнал про интересный вектор атак, проанализировал свои скрипты и...
Нашел бяку.)))
Итак векторы атак:
1)Нет фильтрации обработки имени файла, например у вас код, который работает со списком файлов такой:
Код:
for file in $(ls); do
echo "Processing $file"
some_tool $file
done
Тут some_tool $file интерпретатор может интерпретировать имя файла, как команду, например:
Код:
some_tool evil; rm -rf /
первая команда будет some_tool evil,
вторая команда — rm -rf / → это уже полная командная инъекция.
или хуже — что-то такое:
Код:
for file in $(ls); do
bash -c "process $file"
done
Если кто-то создаст имя файла как goodfile; rm -rf /;
То опачки, будет команда в bash -c "process goodfile; rm -rf /;"
Как две команды process goodfile; и rm -rf /;
2)Второй вектор атаки, атака на параметры приложения, пример:
Код:
find "$MyDir" -type f -mtime -2 -print0 | \ xargs -0 -r mytools --param1 --param2 ... >> "$LOG_FILE"
Тут инъекция опций через имя файла в связке find | xargs mytools. Причина в том, что xargs подставляет сначала имена файлов, а затем ваши опции mytools.
Если в каталоге появится файл, начинающийся с - (например, --move=/etc или -i), mytools может воспринять его как свою опцию.
Это воздействие на приложение, через командную троку...)
Для исправления уязвимости, надо как вариант не давать именам файлов попадать в позицию перед опциями и ставить маркер конца опций.
Код:
find "$MyDir" -type f -mtime -2 -exec \
mytools \
--param1 \
--param2 \
-- {} + >> "$LOG_FILE"
Выводы, для защиты надо:
- Экранировать переменные в shell:
Код:some_tool "$file"
- Никогда не использовать eval для обработки имён.
- В веб-приложениях использовать safe API:
subprocess.run([...]) вместо os.system. - Проверять входящие имена файлов — отрезать любые |, {}, $(), ;, & и т.д.
- Включить shellcheck для аудита скриптов.
-
Код:
shellcheck script.sh
- Не давать именам файлов попадать в позицию перед опциями и ставить маркер конца опций.