Назад | Перейти на главную страницу

Как работает обновленный тест уязвимости Shellshock для CVE-2014-7169?

Я понимаю исходный тест для 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

  • Поскольку символ новой строки экранирован, bash проанализирует буфер как >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 убедить себя, что это можно использовать и опасно.