Linux ­Kurulu­m ve Y­onetim­i
  • Döküman Hakkında
  • Linux ve GNU'nun Geçmişi
    • CentOS, Debian ve FreeBSD Ana Sürümlerin Farkları
  • Temel Komutlar
    • Temel Terminal Komutları
    • Yardım Dosyaları
    • Dosya İzinleri, Yetkiler, Kullanıcılar ve Gruplar
    • Dosya Düzenleme Araçları
      • nano ve pico
      • vi
    • Sıkıştırılmış Dosyalar
  • Standart Girdi ve Çıktı
    • Standart Çıktı
    • Standart Girdi
    • UNIX Pipeline
    • Olmazsa Olmaz: stdio.h
    • Standart Hata ve File Descriptor
    • Forkbomb
    • Named Pipe
  • Gelişmiş Terminal Komutları
    • Tarih ve Saat Ayarlama
    • Sistem Yükünü İzleme
    • patch ve diff
    • xargs
    • awk ve sed
    • egrep ve Regular Expressions
    • rename
    • Imagemagick ve Görüntü Dosyaları
    • wget
    • Python ile Dosya Sunuculuğu
  • Temel Dağıtımlar
    • RHEL Tabanlı (CentOS, Rocky, Alma)
      • rpm Paketleri
      • DNF Paket Yöneticisi
      • Repo Ayarları
      • Network Ayarları
    • Debian
      • deb Paketleri
      • apt Paket Yöneticisi
      • Repo Ayarları
      • Network Ayarları
    • FreeBSD
      • Ports ve pkg Yönetimi
      • Güncelleme Teknikleri
      • Network Ayarları
    • Arch Linux
      • pacman ve AUR
      • Network Ayarları
    • Ortak Network Dosyaları
  • SSH
    • Uzak Sunucuya Bağlanma
    • sshd Sunucu Ayarları
    • Private ve Public Anahtarlar
    • Güvenli Dosya Aktarımı
    • sshfs
  • Kernel Boot
    • Sunucu Başlangıcına Genel Bakış
    • Çekirdeğin Yüklenmesi ve Boot Seçenekleri
    • Çekirdek Parametreleri
    • Bootloader Nedir?
  • User Space
    • Başlangıç: Init
    • Init Versiyonunu Belirlemek
    • System V
      • Servislerin Yönetimi
      • Çalışma Seviyeleri (Run Levels)
      • Örnek System V Servis Oluşturma
    • systemd
      • Servislerin Yönetimi
      • Birimler ve Birim Tipleri
      • Örnek systemd Servis Oluşturma
    • Acil Durumlar ve Tek Kullanıcı Modu
  • BASH Programlama
    • Döngüler ve Diğer Kontrol Yöntemleri
    • Menüler
  • Log Dosyaları
    • Log İnceleme ve Filtreleme
  • İnternet Servisleri
    • Bir sayfanın İnternetteki Serüveni
    • Nameserver Servisleri
    • Apache
    • PHP-FPM
    • FTP/FTPS/SFTP
      • vsftpd
      • ProFTPD
      • SFTP
      • Komut Satırından ftp Kullanımı
  • Zamanlanmış Görevler
    • crontab
    • at
  • Veritabanı
    • MySQL
      • MySQL Kurulumu
      • MySQL Servisini Çalıştırmak
      • Veritabanı ve Tablo oluşturmak
      • SQL Tablosuna Veri Eklemek
      • Temel SQL Sorgularına Giriş
        • Birinci bölüm
      • mysqldump ile yedekleme
      • Replikasyon teknikleri
      • Yedekleri içeri alma
    • PostgreSQL
      • PostgreSQL Kurulumu
      • Temel Yapılandırma
      • Temel Kullanım
    • MongoDB
      • MongoDB Kurulumu
      • Temel Yapılandırma
      • Temel Kullanım
    • Redis
      • Redis Kurulumu
      • Temel Yapılandırma
      • Temel Kullanım
  • Temel Network Yapılandırması
  • Gelişmiş Network Komutları
    • ip
    • ifconfig
    • route
    • ping
    • traceroute
    • dig
    • nslookup
    • netcat
    • nmap
    • tcpdump
    • Wireshark (Giriş)
    • Bantgenişliği Ölçümü
  • Güvenlik
    • Firewalld
    • IPTables
      • Temel İzinler
      • IP ve Port Engelleme
    • selinux
  • Disk Sistemleri
    • ext
    • zfs
    • lvm
  • RAID
    • RAID Biçimleri
    • Verinin Disklere Yayılması
    • Cache
    • Terimler ve Tavsiyeler
  • Örnek Kurulumlar ve Modern Yaklaşımlar
    • CentOS 7 Tam Sistem Kurulumu (Arşiv)
    • AlmaLinux ile Hosting Ortamı Kurulumu
    • Ubuntu ile Hosting Ortamı Kurulumu
    • Modern Hosting Yaklaşımları (PaaS, Coolify vb.)
  • Konteynerleştirme (Docker / Podman)
  • Yapılandırma Yönetimi (Ansible)
  • İzleme ve Uyarı (Prometheus / Grafana)
  • Nginx Web Sunucusu
  • Kubernetes (Giriş)
  • PCI-DSS ve Linux Sistemleri
  • İndeks
  • Kaynaklar
