1756325552399.png


Вот кто хоть раз интересовался безопасностью, наверное помнят всякие инъекции в 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
  • Не давать именам файлов попадать в позицию перед опциями и ставить маркер конца опций.