Akankah secara global alias bom garpu mencegah eksekusi?

15

Jika Anda ingin mengatur secara global

alias ':(){ :|:& };:'='echo fork bomb averted'

apakah itu strategi keamanan yang efektif untuk menghindari eksekusi bom garpu Bash atau apakah masih ada cara untuk mengeksekusinya?

Saya kira pertanyaan itu menguap ke: apakah ada cara untuk mengeksekusi perintah ketika itu dialihkan ke sesuatu yang lain?

malan
sumber
1
@ user1717828, "bom fork" adalah program yang hanya menjalankan salinan baru sendiri, selamanya. Pertumbuhan eksponensial yang dihasilkan dalam jumlah program yang berjalan biasanya menyebabkan sesuatu rusak dalam waktu singkat.
Markus
1
Bahkan jika ini berhasil - itu tidak akan melindungi terhadap program yang memanggil fork () tidak melalui bash?
UKMonkey
2
: () {: |: &: |: &} ;:
Joshua
3
Jalankan sajaa(){ a|a& };a
user253751
1
Anda akan menghindari bentuk umum (jika Anda membuatnya berfungsi sama sekali), tetapi ada kemungkinan variasi dalam jumlah tak terbatas.
Tiang

Jawaban:

52

The dua , tidak, tiga , ... Di antara hambatan utama untuk yang:

  1. Itu bukan nama yang valid untuk alias. Manual online Bash :

    Karakter ... dan salah satu dari karakter meta shell atau mengutip karakter yang tercantum di atas mungkin tidak muncul dalam nama alias.

    (, ), &, |Dan spasi keluar di Bash 4.4.

  2. String khusus itu bukan satu-satunya cara untuk menulis bom garpu di shell, hanya terkenal karena terlihat tidak jelas. Misalnya, tidak perlu memanggil fungsi :alih-alih sesuatu yang sebenarnya terdiri dari huruf.

  3. Jika Anda dapat mengatur alias, pengguna dapat menghapus alias, mengelaknya dengan keluar dari nama alias di baris perintah, atau menonaktifkan alias sama sekali, mungkin dengan menjalankan fungsi dalam skrip (Bash tidak memperluas alias dalam shell yang tidak aktif) .

  4. Sekalipun shell dibatasi cukup untuk menghentikan semua versi bom fork, sistem tujuan umum akan memiliki utilitas lain yang dapat diprogram yang dapat mengembalikan dan memotong subproses. Punya Perl atau kompiler C? Cukup mudah. Bahkan awk mungkin bisa melakukannya. Bahkan jika Anda belum menginstalnya, Anda juga harus menghentikan pengguna dari memasukkan binari terkompilasi dari luar sistem, atau menjalankan /bin/shyang mungkin perlu menjadi shell operasional penuh agar seluruh sistem berfungsi.

Cukup gunakan ulimit -u(yaitu RLIMIT_NPROC) atau setara untuk membatasi jumlah proses yang dapat dimulai pengguna. Pada sebagian besar sistem Linux ada pam_limitsyang dapat mengatur batas hitungan proses sebelum perintah yang dipilih oleh pengguna dimulai.

Sesuatu seperti ini /etc/security/limits.confakan membatasi 50 proses untuk semua pengguna:

*        hard    nproc           50

(Stephen Kitt sudah menyebutkan poin 1, Jeff Schaller menyebutkan 2 dan 3.)

ilkkachu
sumber
Apakah mungkin untuk menulis bom garpu tanpa &?
Stephen Kitt
4
@StephenKitt Saya tidak yakin 100% tetapi dugaan saya adalah bahwa bash sedang selesai. Jika demikian, ada kemungkinan yang tak terbatas. Sebagai contoh, Anda dapat menguraikan kode-ascii char-code 38 dan menjalankannya.
Marie
@Marie dalam konteks khusus ini Anda juga harus menghindari karakter terlarang lainnya saat mengerjakan &batasan.
Stephen Kitt
15
Maksud saya terutama bahwa mencoba fungsi hitam daftar hitam adalah ide yang buruk. Hampir selalu ada jalan keluar.
Marie
2
@Marie: Bash pasti Turing lengkap.
Dijeda sampai pemberitahuan lebih lanjut.
18

Tidak. Terlalu banyak cara untuk menulis bom fork.

Penulis fork-bomb jahat hanya akan mencoba lagi dengan nama fungsi yang berbeda. Atau perubahan lain sampai bom fork-nya berhasil.

Penulis fork-bom yang tidak disengaja tidak akan menghasilkan fork-bom kanonik.

Sebenarnya agak mudah untuk menjadi penulis fork-bom yang tidak sengaja sendiri. Misalnya, Anda bisa menggunakan rekursif makedengan eksternal, tidak dicentang cd, menggabungkannya dengan-j opsi dan subdirektori yang tidak ada - contoh nyata yang saya temui satu kali.

Anda tidak dapat melindungi terhadap semua kemungkinan, dan tentu saja tidak terhadap penyerang yang gigih. Yang akan Anda capai adalah meningkatkan kompleksitas sistem Anda.

cmaster - mengembalikan monica
sumber
14

Anda tidak dapat alias bom fork, karena itu bukan nama alias yang valid :

$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name

Karakter '/', '$', '`', '=' dan salah satu dari metakarakter shell atau mengutip karakter yang tercantum di atas mungkin tidak muncul dalam nama alias.

Beberapa shell tidak memeriksa nama alias saat dideklarasikan, tetapi ketika menafsirkan perintah, dan melewatkan nama yang tidak valid itu. Bom fork akan selalu termasuk &, yang tidak bisa dimasukkan dalam nama alias yang valid, jadi melindungi diri dengan cara ini tidak mungkin.

Stephen Kitt
sumber
Apakah shell mengizinkan untuk mengatur alias ini atau tidak tidak masalah. Penting adalah bahwa bahkan jika alias tersebut ada, itu tidak diperluas saat menafsirkan perintah karena nama alias tidak cocok dengan pola yang diizinkan. dashdan boshmisalnya keduanya diam-diam mengabaikannya.
schily
10

Dua kali, tidak.

Itu bukan satu-satunya cara untuk menulis bom fork.

Ada juga beberapa cara untuk mengeksekusi "perintah" ketika ada alias:

command the-command
\the-command

Contoh:

$ alias ls=not-really-ls
$ ls
-bash: not-really-ls: command not found
$ \ls
jeff.html  output.png
$ command ls
jeff.html  output.png
Jeff Schaller
sumber
Tidak terkait dengan topik utama tetapi mengapa \lstampil output.pngtetapi command lstidak?
nxnev
Terlihat bagus! Itu, memang, tidak terkait dengan topik utama. Ini adalah kesalahan PEBCAK klasik di mana saya menyalin / salah menempel (atau membersihkan output.png di antaranya). Saya akan memperbaikinya untuk meminimalkan gangguan. Terima kasih, @nxnev!
Jeff Schaller