Bagaimana cara kerja bom fork?

22
  • PERINGATAN JANGAN MENJALANKAN INI PADA MESIN PRODUKSI

Saat membaca halaman Wikipedia tentang topik ini, saya biasanya mengikuti apa yang terjadi dengan kode berikut:

:(){ :|:& };:

kutipan deskripsi

Bom fork berikut disajikan sebagai karya seni pada tahun 2002;56 asal pastinya tidak diketahui, tetapi ada di Usenet sebelum tahun 2002. Bom dieksekusi dengan menempelkan 13 karakter berikut ke dalam shell UNIX seperti bash atau zsh . Ini beroperasi dengan mendefinisikan fungsi yang disebut ':', yang menyebut dirinya dua kali, sekali di latar depan dan sekali di latar belakang.

Namun bit terakhir tidak sepenuhnya jelas bagi saya. Saya melihat definisi fungsi:

:(){ ... }

Tapi apa lagi yang terjadi? Juga melakukan kerang lainnya seperti ksh, csh, dan tcshjuga mengalami nasib yang sama untuk dapat membangun sesuatu yang mirip?

slm
sumber
2
Yang ini cukup sering muncul di pertukaran stack, jawaban yang bagus ada di sini: stackoverflow.com/questions/991142/…
Drav Sloan
@ DravSloan - Saya mencoba membuat beberapa konten itu di sini, pertanyaan saya sedikit dimuat dengan cara seperti itu 8-).
slm
Anda mungkin ingin menambahkan kewajiban "Karena Cinta Tuhan jangan menjalankan ini pada mesin produksi, atau jika Anda ingin terus menggunakan mesin Anda menjalankannya !!" pesan :)
Drav Sloan
1
@ MartinSchröder - Anda mengerti bahwa pertanyaan ini adalah apa yang menyebabkan pertanyaan itu ditanyakan? 8-). Saya menanyakan hal ini pada malam Jumat untuk menyelesaikan sesuatu dan kemudian pertanyaan lainnya muncul satu atau dua jam setelahnya.
slm
1
@ MartinSchröder - mungkin lebih baik membiarkannya terpisah, mereka sedikit berbeda. Ini meminta seluruh pandangan terperinci tentang bagaimana bom fork bekerja, yang lain meminta secara spesifik tentang mekanisme di balik bagaimana sistem forking dalam bom fork. Saya tahu itu mungkin membingungkan b / c mereka terkait tetapi mereka berbeda (IMO - jelas). Saya bahkan menjawab Q lainnya dan mencoba menunjukkan mekanisme di bawah kap yang mendorong percabangan, dan saya tidak menandainya sebagai dup.
slm

Jawaban:

23

Bom fork ini selalu mengingatkan saya pada sesuatu yang dikatakan oleh seorang guru pemrograman AI pada salah satu pelajaran pertama yang saya hadiri "Untuk memahami rekursi, pertama-tama Anda harus memahami rekursi".

Pada intinya, bom ini adalah fungsi rekursif . Intinya, Anda membuat fungsi, yang memanggil dirinya sendiri, yang memanggil dirinya sendiri, yang memanggil dirinya sendiri ... sampai sumber daya sistem dikonsumsi. Dalam contoh khusus ini, rekursi diperkuat dengan menggunakan fungsi perpipaan untuk dirinya sendiri DAN melatarbelakanginya.

Saya telah melihat ini dijawab di StackOverflow , dan saya pikir contoh yang diberikan di sana menggambarkan yang terbaik, hanya karena lebih mudah untuk melihat apa yang dilakukan sekilas (dicuri dari tautan di atas ...)

☃(){ ☃|☃& };☃

Tentukan fungsi bug ☃() { ... }, tubuh yang memanggil dirinya sendiri (fungsi bug), memipakan output ke dirinya sendiri (fungsi bug) ☃|☃, dan latar belakang hasilnya &. Kemudian, setelah fungsi didefinisikan, sebenarnya memanggil fungsi bug ; ☃,.

Saya perhatikan bahwa setidaknya pada Arch VM saya, kebutuhan untuk melatarbelakangi proses bukanlah keharusan untuk memiliki hasil akhir yang sama, untuk menggunakan semua ruang proses yang tersedia dan membuat host menjadi b0rked. Sebenarnya sekarang saya sudah mengatakan bahwa kadang-kadang tampaknya menghentikan proses lari dan setelah layar -bash: fork: Resource temporarily unavailableitu akan berhenti dengan Terminated(dan journalctlmenunjukkan bash core dumping).

Untuk menjawab pertanyaan Anda tentang csh / tcsh, tidak satu pun dari fungsi kerang yang mendukung, Anda hanya bisa alias. Jadi untuk kerang itu Anda harus menulis skrip shell yang menyebut dirinya secara rekursif.

zsh tampaknya mengalami nasib yang sama (dengan kode yang sama), tidak membuang inti dan menyebabkan Arch untuk memberikan Out of memory: Kill process 216 (zsh) score 0 or sacrifice child., tetapi masih terus bercabang. Setelah beberapa saat kemudian menyatakan Killed process 162 (systemd-logind) ...(dan masih terus memiliki zsh forking).

Arch sepertinya tidak memiliki pacmanversi ksh, jadi saya harus mencobanya di debian. ksh objek :sebagai nama fungsi, tetapi menggunakan sesuatu - katakan b()saja tampaknya memiliki hasil yang diinginkan.

Drav Sloan
sumber
Apa itu karakter? Saya tahu itu bug tetapi bagaimana Anda membuatnya?
slm
10
Sementara pada ukuran font kecil itu memang terlihat seperti bug Anda akan menemukan bahwa itu sebenarnya manusia salju. Itu akan menjadi karakter unicode U + 2603 yang dapat ditampilkan dalam html dengan memasukkan & # x 2603 tanpa spasi.
sambler
2
Rupanya di Linux ada cukup banyak aplikasi terkait Gnome dan Firefox mendukung di Ctrl+Shift+u+<hex>mana hex adalah kode hex dari karakter unicode yang ingin Anda tampilkan. Daftar unicode yang dapat dilihat dapat ditemukan di: fileformat.info/info/unicode/utf8test.htm (sebagian besar yang aneh ada di bagian "lain-lain"). Windows harus checkout superuser.com/questions/47420/… , dan saya pribadi menggunakan alat yang disebutkan dalam tautan unicodeinput.exeatau memotong dan menempelkan melalui browser saya. Anda selalu dapat menggunakan urutan html seperti yang disarankan oleh sambler.
Drav Sloan
1
Wiki juga memiliki daftar karakter unicode: en.wikipedia.org/wiki/List_of_Unicode_characters
Drav Sloan
Saya menyukai bug salju, yang Anda gunakan di sini tidak ditampilkan pada sistem saya, 🐛 muncul seperti kotak dengan angka hex di dalamnya.
terdon