Powered by GitBook
On this page
  • Fork Bomb Nedir?
  • Klasik Bash Fork Bombası
  • Fork Bombasına Karşı Korunma: ulimit ve nproc
  • Limitlerin Yapılandırılması
  1. Standart Girdi ve Çıktı

Forkbomb

Fork Bomb Nedir?

Fork bomb, kendini sürekli olarak kopyalayan (fork eden) ve bu yolla sistem kaynaklarını (özellikle işlem tablosunu ve işlemci zamanını) hızla tüketerek sistemi kullanılamaz hale getirmeyi amaçlayan basit ama etkili bir Denial of Service (DoS) saldırısıdır. Çalıştırıldığında, üstel bir hızla yeni işlemler oluşturur ve kısa sürede sistemin yeni işlem başlatmasını engeller.

Klasik Bash Fork Bombası

Bash kabuğunda en bilinen fork bombası şu şekildedir:

:(){ :|:& };:

Bu kodun açıklaması şöyledir:

  1. :(){ ... }; : : isminde bir fonksiyon tanımlar. Fonksiyon ismi olarak : seçilmesi, kodun daha kısa ve gizemli görünmesini sağlar, ancak herhangi bir geçerli fonksiyon ismi de kullanılabilir (örneğin bomb(){ bomb|bomb& }; bomb).

  2. : : Fonksiyonun gövdesi içinde, fonksiyon kendini tekrar çağırır.

  3. | : İlk çağrının standart çıktısı, ikinci bir çağrıya pipe (boru hattı) ile standart girdi olarak bağlanır. Bu pipe işlemi, her iki tarafın da çalışmasını sağlamak için gereklidir, ancak verinin kendisi önemli değildir.

  4. : : İkinci çağrı yapılır.

  5. & : İkinci çağrı (:|:) arka planda çalıştırılır. Bu, fonksiyonun hemen geri dönmesini ve döngünün hızla devam etmesini sağlar.

  6. ; : Fonksiyon tanımı sonlandırılır.

  7. : : Tanımlanan : fonksiyonu ilk kez çağrılarak bomba tetiklenir.

Bu zincirleme reaksiyon sonucunda, her çalışan fonksiyon iki yeni fonksiyonu tetikler ve işlem sayısı katlanarak artar (1 -> 2 -> 4 -> 8 -> 16 -> ...).

Fork Bombasına Karşı Korunma: ulimit ve nproc

Modern Linux sistemleri, fork bombalarının etkisini sınırlamak için kullanıcı başına kaynak limitleri uygular. Bu limitlerden en önemlisi, bir kullanıcının aynı anda sahip olabileceği maksimum işlem sayısıdır (nproc).

Bu limitler ulimit komutu ile görüntülenebilir ve (soft limitler için) ayarlanabilir:

# Mevcut kullanıcı için soft nproc limitini göster
ulimit -Su 

# Mevcut kullanıcı için hard nproc limitini göster
ulimit -Hu

# Tüm soft limitleri göster
ulimit -aS

# Tüm hard limitleri göster
ulimit -aH 

Örnek ulimit -aS çıktısı:

...
max user processes              (-u) 4096 
...

Bu örnekte, kullanıcının aynı anda en fazla 4096 işlem başlatabileceği görülmektedir (soft limit).

Bir fork bombası çalıştırıldığında, işlem sayısı hızla bu limite ulaşır. Limit aşıldığında, sistem yeni işlemler (fork) oluşturamaz ve aşağıdaki gibi hatalar verir:

-bash: fork: retry: No child processes
-bash: fork: Resource temporarily unavailable 

Bu hatalar, fork bombasının nproc limiti tarafından durdurulduğunu gösterir. Sistem yavaşlayabilir ancak tamamen kullanılamaz hale gelmez ve genellikle yönetici müdahalesi ile (örneğin, bombayı başlatan kullanıcının işlemlerini sonlandırarak) kurtarılabilir.

Limitlerin Yapılandırılması

Kullanıcı bazlı işlem limitleri genellikle /etc/security/limits.conf dosyasında veya daha modern sistemlerde /etc/security/limits.d/ dizini altındaki dosyalarda (örneğin, 20-nproc.conf) ayarlanır.

Örnek bir /etc/security/limits.d/20-nproc.conf dosyası:

# Kullanıcıların yanlışlıkla fork bombası başlatmasını önlemek için
# varsayılan işlem limiti.

*          soft    nproc     4096
root       soft    nproc     unlimited
#emre       hard    nproc     8192 
  • *: Root dışındaki tüm kullanıcılar için geçerli kural.

  • soft: Uygulanan başlangıç limiti (soft limit). Kullanıcı bu limiti hard limite kadar artırabilir.

  • hard: Kullanıcının ulaşabileceği mutlak üst limit (hard limit). Sadece root tarafından artırılabilir.

  • nproc: Limitlenen kaynağın türü (number of processes).

  • 4096: Limit değeri. unlimited ise limitsiz anlamına gelir.

Bu yapılandırma dosyaları, PAM (Pluggable Authentication Modules) aracılığıyla, genellikle pam_limits.so modülü kullanılarak kullanıcı oturumları başladığında uygulanır.

Fork bombaları, kaynak limitlerinin ve dikkatli sistem yönetiminin önemini gösteren klasik bir örnektir.

PreviousStandart Hata ve File DescriptorNextNamed Pipe

Last updated 1 month ago