Як працює оновлений тест вразливості Shellshock для CVE-2014-7169?


11

Я розумію оригінальний тест для 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?


Відповіді:


13

Я трохи копав веб-сайти, коли я вперше опублікував це питання.

Згідно з оригінальним відкривачем помилки, bash перед патчем CVE-2014-6271 імпортував таку функцію, як:

foo=() {
  code
}

замінивши знак рівності пробілом та інтерпретуючи його ... що означало, що інтерпретація за межами визначення функції була можливою.

Патч для ССО-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створюється, а stdout dateкоманди перенаправляється в нього.

; cat echo

  • Друга команда просто відображає вміст новоствореного файлу.


2

Це не дає хорошого чистого виходу, але він демонструє помилку.

Без помилок змінну середовища 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переконати себе, що це корисно і небезпечно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.