Fork bombası, Unix tabanlı sistemlere karşı yapılan bir türk denial-of-service (dos) saldırısıdır. Komut :(){ :|:& };: şu şekilde yazılır ve görüldüğü üzere pek bir şey yapmaz. Ancak yaptığı için sürekli kendisini çağırmak işletim sistemi üzerinde yeni yeni process’ler oluşturmaktadır. Bu da işletim sistemindeki process limitlerine ulaşmak ve onu doldurduktan sonra hiçbir şeyi çalışamayacak duruma getirmeyi hedeflemektedir. Bir kere bu bombanın çalıştırıldığı makine yeniden başlatılmadan düzelme durumu bulunmamaktadır.

Linux process limitleri /etc/security/limits.conf dosyasından gerçekleştirilebilir.

Fork Bombasını Anlamak

:() - : isminde bir fonksiyon oluşturulur ve argüman kabul etmez.

Şu örnek üzerinden fonksiyon daha açık bir şekilde görülebilir.

foo(){
 arg1=$1
 arg2=$2
 echo 'Bar..'
 #do_something on $arg argument
}

Fork bombası yukarıdaki şekilde yazılması gerekirse;

:(){
 :|:&
};:

:|: - Bu sayede aynı fonksiyonu kendi içerisinde tekrar çağırıyoruz ve pipe sonrasında tekrar çağırıyoruz. Bu sayede aynı işlemi iki defa daha yapacak birer bomba çağırmış olduk ve onlar da aynı çağırma işlemlerini gerçekleştirecekler..

& - Programı arka plana atar. Bu sayede sistem kaynaklarını tüketene kadar süreç öldürülemez.

; - Programın tamamlanması sonrasında onu sonlandırır.

: - Hız açısından : kullanılıyor olabilir ancak burada : yerine ne yazdığımız çok da önemli değildir. Daha okunabilir bir kod için;

bomb() { 
 bomb | bomb &
}; bomb

Fork Bombasını Önlemek

Sistemde çalışabilecek maksimum process sayısını bulmak için aşağıdaki komutu yürütebilirsiniz.

$ ulimit -u
31475

Yahut ulimit -a komutu ile tüm limitlere göz atılabilir.

Bizim bu komutu yürüttüğümüz kullanıcı ile oluşturabileceğimiz process sayısı 31475’tir. Sistemi fork bombasından koruyabilmek için bunu daha düşük bir sayıya çekmeniz gerekmektedir. Bunu aşağıdaki şekilde yapabilirsiniz.

$ ulimit -S -u 5000
$ ulimit -u
5000

Şimdi test için tekrar fork bombasını çalıştıralım.

ve sistem yine çöktü.. yeniden başlatıp içerisine girdiğimde ulimit değerinin eski haline geldiğini gördüm. Tekrar 5000 yapıp bombayı çalıştıralım.

$ :(){  :|:& };:
...
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable

[1]+  Done                    : | :

Tüm bu işlemleri yaparken farklı bir ssh üzerinden aşağıdaki komutla aktif process sayısını gözlemledim.

$ pgrep -wcu $USER
5000
$ pgrep -wcu $USER
4908
$ pgrep -wcu $USER
3032
$ pgrep -wcu $USER
15

2 3 saniye aralıklarla çalıştırılan komutlarsa komutu yürütür yürütmez process sayısının 5000’e vurduğu ve sonrasında programlar sonlandırıldıkça azaldıkları görülebilir.

Daha önce yapılan testte sorun yaşamamızın nedeni root kullanıcısı ile işlem yapmamızdı. root kullanıcısı bu kısıtlamalara dahil değildir.