Я трохи копав веб-сайти, коли я вперше опублікував це питання.
Згідно з оригінальним відкривачем помилки, 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
- Друга команда просто відображає вміст новоствореного файлу.