Bagaimana cara uji kerentanan Shellshock yang diperbarui untuk CVE-2014-7169 berfungsi?


11

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:


13

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 shperintah dijalankan, baris baru ditempatkan di buffer.

>\[NEWLINE]echo date

  • Ketika shdipanggil (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 echodibuat dan stdout dari dateperintah diarahkan ke dalamnya.

; cat echo

  • Perintah kedua hanya menampilkan isi file yang baru dibuat.


2

Itu tidak memberi Anda hasil bersih yang bagus, tetapi itu menunjukkan bug.

Tanpa bug, variabel lingkungan Xharus diabaikan, bash harus dijalankan echo date, dan cat harus mengeluh bahwa tidak ada file bernama echo. Misalnya perhatikan bagaimana tanda hubung berperilaku:

me@myserver$ rm -f echo && env -i  X='() { (a)=>\' dash -c 'echo date'; cat echo
date
cat: echo: No such file or directory

Saya tidak akan mengulangi output yang Anda tunjukkan dalam pertanyaan Anda, dan saya tidak akan berpura-pura memahami cara kerjanya, tetapi bash sedang menjalankan datedan memasukkan output ke dalam file yang disebut 'echo'. Anda bisa bermain dengan alternatif dateuntuk meyakinkan diri sendiri bahwa ini bisa digunakan dan berbahaya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.