Как работает обновленный тест уязвимости 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?

11 голосов | спросил billyw 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 25 Sep 2014 21:42:33 +0400 2014, 21:42:33

2 ответа


13

Я немного искал веб-страницы, так как я впервые разместил этот вопрос.

Согласно оригинальному первооткрывателю об ошибке, bash до патча CVE-2014-6271 импортировал функцию например:

foo=() {
  code
}

, заменив знак равенства пробелом и интерпретируя его ... что означало интерпретацию вне определения функции.

патч для CVE- 2014-6271 представил специальный режим функции parse_and_execute () , чтобы ограничить оценку определение функции, а не за ее пределами.

Однако, как объяснено в этом потоке , специально созданная переменная среды для CVE-2014-7169 тест уязвимости предназначен для: 1) путать синтаксический анализатор со смертью; 2) оставить записки в буфере 3) полностью изменить то, что делает исходная команда bash, когда она сочетается с записками, уже находящимися в буфере.

Итак, чтобы рассеять переменную окружения:

X='() { (a)=>\'

  • Анализатор проанализирует () { (a)=>\. Обратите внимание, что \ является частью строки; это not , выходящий за конечную одинарную цитату.

() {

  • Анализатор идентифицирует это как определение функции.

(a)=

  • Это смущает парсер до смерти.

>\

  • Парсер оставляет последние два символа, сидящие в буфере.

>\[NEWLINE]

  • В какой-то момент перед запуском команды sh в буфере помещается новая строка.

>\[NEWLINE]echo date

  • Когда вызывается sh (который, вероятно, является символической ссылкой на bash в этом случае), он добавляет свои аргументы команды, echo date, к символам, уже существующим в буфере.

>echo date

  • Поскольку строка новой строки экранирована, bash будет анализировать буфер как >echo date, который имеет тот же эффект, что и date > echo. Создается файл с именем echo, а stdout из date перенаправляется в нее.

; cat echo

  • Вторая команда просто отображает содержимое вновь созданного файла.

ответил billyw 26 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 26 Sep 2014 03:04:12 +0400 2014, 03:04:12
2

Это не дает вам хороший чистый результат, но он демонстрирует ошибку.

Без ошибки переменная среды X должна игнорироваться, bash должен запускаться echo date, а cat должен жаловаться, что нет файла с именем echo. Например, рассмотрите, как работает тире:

[email protected]$ 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, чтобы убедить себя, что это полезно и опасно.

ответил mc0e 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 25 Sep 2014 23:13:30 +0400 2014, 23:13:30

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132