Cara menghentikan dan mendeteksi bom garpu

14
#include <stdlib.h>
#include <unistd.h>

int main()
{
   while(1)
      fork();
}

Ini adalah kode untuk bom fork.

Di kampus kami, kami terhubung melalui telnet yaitu protokol melayani klien. Sekitar 100 sistem terhubung ke server. Tiba-tiba kami melihat server menjadi lambat, dan setelah beberapa waktu crash. Saya jadi tahu bahwa sombody menerapkan bom fork.

Bagaimana kita bisa mendeteksi pada sistem mana bom garpu diterapkan? Dan bagaimana kita bisa menghentikannya?

Salah satu metode adalah membatasi jumlah proses maksimum yang dimiliki oleh satu pengguna. Apakah ada metode untuk menghentikannya dan untuk mengetahui dari sistem mana ia telah diterapkan?

Rajesh M.
sumber
19
Telnet? Serius? Anda harus benar-benar menggunakan SSH ...
ThiefMaster
baik itu dimigrasikan dari SO tetapi satu jawaban bisa di level kernel. beberapa tambalan telah dilakukan untuk sementara tetapi tampaknya tidak ada yang memenuhi penerimaan. Maksud saya adalah: bagaimana cara mendeteksinya: yah setiap orang akan tahu itu tidak bisa menggunakan sistem lagi, jadi titik deteksi mungkin bukan titik kunci. Bagaimana cara memulihkan? Jawaban saat ini adalah reboot, saya akan menyatakan: cara untuk memberitahu kernel untuk menjalankan hanya satu proses (yang Anda ingin membersihkan kekacauan) dan menghentikan semua yang lain di mana pun mereka berada. Ini bisa menjadi fitur yang hanya dapat diakses di konsol sistem.
philippe lhardy

Jawaban:

16

Salah satu caranya adalah membatasi jumlah proses, yang bisa dijalankan pengguna.

Cukup login sebagai root, dan edit file ini, untuk menambah pengguna dan mengonfigurasi, batasnya.

# vi /etc/security/limits.conf

Tambahkan baris ini ke file

john hard nproc 10

Sekarang pengguna john hanya dapat membuat 10 proses.

Barath Bushan
sumber
Saya pikir Anda harus mem-boot ulang agar pengaturan baru /etc/security/limits.confberlaku.
Dan D.
2
Tidak. Tapi mereka diterapkan oleh PAM sehingga mereka hanya berlaku untuk login baru.
ThiefMaster
14

Untuk menghentikan bom fork yang sedang berjalan, Anda mungkin dapat menggunakannya killall <name> untuk membunuh semua proses bom. Namun, karena bom fork biasanya menghasilkan beban yang sangat tinggi pada sistem Anda mungkin tidak dapat SSH ke dalamnya atau menjalankannya. Jadi reboot mungkin diperlukan atau setidaknya lebih cepat.

Jika setiap pengguna memiliki akun sendiri di sistem, Anda cukup memeriksa direktori home semua orang dan mencari yang dapat dieksekusi. Peluangnya bagus, dia juga mengunggah kode sumber, jadi tidak terlalu sulit. Jika itu akun bersama untuk semua siswa, Anda kurang beruntung. Terutama setelah sesi telnet atau ssh dari pengguna diakhiri, Anda tidak memiliki kesempatan untuk mencari tahu siapa yang memulainya.

Namun, alih-alih menghukum pengguna yang meledakkan bom fork Anda lebih baik memperbaiki konfigurasi sistem untuk melucuti bom fork. Anda dapat menetapkan batas proses per-pengguna dengan menggunakan /etc/security/limits.confdan dengan demikian mencegah bom fork keluar dari kendali - dengan misalnya hanya 50 proses bom fork tidak akan menghasilkan banyak kerusakan.

Pencuri
sumber
tidak mungkin untuk mendeteksi dari sistem mana yang akan datang?
Rajesh M
@ user1670364: Tidak jelas apa yang Anda minta. Apa yang Anda maksud dengan "kedatangannya"? Anda dapat memberi tahu pengguna apa yang memiliki proses, apa lagi yang ingin Anda ketahui?
David Schwartz
@ Davidvidchwartz maksud saya mungkin untuk mendeteksi bom garpu di mana sistemnya sedang diterapkan?
Rajesh M
@ user1670364: Jika Anda maksudkan sistem yang benar-benar menjalankan bom fork, itu yang lambat. Jika yang Anda maksud adalah pengguna yang bertanggung jawab, itu adalah pengguna yang memiliki proses yang forking.
David Schwartz