Linux'un çatal bombalara karşı koruma önlemleri var mı?


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

Bu programı linux'umda çalıştırıyorum, terminalde hiçbir şey çıkmıyor, işletim sistemi ölü görünüyor. Linux'un bu tür bir program için belleği bitebilecek herhangi bir koruma önlemi var mı?


2
Ben ... Birçok dağıtımlar büyük takas bölümü oluşturmak için vermek kötü tavsiye takip etmedi eğer darbe az çok olurdu şüpheli
R .. GitHub DUR YARDIMCI ICE

1
"65k tuşuna bastıktan sonra yeni bir süreç yaratmamak" karşı önlem olarak sayılıyor mu? ;)
Bobby

Yanıtlar:


18

Bu çatal bombası olarak bilinir .

Linux'un bu tür bir program için belleği bitebilecek herhangi bir koruma önlemi var mı?

Pek sayılmaz. Her çatal, kendi sanal adres alanı ve bellek kullanımı ile yeni bir süreç üretir. Yani her kopya nispeten küçük. Sonunda, sistemdeki tüm fiziksel + takas belleği kullanacaksınız ve yetersiz bellek (OOM) katili tek tek işlemleri öldürmeye başlayacak. Ancak çatal bomba hala daha hızlı (daha hızlı olmasa da) süreçler oluşturacak.

İlk etapta bunun olmasını önlemenin bir yolu, ulimit -u(Bash kullandığınızı varsayarak; diğer mermilerin eşdeğerleri olacağını varsayarak) kullanarak kullanıcı işlemlerinin sayısını sınırlamaktır .


2
Dikkat edilmesi gereken bir şey ulimit, bash'a özgü olmasıdır; diğer mermiler muhtemelen aynı yerleşik komuta sahip olacaklar, ancak belki farklı bir isimle.
Jay

@Jay: Adil nokta. Cevabını şimdi aldım, teşekkürler!
Oliver Charlesworth

1
kullanıcı başına bellek / dosya tanımlayıcılarını sınırlamak yeterli olmalıdır. Kullanıcı başına belleği sınırlamak her zaman iyi bir fikirdir. Bir süreç öldürüldüğünde (oom), bekçi köpeği bir bildirim göndermelidir, böylece BOFH '

Oturum açma parametreleriyle de bazı sınırlar ayarlayabileceğinize inanıyorum
p_l

10

Evet, ancak sisteminizde varsayılan olarak etkinleştirilmemiş olabilir. setrlimitKullanıcı başına işlem sayısı da dahil olmak üzere - Sistem çağrı sistemi sınırlarını tanımlar.

İlk önce çekirdek API'sında bakalım ("linux" dan bahsettiğinizden beri): manr'ı setrlimit için kullanabilirsiniz;

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

struct rlimit  r;

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

Bu, kullanıcı başına maksimum işlemleri ( RLIMIT_NPROC) 40 (yazılım sınırı) ve 50 (donanım sınırı) olarak ayarlar .

Şimdi, kabuktan bash kullanırsanız, ulimityerleşik komutu kullanabilirsiniz:

ulimit -u
29089

Limiti bir argüman olarak ileterek ayarlayabilirsiniz:

ulimit -u 100

ulimit --help belirleyebileceğiniz başka sınırlar da olduğunu gösterecektir (bunlardan biri, kullanıcı tarafından kullanılan maksimum dosya tanımlayıcı sayısıdır).


7

Kullanıcı düzeyinde mi yoksa sistem düzeyinde mi kullanmak istediğinize bağlıdır. Kullanıcı düzeyinde ulimit(veya diğer mermilere karşılık gelen komutlar) en kolay çözüm olacaktır.

Ancak sistem düzeyinde, kötü niyetli kullanıcıların sistemi durdurmasını (veya sadece ulimit kullanmamalarını) önleyen mekanizmalar vardır. Linux cgroups mekanizması kaynakları grup bazında sınırlayabilir. pam_systemdKullanıcı oturumunu belirli bir grupta olmaya zorlayabilirsiniz ( machanizm yoluyla). Bunun, örneğin CPU zamanlayıcı için başka faydaları vardır.


1
+1: Gruplar gerçekten yeni ve çoğu insan henüz onlar hakkında çok şey bilmiyor. Nereden daha fazla bilgi edinebiliriz?
Ken Bloom

1
@KenBloom: 1. göz atarak /sys/fs/cgroup/2. google'da arama yaparak 3. göz atarak make menuconfig4. içine bakarak /usr/src/linux/Documentation/cgroups5. Systemd belgelerini okuyarak. Üzgünüm daha fazla yardım edemem ama sadece bu kaynakları kullandım. Kaynakları kontrol etmek için masaüstünde cgroups kullandım.
Maciej Piechotka

6

Kullan ulimit -u"max kullanıcı işlemleri" için bir limit tespit etmek bash kabuğundan.

C kabuğundan limitkomutu kullanırsınız .

Bunu yapmak için bir sistem çağrısına ihtiyacınız varsa, setrlimitayarlamak için çağrıyı kullanın RLIMIT_NPROC.


1

Buradaki en son cevaplar 3 yaşın üzerinde olduğundan, yeni çekirdeklerin (4.3'ten beri) yeni "PID'ler alt sistemi" aracılığıyla çatal bombalarını önlemek için açık bir desteğe sahip olduklarını belirtmek istiyorum. (Bkz. Https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=49b786ea146f69c371df18e81ce0a2d5839f865c ve https://git.kernel.org/cgit/linux/kernel/git /torvalds/linux.git/commit/?id=917d8e2d10f40e28aa9e0d824b2e5b8197d79fc2 )

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.