Saya memahami tes asli untuk CVE-2014-6271, yaitu:
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
Tapi saya bingung dengan tes yang diperbarui dan output yang sesuai untuk 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
Bisakah seseorang menjelaskan secara singkat apa yang terjadi di sini dan bagaimana cara melewati patch untuk CVE-2014-6271?
Jawaban:
Saya telah menggali sedikit di web sejak saya pertama kali memposting pertanyaan ini.
Menurut penemu asli bug, bash sebelum patch CVE-2014-6271 mengimpor fungsi seperti:
dengan mengganti tanda sama dengan spasi dan menafsirkannya ... yang berarti menafsirkan di luar definisi fungsi itu mungkin.
The Patch untuk CVE-2014-6271 memperkenalkan modus khusus dari fungsi parse_and_execute () untuk evaluasi batas definisi fungsi, dan tidak di luar itu.
Namun, seperti yang dijelaskan dalam utas ini , variabel lingkungan yang dibuat khusus dari uji kerentanan CVE-2014-7169 dirancang untuk 1) membingungkan pengurai sampai mati 2) meninggalkan memo di buffer 3) benar-benar mengubah apa yang dilakukan perintah bash asli ketika menggabungkan dengan memo yang sudah ada di buffer.
Jadi untuk membedah variabel lingkungan:
X='() { (a)=>\'
() { (a)=>\
. Perhatikan bahwa\
ini adalah bagian dari string; itu tidak lolos dari kutipan tunggal.() {
(a)=
>\
>\[NEWLINE]
sh
perintah dijalankan, baris baru ditempatkan di buffer.>\[NEWLINE]echo date
sh
dipanggil (yang mungkin merupakan symlink ke bash dalam kasus ini), ia menambahkan argumen perintahnyaecho date
,, ke karakter yang sudah ada di buffer.>echo date
>echo date
, yang memiliki efek yang sama dengandate > echo
. File bernamaecho
dibuat dan stdout daridate
perintah diarahkan ke dalamnya.; cat echo
sumber
Itu tidak memberi Anda hasil bersih yang bagus, tetapi itu menunjukkan bug.
Tanpa bug, variabel lingkungan
X
harus diabaikan, bash harus dijalankanecho date
, dan cat harus mengeluh bahwa tidak ada file bernama echo. Misalnya perhatikan bagaimana tanda hubung berperilaku:Saya tidak akan mengulangi output yang Anda tunjukkan dalam pertanyaan Anda, dan saya tidak akan berpura-pura memahami cara kerjanya, tetapi bash sedang menjalankan
date
dan memasukkan output ke dalam file yang disebut 'echo'. Anda bisa bermain dengan alternatifdate
untuk meyakinkan diri sendiri bahwa ini bisa digunakan dan berbahaya.sumber