Недавняя уязвимость CVE-2014-6271 в том, как Bash интерпретирует переменные среды . Эксплоит полагается на Bash, анализируя некоторые объявления переменных среды как определения функций, но затем продолжая выполнение кода, следующего за определением:
$ x='() { echo i do nothing; }; echo vulnerable' bash -c ':'
vulnerable
Но я не понимаю. Я ничего не смог найти в руководстве Bash о интерпретации переменных среды как функций вообще (кроме наследования функций, которые различны). Действительно, правильное определение имени функции просто рассматривается как значение:
$ x='y() { :; }' bash -c 'echo $x'
y() { :; }
Но коррумпированный ничего не печатает:
$ x='() { :; }' bash -c 'echo $x'
$ # Nothing but newline
Коррумпированная функция не называется, и поэтому я не могу просто назвать ее. Является ли эта уязвимость чистой ошибкой реализации, или здесь есть намеченная функция, которую я просто не вижу?
Update
В сообщении Barmar, я предположил, что имя функции было именем параметра:
$ n='() { echo wat; }' bash -c 'n'
wat
Кого я мог бы поклясться, что раньше я пытался, но я думаю, что я не очень старался. Теперь это повторяемо. Здесь немного больше тестов:
$ env n='() { echo wat; }; echo vuln' bash -c 'n'
vuln
wat
$ env n='() { echo wat; }; echo $1' bash -c 'n 2' 3 -- 4
wat
... поэтому очевидно, что аргументы не заданы во время выполнения эксплойта.
В любом случае, основной ответ на мой вопрос: да, вот как Bash реализует унаследованные функции.