Я понимаю исходный тест для 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 импортировал такую функцию, как:
foo=() {
code
}
путем замены знака равенства пробелом и его интерпретации ... что означало, что интерпретация за пределами определения функции была возможна.
В патч для CVE-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
, и кот должен пожаловаться, что нет файла с именем echo. Например, рассмотрим, как ведет себя тире:
me@myserver$ rm -f echo && env -i X='() { (a)=>\' dash -c 'echo date'; cat echo
date
cat: echo: No such file or directory
Я не буду повторять вывод, который вы показываете в своем вопросе, и не буду делать вид, что понимаю, как он работает, но bash работает date
и помещаем результат в файл с именем «echo». Вы можете играть с альтернативами date
убедить себя, что это можно использовать и опасно.