Вот команда, которую я использовал для проверки моей оболочки bash для ошибки Shellshock:
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
Может кто-нибудь объяснить эту команду в деталях?
В непроверенной версии bash он сохраняет экспортированные определения функций в качестве переменных среды.
Сохраните функцию x as,
$ x() { bar; }
$ export -f x
И проверьте ее определение как
$ env | grep -A1 x
x=() { bar
}
. Таким образом, можно использовать это, определяя его собственные переменные среды и интерпретирует их как определения функций. Например, env x='() { :;}' будет рассматриваться как
x() { :;
}
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
Из man env,
env - запустить программу в измененной среде. : ничего не делает, кроме выходов с статусом выхода 0. подробнее. Когда новый экземпляр неуправляемого bash запущен как bash -c "echo this is a test", обработанная переменная окружения рассматривается как функция и загружается. Соответственно, получается выход vulnerable this is a test Примечание: эхо вне определения функции было неожиданно выполнено во время запуска bash. Определение функции - это всего лишь шаг, чтобы получить оценку и использование, само определение функции и используемая переменная среды произвольны. Оболочка рассматривает переменные среды, видит x, которая выглядит так, как будто она удовлетворяет ограничениям, которые она знает о том, как выглядит определение функции, и оценивает строку, непреднамеренно также выполняет эхо (которое может быть любой командой, злонамеренной или нет) , Также см. Это