Я понимаю оригинальный тест для CVE-2014-6271, который был:
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
Но меня смущает обновленный тест и соответствующий вывод для CVE-2014-7169:
$ env X='() { (a)=>\' sh -c "echo date"; cat echo
sh: X: line 1: syntax error near unexpected token `='
sh: X: line 1: `'
sh: error importing function definition for `X'
Thu 25 Sep 2014 08:50:18 BST
Может кто-нибудь кратко объяснить, что здесь происходит и как обходит патч для CVE-2014-6271?
Ответы:
Я копался в сети с тех пор, как впервые опубликовал этот вопрос.
Согласно первоначальному обнаружителю ошибки, bash до исправления CVE-2014-6271 импортировал такую функцию, как:
заменяя знак равенства пробелом и интерпретируя его ... что означало, что интерпретация за пределами определения функции была возможна.
Патч для ССО-2014-6271 введен специальный режим функции parse_and_execute () для предельной оценки для определения функции, а не за его пределами.
Однако, как объясняется в этом потоке , специально созданная переменная среды теста уязвимости CVE-2014-7169 предназначена для 1) путаницы синтаксического анализатора до смерти 2) оставления записок в буфере 3) полного изменения действий исходной команды bash, когда он объединяется с записками уже в буфере.
Итак, рассмотрим переменную среды:
X='() { (a)=>\'
() { (a)=>\
. Обратите внимание, что\
является частью строки; это не ускользает от конечной одиночной кавычки.() {
(a)=
>\
>\[NEWLINE]
sh
запуском команды в буфер помещается новая строка.>\[NEWLINE]echo date
sh
вызывается (в данном случае это, вероятно, символическая ссылка на bash), он добавляет свои аргументы командыecho date
к уже существующим в буфере символам.>echo date
>echo date
, что имеет тот же эффект, что иdate > echo
. Файл с именемecho
создан, и стандартный выводdate
команды перенаправляется в него.; cat echo
источник
Это не дает хороший чистый вывод, но это демонстрирует ошибку.
Без ошибок переменная окружения
X
должна игнорироваться, bash должен запускатьсяecho date
, и cat должен жаловаться, что нет файла с именем echo. Например, рассмотрим, как ведет себя приборная панель:Я не буду повторять вывод, который вы показываете в своем вопросе, и я не буду притворяться, что понимаю, как он работает, но bash работает
date
и помещает вывод в файл с именем 'echo'. Вы можете поиграть с альтернативами, чтобыdate
убедить себя, что это полезно и опасно.источник