GNU/Linux >> Belajar Linux >  >> Linux

Apa Env X=() { :;}; Command' Bash Do Dan Mengapa Tidak Aman?

Tampaknya ada kerentanan (CVE-2014-6271) di bash:Bash serangan injeksi kode variabel lingkungan yang dibuat khusus

Saya mencoba mencari tahu apa yang terjadi, tetapi saya tidak sepenuhnya yakin saya memahaminya. Bagaimana echo dieksekusi seperti dalam tanda kutip tunggal?

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
vulnerable
this is a test

EDIT 1 :Sistem yang ditambal terlihat seperti ini:

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test

EDIT 2 :Ada kerentanan / patch terkait:CVE-2014-7169 yang menggunakan tes yang sedikit berbeda:

$ env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"

keluaran yang belum ditambal :

vulnerable
bash: BASH_FUNC_x(): line 0: syntax error near unexpected token `)'
bash: BASH_FUNC_x(): line 0: `BASH_FUNC_x() () { :;}; echo vulnerable'
bash: error importing function definition for `BASH_FUNC_x'
test

keluaran yang ditambal sebagian (versi awal) :

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
bash: error importing function definition for `BASH_FUNC_x()'
test

keluaran yang ditambal hingga dan termasuk CVE-2014-7169:

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `BASH_FUNC_x'
test

EDIT 3 :cerita berlanjut dengan:

  • CVE-2014-7186
  • CVE-2014-7187
  • CVE-2014-6277

Jawaban yang Diterima:

bash menyimpan definisi fungsi yang diekspor sebagai variabel lingkungan. Fungsi yang diekspor terlihat seperti ini:

$ foo() { bar; }
$ export -f foo
$ env | grep -A1 foo
foo=() {  bar
}

Yaitu, variabel lingkungan foo memiliki isi literal:

() {  bar
}

Ketika sebuah instance baru dari bash diluncurkan, ia mencari variabel lingkungan yang dibuat khusus ini, dan menafsirkannya sebagai definisi fungsi. Anda bahkan dapat menulisnya sendiri, dan melihat bahwa itu masih berfungsi:

$ export foo='() { echo "Inside function"; }'
$ bash -c 'foo'
Inside function

Sayangnya, penguraian definisi fungsi dari string (variabel lingkungan) dapat memiliki efek yang lebih luas daripada yang dimaksudkan. Dalam versi yang tidak ditambal, itu juga menafsirkan perintah arbitrer yang terjadi setelah penghentian definisi fungsi. Ini karena kendala yang tidak mencukupi dalam penentuan string seperti fungsi yang dapat diterima di lingkungan. Misalnya:

$ export foo='() { echo "Inside function" ; }; echo "Executed echo"'
$ bash -c 'foo'
Executed echo
Inside function

Perhatikan bahwa gema di luar definisi fungsi telah dieksekusi secara tidak terduga selama startup bash. Definisi fungsi hanyalah langkah untuk mendapatkan evaluasi dan eksploitasi terjadi, definisi fungsi itu sendiri dan variabel lingkungan yang digunakan bersifat arbitrer. Shell melihat variabel lingkungan, melihat foo , yang sepertinya memenuhi batasan yang diketahuinya tentang seperti apa definisi fungsi, dan mengevaluasi baris, secara tidak sengaja juga mengeksekusi gema (yang bisa berupa perintah apa pun, berbahaya atau tidak).

Terkait:Dd:beberapa file input?

Ini dianggap tidak aman karena variabel biasanya tidak diizinkan atau diharapkan, dengan sendirinya, secara langsung menyebabkan pemanggilan kode arbitrer yang terkandung di dalamnya. Mungkin program Anda menetapkan variabel lingkungan dari input pengguna yang tidak dipercaya. Akan sangat tidak terduga bahwa variabel lingkungan tersebut dapat dimanipulasi sedemikian rupa sehingga pengguna dapat menjalankan perintah arbitrer tanpa maksud eksplisit Anda untuk melakukannya menggunakan variabel lingkungan tersebut untuk alasan yang dinyatakan dalam kode.

Berikut adalah contoh serangan yang layak. Anda menjalankan server web yang menjalankan shell yang rentan, di suatu tempat, sebagai bagian dari masa pakainya. Server web ini meneruskan variabel lingkungan ke skrip bash, misalnya, jika Anda menggunakan CGI, informasi tentang permintaan HTTP sering disertakan sebagai variabel lingkungan dari server web. Misalnya, HTTP_USER_AGENT mungkin disetel ke konten agen pengguna Anda. Ini berarti bahwa jika Anda menipu agen pengguna Anda menjadi sesuatu seperti '() { :; }; echo foo', ketika skrip shell itu berjalan, echo foo akan dieksekusi. Sekali lagi, echo foo bisa apa saja, jahat atau tidak.


Linux
  1. Apa itu Server Web, dan Bagaimana Cara Kerja Server Web?

  2. Di Bash, Kapan Alias ​​​​Kapan Skrip, Dan Kapan Menulis Fungsi?

  3. Apa yang Dilakukan 'exec {fd}/watchdog' Di Bash?

  1. Apa Arti -s Dan [[]] Dalam Kondisi If Di Bash?

  2. Mengapa Deis dan apa itu?

  3. Apa perbedaan antara #!/usr/bin/env bash dan #!/usr/bin/bash?

  1. Mengapa eval harus dihindari di Bash, dan apa yang harus saya gunakan?

  2. apa yang dilakukan fungsi weak_alias dan di mana itu didefinisikan

  3. Manipulasi fungsi Bash dijelaskan