PHP <5.3.1 Denial of Service

Uzun zamandır yazamıyordum, gezegen biraz paslanmış ama bu girdi gezegenin pasını alacak gibi görünüyor :)

Birkaç gün önce PHP 5.3.1 yayınlandı, birçok hatayı ve güvenlik açığını kapatıyor. Güvenlik güncellemeleri şu şekilde:

  • Added “max_file_uploads” INI directive, which can be set to limit the number of file uploads per-request to 20 by default, to prevent possible DOS via temporary file exhaustion.
  • Added missing sanity checks around exif processing.
  • Fixed a safe_mode bypass in tempnam().
  • Fixed a open_basedir bypass in posix_mkfifo().
  • Fixed failing safe_mode_include_dir

İçlerinden en önemlisi kalın olarak belirttiğim “max_file_uploads” seçeneği. PHP 5.3.1 ‘den önceki sürümlerde bu özellik yok ve üzerinde PHP çalıştıran herhangi bir sunucu 1 dakika içerisinde isteklere yanıt veremez hale getirilebiliyor. Upload edilen dosyanın işlenip işlenmemesi önemli değil, sadece boş bir index.php barındırmanız bile yetiyor!

Açık PHP’nin dosya upload sırasında geçici dosya oluşturmasından kaynaklanıyor. Eğer art arda 16.000+ dosya upload isteği gönderirseniz, sunucu geçici dosya yaratma ve silme ile aşırı derecede meşgul olacağı için normal isteklere cevap veremez hale geliyor. Bu süre zarfında %100 ‘e yakın işlemci tüketmesi ve büyük miktarda bellek kullanması da cabası.

Bununla birlikte açığın kullanıldığına dair çok net bir işarete rastlayamıyorsunuz. Sadece log dosyanızda aynı IP adresinden gelen birkaç yüz tane POST isteği görülecek. POST isteklerinin içeriğin görülemediği için, eğer bu açıktan haberdar değilseniz dikkatinizi o yöne değil de başka yerlere vererek sunucunuzun neden erişilmez olduğunu anlayamayacaksınız. Daha da kötüsü, her zaman kolayca kullanılabileceği için sisteminiz büyük risk altında olacak :)

Açık Bogdan Calin tarafından bulundu. Daha ayrıntılı bilgi için [0] adresini okuyabilirsiniz. Kendisi kullandığı scripti vermeyeceğini yazmış ancak biraz araştırma ve deneme ile açığı exploit eden kodu yazdım ve yayınlıyorum. :) Kod [1] adresinde.

Şu anda Türkiye’de PHP içerik sunan sitelerin büyük bir çoğunluğu etkinlenir durumda. Hosting şirketleri bu açığı kapatmadığı sürece de etkilenecek…

[0] http://www.acunetix.com/blog/websecuritynews/php-multipartform-data-denial-of-service/

[1] http://www.exploit-db.com/exploits/10242

Peki nasıl korunacağız?

PHP 5.3.1 ile açık kapanıyor. Eğer güncelleme imkanınız varsa 5.3.1’e güncelleyin. Ancak PHP 5.3.1 ile birçok özellik değişmiş durumda ve PHP 5.2.x ile çalışan pek çok uygulama 5.3.x ile çalışmayacaktır. Bu yüzden büyük ihtimalle PHP 5.2.x kullanıyorsunuz. Eğer tahmin ettiğim gibiyse, 5.2.x yamaları aşağıda. Yamaları uygulayıp PHP’yi tekrar derleyin ve sunucunuzu yeniden başlatın.

http://svn.php.net/…/main/rfc1867.c?r1=272374&r2=289990

http://svn.php.net/…/main/main.c?r1=289214&r2=289990 (NOT: Buradaki 100 değeri sonradan 20 olarak değiştirildi, siz de 20 olarak değiştirip uygulayın)

Güvenli olup olmadığımı nasıl anlarım?

Çok basit. Aşağıdaki adresindeki dosyayı alıp sunucunuz üzerinde dosya uzantısı *.php olacak şekilde çalıştırın. Sizde yamanın olup olmadığını söyleyecektir.

Pardus ne alemde?

Tabi ki açık yayınlandıktan 1 gün sonra yamaları eklendi ve commit [*] edildi. Birkaç gün içerisinde de depoya alındı. Şu anda düzeltilmiş PHP paketi stable depoda. Eğer Pardus kullanıyor ve PHP içerik sunuyorsanız güvenlik açığını kapatmak için PHP paketlerini güncellemeniz yeterli:

sudo pisi ur && sudo pisi up mod_php php-common php-cli

sudo service apache restart

* http://liste.pardus.org.tr/paketler-commits/2009-November/087149.html

Sonra?

Yazdığım bu girdi ve exploit bu tür önemli şeyleri takip etmeyen sistem yöneticilerini uyandıracaktır diye umuyorum. Eğer PHP kullanıyorsanız, lütfen kullandığınız dağıtımın güncellemelerini kontrol edin. Açığın kapanıp kapanmadığına bakın. Hizmet satın alıyorsanız sunucu yöneticinize bu durumu bildirin. Ve lütfen bu girdiyi ulaştırabildiğiniz kadar insana ulaştırın, dağıtın! Böylece insanlar bu konu hakkında bilinçlenecek ve bu açık daha hızlı bir sürede kapanacabilecek..

Önemli Notlar:

