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:
foo=() {
code
}
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)=>\'
- Parser akan menganalisis
() { (a)=>\
. Perhatikan bahwa \
ini adalah bagian dari string; itu tidak lolos dari kutipan tunggal.
() {
- Parser mengidentifikasi ini sebagai definisi fungsi.
(a)=
- Ini membingungkan pengurai sampai mati.
>\
- Parser meninggalkan dua karakter terakhir di buffer.
>\[NEWLINE]
- Di beberapa titik sebelum
sh
perintah dijalankan, baris baru ditempatkan di buffer.
>\[NEWLINE]echo date
- Ketika
sh
dipanggil (yang mungkin merupakan symlink ke bash dalam kasus ini), ia menambahkan argumen perintahnya echo date
,, ke karakter yang sudah ada di buffer.
>echo date
- Karena baris baru lolos, bash akan mem-parsing buffer as
>echo date
, yang memiliki efek yang sama dengan date > echo
. File bernama echo
dibuat dan stdout dari date
perintah diarahkan ke dalamnya.
; cat echo
- Perintah kedua hanya menampilkan isi file yang baru dibuat.