Объяснение команды для проверки shellshock

Вот команда, которую я использовал для проверки моей оболочки bash для ошибки Shellshock:

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

Может кто-нибудь объяснить эту команду в деталях?

1
задан 29 September 2014 в 14:40

1 ответ

В непроверенной версии bash он сохраняет экспортированные определения функций в качестве переменных среды.

Сохраните функцию x as,

$ x() { bar; }
$ export -f x

И проверьте ее определение как

$ env | grep -A1 x
x=() {  bar
}

. Таким образом, можно использовать это, определяя его собственные переменные среды и интерпретирует их как определения функций. Например, env x='() { :;}' будет рассматриваться как

x() { :;
}

Что делает команда для проверки shellshock do,

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, которая выглядит так, как будто она удовлетворяет ограничениям, которые она знает о том, как выглядит определение функции, и оценивает строку, непреднамеренно также выполняет эхо (которое может быть любой командой, злонамеренной или нет) , Также см. Это
2
ответ дан 24 May 2018 в 03:20
  • 1
    Я все еще обнаружил, что любая определенная функция bash, если экспортируется, оценивается в дочерней оболочке в исправленной версии bash. См. Так: chayan @ chayan: ~ / testr $ test () {echo " anything & quot ;; }; export -f test; bash -c test Ouput: ничего, поэтому ваш ответ несколько неправильно настроен. По-моему, объяснение kasiyA ошибки, как расширение переменной за пределами ее определения, является правильным. – heemayl 28 September 2014 в 12:02
  • 2
    @heemayl это поведение является естественным. Но если вы попробуете env test='() { echo "anything"; }' bash -c "echo otherthing", вы увидите на выходе otherthing. Это исправлено в патче. не стесняйтесь, если я еще не понял. – souravc 28 September 2014 в 12:28
  • 3
    Пожалуйста, дайте мне понять еще раз. В вашем последнем комментарии мы в основном определяем функцию, а затем говорим bash, чтобы выполнить эхо. В этом примере мы не вызывали функцию в bash. Разве это не будет иметь такой же выход в обоих исправленных и не исправленных bash? У меня есть мнение, что ошибка была в основном в том, что bash выполнял команды, размещенные после определения функции, тогда как функция никогда не вызывалась где-нибудь позже, например, если мы делаем это env test = '() {echo " anything & quot ;; }; echo " foo " bash -c "echo otherthing". Просьба разъяснить мне в этом контексте. – heemayl 28 September 2014 в 13:00
  • 4
    @heemayl Я отредактировал свой ответ, надеюсь, теперь ясно. Вы верны в примере в моем последнем комментарии, который мы не вызывали. Но разница в том, что в unpatched bash вы можете вызвать функцию, как она определена, но в исправленном bash само определение не существует. – souravc 28 September 2014 в 17:03
  • 5
    Да. Теперь я понимаю. Спасибо друг. – heemayl 28 September 2014 в 21:31

Другие вопросы по тегам:

Похожие вопросы: