предотвратить внедрение скрипта при создании командной строки с входными аргументами из внешнего источника

У меня есть скрипт python, который обертывает инструмент командной строки bash, который получает свои переменные из внешнего источника (переменные среды). есть ли способ выполнить какое-то программное обеспечение для побега, чтобы предотвратить выполнение злоумышленником плохого кода в одном из этих параметров.

например, если скрипт выглядит так

/bin/sh 

/usr/bin/tool ${VAR1} ${VAR2}

а кто-то поставил VAR2 следующим образом

export VAR2=123 && \rm -rf /

поэтому он может не рассматривать VAR2 как чистый ввод и выполнять команду rm.

Есть ли способ сделать переменную неисполняемой и взять строку как есть в инструмент командной строки в качестве входных данных?


person Zohar81    schedule 09.03.2020    source источник
comment
Поскольку разделители операторов анализируются до раскрытия переменных, ваш код просто передаст && в качестве второго аргумента в tool .   -  person user1934428    schedule 09.03.2020


Ответы (1)


Правильный и безопасный способ передать значения переменных VAR1 и VAR2 в качестве аргументов для /usr/bin/tool:

/usr/bin/tool -- "$VAR1" "$VAR2"
  • Кавычки предотвращают любую специальную обработку разделителей или символов сопоставления с образцом в строках.
  • -- должен препятствовать тому, чтобы значения переменных рассматривались как параметры, если они начинаются с - символов. Возможно, вам придется сделать что-то еще, если tool плохо написано и не принимает -- для завершения параметров командной строки.
  • См. Quotes — Greg's Wiki, где содержится отличная информация о цитировании в программировании оболочки.
  • Shellcheck может обнаружить множество случаев отсутствия кавычек. Он доступен либо в виде онлайн-инструмента, либо в виде устанавливаемой программы. Всегда используйте его, если хотите устранить многие распространенные ошибки из вашего шелл-кода.
  • Фигурные скобки в строке кода в вопросе совершенно избыточны, как обычно. Некоторые ошибочно думают, что они действуют как кавычки. Чтобы понять их использование, см. Когда нам нужны фигурные скобки вокруг переменных оболочки?.
  • Я предполагаю, что /bin/sh в вопросе предназначалось для #! /bin/sh шебанга . Поскольку вопрос был помечен bash, обратите внимание, что #! /bin/sh не следует использовать с кодом, содержащим башизмы. /bin/sh может не быть Bash, и даже если это Bash, он ведет себя по-разному при вызове как /bin/sh, а не /bin/bash.
  • Обратите внимание, что даже если вы забудете кавычки, строка кода в вопросе не приведет к запуску команд (например, rm -rf /), встроенных в значения переменных, в этот момент. Опасность заключается в том, что плохо написанный код, использующий переменные, будет создавать и выполнять команды, включающие значения переменных, небезопасным образом. См. следует ли избегать bash -c, sh -c и других эквивалентов оболочек в моих сценариях оболочки? для объяснения (только) некоторые из опасностей.
person pjh    schedule 09.03.2020