Gününümüzde geliştirilen herhangi bir projede paket yöneticisinin olmayışı pek kabul edilebilir bir şey değildir. Her şeyi sıfırdan yazmak yerine, topluluk içerisindeki gurular tarafından geliştirilmiş modülleri/iş paketlerini projeniz içerisinde kullanmak ve anlık olarak yönetebilmek son derece elzem bir konudur. Bu süreci PHP dünyasında çözen yaklaşım ise composer‘dir.
Peki nedir bu composer ?
Php için geliştirilmiş bir bağımlılık yönetim aracıdır. Projemizde kullanmak istediğimiz php kütüphanesinin ihtiyacı olan php dosyalarını projeye dahil edilmesini sağlayan, çeşitli güncellemeleri otomatik yapabilen bir araçtır. Php’de Composer’ın yaptığı işlemleri Ruby’de bundler, NodeJs’de Npm, Java’da Maven yapmaktadır.
Neden İhtiyaç Duyulur ?
Geliştirdiğimiz projelerimizde birçok kütüphaneye ihtiyaç duyarız ve bu kütüphanaleri projemize ekleriz. Bu kütüphaneler sürekli geliştiriliyor,güvenlik açıkları gideriliyor performans artırıcı güncellemeler yapılıyor bir üst versiyonları çıkarılıyor bizimde bu güncellemeleri almamız gerekiyor aksi takdirde projemizde güvenlik açığı oluşabilir, performans açısından istediğimizi alamayabiliriz, eski versiyonu kullandığımız için bu teknolojide geride kalmış olabliriz. Birden fazla kütüphane kullandığımız için bu kütüphaneleri tek tek projemize eklemek veya projede bulunana kütüphaneleri güncellemek biraz zahmetli olucaktır işte tam burada devreye composer giriyor. Biz ihtiyacımız olan kütüphaneyi veya güncellemesini istediğimiz kütüphaneyi composer’a belirtiyoruz composer bizim yerimize istediğimiz kütüphaneyi projemize ekliyor veya güncelliyor. Bir örnek ile gözümüzde canlandıralım Bizim Php ile yazdığımız kod başka birinin Bilgisayarın’da çalışmayalbilir bu sorun Php versiyonundan kaynaklanıyor olabilir bizim kodumuz Php 5.3 üstünü destekliyordur ancak o kişi Php 5.2 kullanıyır olabilir eğer biz projeye Composer aracını yüklemişsek o kişi Composer’ı kullanarak versiyon sorununa takılmadan projeyi çalıştırabilir.
Bu bilgileri doğrudan alıntıladığım Bulutfon bloğunda composer ile ilgili daha detaylı bilgileri okumanız önemle rica olunur.
Demo Sayfaları ve Composer’ın Etkisi
Başka birisi tarafından geliştirilmiş kodları, her ne kadar aylık +1M kullanıcısı olsada, doğrudan projemiz içerisinde güncelliyor olmak potansiyel bir güvenlik riski oluşturur. Bunu kabul etmekle birlikte, bu yazıda asıl bahsedeceğim risk bu değildir.
Bir çok modül örnek kullanım dosyaları ile birlikte release edilir. Farz edelim ki bir Image processing kütüphanesi mevcut, bu kütüphanenin kullanımını örnekleyen kodlar ise /samples veya /examples altında yayınlanır. Örnek kullanımlarında içerisinde bulunduğu bu proje, composer paketi olarak yayınlanmış ise bazı yeni risklerimiz oluşacaktır.
Hiçbir yazılım geliştirici, örnek olarak yazdığı, projenin veya kütüphanenin nasıl kullanılacağını anlattığı kodlarda güvenliğe önem vermez.
Bu risklerin etkisini bir adet gerçek hayat örneği üzerinden anlatmak isterim. Vulnerability research çalışmalarım sırasında karşılaştığım, bu blog yazısını yazmama neden bu hikaye Tiki Wiki isimli open-source PHP projesi ile ilgili.
Tiki Wiki projesi release edilen paketlerinde /vendor ve /vendor_extra klasörleri gelmektedir. Bu klasörler composer tarafından indirilen bağımlılıkların tutulduğu yerdir. Yaz girişinde Kişisel Web Altyapılarında
dememin başlıca sebebi ise bu klasörler web üzerinden erişilebilir durumdadır. Laravel gibi günümüz popüler framework’leri composer tarafından indirilen klasörleri web’den erişilemez bir dizinde tutar!
➜ tiki-15.1 ls -al vendor_extra/elfinder total 40 drwxrwxr-x@ 12 mince staff 408 Jun 8 17:51 . drwxrwxr-x@ 12 mince staff 408 Jun 8 17:51 .. -rw-rw-r--@ 1 mince staff 1828 Apr 19 2013 Changelog -rw-rw-r--@ 1 mince staff 4098 Apr 19 2013 README.md -rw-rw-r--@ 1 mince staff 1395 Mar 28 12:52 composer.json drwxrwxr-x@ 5 mince staff 170 Jun 8 17:51 css -rw-rw-r--@ 1 mince staff 1346 Apr 19 2013 elfinder.html drwxrwxr-x@ 2 mince staff 68 Jun 8 17:51 files drwxrwxr-x@ 19 mince staff 646 Jun 8 17:51 img drwxrwxr-x@ 6 mince staff 204 Jun 8 17:51 js drwxrwxr-x@ 19 mince staff 646 Jun 8 17:51 php drwxrwxr-x@ 3 mince staff 102 Jun 8 17:51 sounds
Paket ile doğrudan gelen örnek bir elfinder.html
veya back-end uygulaması olen php
klasörü dikkatimizi çekmektedir. Daha öncede dediğimiz gibi, hiçbir yazılım geliştiricinin, sample code için güvenliği önemsemeyişi burada önemli rol oynar. php klasörü içerisindeki end-point API yapısında, herhangi bir file extension veya file type kontrolü yoktur..!
Bu durumu tespit eder etmez Tiki Wiki ekibine mail ile ulaşığ durumu bildirdim. Çok nazik bir şekilde benden “Public Disclosure” politikamı istediler ve benim belirlediğim zaman sınırına göre release çıkacaklarını dile getirdiler. Ve sonunda release’i gerçekleştirdiler.
İlgili zafiyetin Metasploit modülü ise aynı gün içerisinde MSF ekibi tarafında kabul edildi.
https://rapid7.com/db/modules/exploit/unix/webapp/tikiwiki_upload_exec
Önlem
Kendi altyapınızı geliştirmeyiniz. Bağımlılıklar web üzerinden erişilemiyor olmalıdır. Zira Laravel vb. altyapıları kullanmanız durumunda bu sorun ile karşılaşmayacaksınızdır.