Apakah linux memiliki langkah-langkah untuk melindungi terhadap bom fork?

12
#include <unistd.h>
int main(int argc, char* argv[]) {
  while(1)
  {
    fork();
  } 
}

Saya menjalankan program ini di linux saya, tidak ada output di terminal, OS sepertinya mati. Apakah linux memiliki ukuran perlindungan untuk program semacam itu yang dapat kehabisan memori?


sumber
2
Saya menduga dampaknya akan jauh lebih sedikit jika Anda tidak mengikuti saran buruk yang diberikan banyak distro untuk membuat partisi swap besar ...
R .. GitHub BERHENTI MEMBANTU ICE
1
Apakah "tidak membuat proses baru setelah mencapai 65k" dianggap sebagai tindakan balasan? ;)
Bobby

Jawaban:

18

Ini dikenal sebagai bom fork .

Apakah linux memiliki ukuran perlindungan untuk program semacam itu yang dapat kehabisan memori?

Tidak juga. Setiap garpu menghasilkan proses baru, dengan ruang alamat virtual dan penggunaan memori sendiri. Jadi setiap salinan relatif kecil. Akhirnya, Anda akan menggunakan semua memori fisik + swap pada sistem, dan pembunuh yang kehabisan memori (OOM) akan mulai membunuh proses individu. Tetapi bom fork masih akan menciptakan proses secepat (jika tidak lebih cepat).

Salah satu cara untuk mencegah hal ini terjadi di tempat pertama adalah membatasi jumlah proses pengguna, menggunakan ulimit -u(dengan asumsi Anda menggunakan Bash; shell lain akan memiliki setara).

Oliver Charlesworth
sumber
2
Satu hal yang perlu diperhatikan ulimitadalah khusus untuk bash; kerang lain kemungkinan memiliki perintah bawaan yang sama, tetapi mungkin dengan nama yang berbeda.
Jay
@ Jay: Titik adil. Saya telah mencatat bahwa dalam jawabannya sekarang, terima kasih!
Oliver Charlesworth
1
membatasi memori / deskriptor file per pengguna harus cukup. Membatasi memori per pengguna selalu merupakan ide bagus. Ketika sebuah proses terbunuh (oom), pengawas harus mengirimkan pemberitahuan sehingga BOFH dapat mem-boot pengguna 'jahat' dengan semua proses yang dimiliki dari sistem
Saya yakin Anda juga dapat menetapkan beberapa batasan melalui parameter login
p_l
10

Ya, meskipun mungkin tidak diaktifkan secara default di sistem Anda. The setrlimitsystem call mendefinisikan batas sistem - termasuk jumlah proses per pengguna.

Mari kita lihat terlebih dahulu di kernel API (karena Anda menyebutkan "linux"): Anda dapat menggunakan halaman manual untuk setrlimit, yang akan memberitahu Anda untuk melakukan sesuatu seperti

#include <sys/resource.h>
...

struct rlimit  r;

rnew.r_cur = 40;
rnew.r_max = 50;
setrlimit(RLIMIT_NPROC,&r);

Ini akan mengatur proses maksimum per pengguna ( RLIMIT_NPROC) menjadi 40 (batas lunak) dan 50 (batas keras).

Sekarang, dari shell, jika Anda menggunakan bash, Anda dapat menggunakan ulimitperintah bawaan:

ulimit -u
29089

Anda dapat menetapkan batas dengan meneruskannya sebagai argumen:

ulimit -u 100

ulimit --help akan menunjukkan kepada Anda bahwa ada beberapa batasan lain yang dapat Anda tetapkan (satu yang mungkin menarik adalah jumlah maksimum deskriptor file yang digunakan oleh pengguna).

Jay
sumber
7

Itu tergantung jika Anda ingin menggunakannya pada tingkat pengguna atau tingkat sistem. Pada level pengguna, ulimit(atau perintah yang sesuai untuk shell lain) akan menjadi solusi termudah.

Namun pada tingkat sistem ada mekanisme untuk mencegah pengguna jahat (atau tidak menggunakan ulimit) menghentikan sistem. Mekanisme Linux cgroups dapat membatasi sumber daya berdasarkan per-kelompok. Anda dapat memaksa (berdasarkan pam_systemdmachanism) sesi pengguna berada dalam kelompok tertentu. Ini memiliki manfaat lain untuk, misalnya, penjadwal CPU.

Maciej Piechotka
sumber
1
+1: cgroup benar-benar baru, dan kebanyakan orang belum tahu banyak tentang mereka. Di mana kita bisa belajar lebih banyak?
Ken Bloom
1
@ KenBloom: 1. dengan menjelajahi /sys/fs/cgroup/2. dengan mencari di google 3. dengan menelusuri melalui make menuconfig4. Dengan melihat ke /usr/src/linux/Documentation/cgroups5. Dengan membaca dokumentasi systemd. Maaf saya tidak bisa membantu lebih tetapi saya hanya menggunakan sumber daya itu. Saya menggunakan cgroups di desktop untuk mengontrol sumber daya.
Maciej Piechotka
6

Gunakan ulimit -udari bash shell untuk menetapkan batas pada "proses pengguna maks".

Dari shell C, Anda menggunakan limitperintah.

Jika Anda memerlukan panggilan sistem untuk melakukan ini, gunakan setrlimitpanggilan untuk mengatur RLIMIT_NPROC.

Ken Bloom
sumber