Slow Read DoS Attack (Yavaş Okutarak Hizmet Engelleme Saldırısı)

Eyl 07, 2013

Özellikle Web sitelerini devre dışı bırakmak için kullanılan “slow read” saldırıları TCP'nin (Transmission Control Protocol - İletim Kontrolü Protokolü) doğal yapısındaki “window size” özelliğini kullanarak sunucunun (server) istemciye (client) gönderdiği cevabın yavaş okunmasına dayanır. Cevap, istemcide yavaş okunarak sunucu bekletilir. Daha önceden kullanılan “slow” saldırılarda sunucuya parçalar halinde gönderilen HTTP (Hypertext Transfer Protocol – Hipermetin Aktarma Protokolü) istekleri sunucunun portlarının tıkanmasına neden olmaktaydı. Aralıklarla gönderilen sayfa parçası istekleri sunucu ile istemci arasındaki bağlantının kesilmesini önlemekteydi. “Slow read” saldırısında ise, istek sunucuya bütün halinde gönderilmekte, fakat sunucunun cevabı bellekten yavaş okunarak geciktirilmektedir. Timer (zamanlayıcı) bulunan sunucular belirlenen süreden sonra bağlantıyı keseceğinden dolayı TCP’deki veri akışını kontrol eden “window size” özelliğinin 0’a yakın tutulmasıyla sunucu ve istemci arasında kısa sürelerle “ACK” ve “SYN” paketleri gönderilmesi sağlanarak, sunucunun bağlantıyı kesmesi önlenmektedir. Saldırı temelde istemci bilgisayarın sunucuya gönderdiği büyük boyutlu isteğin cevabını, çalıştırdığı araçlarla parça parça ve yavaşlatarak dinlemesi sonucu oluşur. İstemci cevabı yavaş okurken, sunucu verinin kalanını gönderebilmek için istemcinin veri gönderimine hazır olmasını bekler ve belleğini gönderilmemiş verilerle doldurur. Eş zamanlı böyle saldırılar ile sunucunun diğer istemciler ile bağlantı kurması engellenir.

“Slow read” saldırıları düzenlemek oldukça kolaydır. Yalnızca asgari donanım gerektirir. Ayrıca tek bir bilgisayar bile kısa bir sürede bir sunucuyla binlerce bağlantı kurup, asgari bant genişliği kullanarak binlerce tamamlanmamış HTTP isteği gönderebilir.

“Slow read” saldırıları uzun zaman alan masum HTTP istekleri gibi göründüklerinden tespit edilmeleri zordur ve alışıldık DoS (Denial of Service – Hizmet Engelleme) saldırısı önleme yöntemleri ile engellenemezler.

Sunucularda varsayılan ayarlardan olan aşağıdaki özellikler bulunduğunda sunucu “slow read” saldırılarına açık hale gelmektedir.

  • Sunucunun çok küçük “window size” değeri ile gelen ilk “SYN” paketlerini kabul etmesi,
  • Sunucunun, istemcinin veriyi kabul etmemesi halinde bağlantıyı kesmemesi,
  • Sunucu ile istemciler arasında devamlı bağlantılar ve HTTP pipelining (arka arkaya veri aktarımı) yapılabilmesi.

Bu tür saldırılardan korunmak için Web sunucusuna normalden çok daha küçük “window size” kullanılarak istek yapan istemcilerle bağlantıyı reddetmesini sağlayan, istemcinin veriyi uzun süre kabul etmemesi halinde bağlantıyı kesmesini sağlayacak ve isteklerin ömrünü sınırlayan kurallar yazılmalıdır.

Uygulama

Fedora işletim sistemine sahip bir istemciden 160.75.5.174 IP (Internet Protocol – İnternet Protokolü) adresini kullanan CentOS işletim sistemi yüklü Web sunucusuna “slowhttptest” isimli bir program kullanılarak yapılan saldırıda kullanılan komut “slowhttptest –c 1000 –B –g –o body_stats –i 110 –r 200 –s 8192 –u https://160.75.5.174 –x 10 –p 3” şeklindedir. Saldırının süresi 240 saniyedir. Programın yapılandırılabilir özellikleri aşağıda açıklanmıştır.

-c : Kurulacak bağlantı sayısı belirtilir.
-g : Grafik çizmek için gerekli istatistikleri tutacak bir HTML (Hyper Text Markup Language- Zengin Metin İşaret Dili) sayfası üretir.
-o : Grafiğin tutulduğu HTML sayfasının adı belirtilir.
-i : Gönderilen veriler arasındaki zaman saniye cinsinden tanımlanır.
-r : Saniyede kurulacak bağlantı sayısı belirtilir.
-s : Veri başlığı içerik boyutu değeri “byte” cinsinden tanımlanır.
-u : Hedef URL (Uniform Resource Locator - Tekdüze Kaynak Konumlayıcı) belirtilir.
-x : Tek seferde gönderilebilecek en fazla veri boyutu tanımlanır.
-p : Sunucunun cevap vermiyor olarak yorumlanması için beklenecek süre tanımlanır.

İstemci bilgisayarda komut satırına belirtilen komut girildiğinde alınacak ilk ekran görüntüsü aşağıdaki gibi olur.

 

Buradaki “pending” değeri sunucunun göndermek için belleğinde beklettiği cevap sayısı, “closed” değeri sunucunun kapattığı bağlantı sayısıdır. “service available” değerinin “YES” olması sunucunun hizmet verebildiği anlamına gelmektedir. Saldırıya başlandığında sunucu hizmet verebilir durumdadır. Bu değer “NO” olduğunda ise sunucu hizmet veremez duruma gelecek, yani hizmet engelleme saldırısı amacına ulaşmış olacaktır.

Saldırının 0-10 saniye arasındaki çıktısının ekran görüntüsü aşağıdaki gibidir.

 

Saldırı başladıktan 5 saniye sonra sunucunun hizmet veremez halde olduğu ve istemciye göndereceği 221 cevabı belleğinde tuttuğu görülmektedir. 10. Saniyede ise “pending” değeri artmaya devam ederken, sunucu bağlantılardan 14’ünü kapatmış durumdadır.

Saldırı sonlandığında alınan çıktının ekran görüntüsü aşağıdaki gibidir.

 

Çıktıdaki “status” değerinin “Connection refused” olması sunucunun bağlantıyı reddettiğini göstermektedir. Saldırının 110. saniyesinde sunucu hala erişilemez durumdayken 111. saniyede bağlantıyı redderek saldırıyı durdurmuştur.

Programın oluşturduğu HTML sayfasından alınan ekran görüntüsü aşağıdaki gibidir.

Grafikte görüldüğü gibi sunucu ilk iki saniye içerisinde hizmet veremez duruma gelmiştir. Saldırı süresince sunucu bazı bağlantıları kapatarak “pending” değerini azaltmış ve saldırıyı sonlandırmaya çalışmıştır. Sunucu bu şekilde bağlantıyı reddederek saldırıyı sonlandırdığında tekrar hizmet verebilir hale gelmiştir.

Aynı saldırı geliştirilerek ve/veya birden fazla istemci tarafından uygulanarak daha etkili bir hale getirilebilir ve sunucunun hizmet verememe süresi artırılabilir, saldırının sunucu tarafından engellenmesi önlenebilir olmakla beraber daha önce yukarıda belirtilen önlemler sunucuda uygulanarak saldırı sunucu tarafında hiçbir sorun yaratmadan etkisiz hale getirilebilir.