Yayınlanan kod ile yapacaklarınız tamamen sizin sorumluluğunuzdadır. Yayınlanan kod sadece eğitim amaçlıdır ve böyle bir şeyin yapılabileceğini göstermek için yazılmıştır.

Reklamlar

7 thoughts on “PHP <5.3.1 Denial of Service

  1. Eğer kod sadece eğitim amaçlıysa içinde azıcık olsun açıklama satırı eklenmesi gerekmez miydi?

    Bence exploit yazıp yayınlamak iyi bir fikir olmamış.

  2. Kodun içerisinde elimden geldiğinde açıklama yazpmaya çalıştım. Açığı bulan kişinin blog adresi de mevcut içerisinde. Açık hakkında daha fazla ayrıntı oradan elde edilebilir.

    Tabi “Türkçe”ye çevirseydin bari, diyebilirsiniz ama tamamen çevirmeye vaktim olmadı maalesef. :)

  3. Exploiti yayinlama fikri benim de hosuma gitmedi. Bu konuda kötü niyetli sahsiyetler, evet senin yazdigin kod olmasa da, bu acigi bir sekilde kullanabilirler belki.Fakat her kötü niyetli sahsiyetin zeka seviyesi de senin kadar degil. Bu nedenle bu exploit kodunu -yine egitim ögretim cercevesinde- acigin kapatilmasi icin daha makul bir süreyi göz önüne alarak yayinlaman daha dogru olurdu sanki. Zira Pardus bu acigi kapatmis olsa da, baska dagitimlar henüz bunu yapmadilar. Ve bu süre dahilinde bazilari ne yeni sürüme gecebilecek ne de kendisi yamayi uygulayip derleyebilecek. Burada faturayi gec yama yapan dagitimlara, gec reaksiyon gösteren sistem yöneticilerine, hatta haberi olmayan sistem yöneticilerine filan cikarabiliriz ama bu magduriyetleri engellemeyecektir.

    Dikkat cekmek istemeni anlayabiliyorum ama bunu exploit kodunu yayinlamadan da yapabilrsin. Mesela benim dikkatimi yeterince cekti :) Yarin toplantida bu konuyu da konusacagim :)

  4. @Selim: Diğer dağıtımlar exploiti yayınladığım sırada açıklarını kapattılar ve advisory yayınladılar. Mandriva, Debian, Redhat, Ubuntu, SuSE vs. :)

    Şu anda farkettim ki benim yazdığım exploit dışında araştırmayı yapan kişi de kendi programını yayınlama kararı almış. Yani ben yayınlamasaydım ortada bu açığı kullanan bir kod yine olacaktı ve insanlar böyle bir şeyin var olduğundan haberdar olmayıp daha çok tehlike arz edecekti :)

  5. Diger dagitimlari bilemiyorum fakat RedHat ve Fedora’da henüz kipirdanma yok. Evet RedHat acigin farkinda [1],[2]. Ama güncelleme yok. (Kacirdigim bir sey yoksa tabii :)

    Ve evet sen yayinlamasanda baskalari benzer betikler yazip dagitmis durumda [3].

    Fakat ben hala betik yayinlamayla, insanlarin acigin farkina varmasi arasinda dogru bir oranti kuramadim. Tehlikeli bir acik oldugunu anlatmak icin ille de betik yayinlamak mi gerekiyor? Acikcasi betik yayinlamanin lamerlere amme hizmeti yapmak disinda bir faydasini görmüyorum.

    [1]: http://www.redhat.com/security/data/cve/CVE-2009-4017.html
    [2]: https://bugzilla.redhat.com/show_bug.cgi?id=540459
    [3]: http://www.paste-it.com/view/77958658

  6. Diger dagitimlari bilemiyorum fakat RedHat ve Fedora’da henüz kipirdanma yok. Evet RedHat acigin farkinda [1],[2]. Ama güncelleme yok. (Kacirdigim bir sey yoksa tabii :)

    Ve evet sen yayinlamasanda baskalari benzer betikler yazip dagitmis durumda [3].

    Fakat ben hala betik yayinlamayla, insanlarin acigin farkina varmasi arasinda dogru bir oranti kuramadim. Tehlikeli bir acik oldugunu anlatmak icin ille de betik yayinlamak mi gerekiyor? Acikcasi betik yayinlamanin lamerlere amme hizmeti yapmak disinda bir faydasini görmüyorum.

    [1]: http://www.redhat.com/security/data/cve/CVE-2009-4017.html
    [2]: https://bugzilla.redhat.com/show_bug.cgi?id=540459
    [3]: http://www.paste-it.com/view/77958658

  7. bence exploit bir harika ellerine sağlık.
    ve yayınlaman da hoş olmuş.yabancı hosting şirketleri bole şeyleri takip eder
    ve önlemini alır ama biizmkiler fazla gelenekçidir :)
    herhangi bir problem oluşmadan güncelleme yapmazlar.bizimkilerin anladığı tek güvenlik disable fonksiyonları ağzına kadar doldurmaktan başka birşey değil.
    ağızları yanmadan bunu dert etmezler.
    ayrıca hem exploiter kaç kişi gördünüz ülkemizde.diyorsunuz ki yani bil zekice düşün bundan haberdar et.
    Allah aşkına bu exploit yazılmasa haberdar olan insan sayısı bile düşerdi.
    bakın yorumlar bile hep exploit üzerine :).

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s