Bu hafta, Zend Framework saldırganlar tarafından PHP sitelerinde uzaktan kod yürütülmesi için nasıl yararlanılabileceği konusunda güvenilmeyen bir seriyi kaldırma güvenlik açığı açıklandı.
CVE-2021-3007 olarak izlenen bu güvenlik açığı, Zend’in halefi olan Laminas Project ile oluşturulan uygulamaları da etkileyebilir. Zend Framework, 570 milyondan fazla kez yüklenmiş PHP paketlerinden oluşur. Çerçeve, geliştiriciler tarafından nesneye yönelik web uygulamaları oluşturmak için kullanılır.
Güvenilmeyen seriyi kaldırma işleminden RCE’ye
Bu hafta, güvenlik araştırmacısı Ling Yizhou, Zend Framework 3.0.0’daki belirli bir gadget zincirinin güvenilmeyen seriyi kaldırma saldırılarında nasıl kötüye kullanılabileceğini açıkladı.
Açıktan yararlanılırsa, uzak saldırganların belirli koşullar altında savunmasız PHP uygulamalarında uzaktan kod yürütme (RCE) saldırıları gerçekleştirmesine izin verebilir.
“Zend Framework 3.0.0, Stream.php’deki Zend \ Http \ Response \ Stream sınıfının __destruct yöntemiyle ilgili olarak içeriğin kontrol edilebilir olması durumunda uzaktan kod yürütülmesine yol açabilecek bir seriyi kaldırma güvenlik açığına sahiptir “, MITRE’nin CVE için tavsiyesini belirtir. 2021-3007.
Gerçek güvenilmeyen serileştirmenin savunmasız bir uygulamadan gelmesi ve Zend Framework’ün kendisinde mevcut olmaması gerekirken, Zend tarafından sağlanan sınıflar zinciri, bir saldırganın RCE’ye ulaşmasına izin verir.
Uygulama tarafından bir kullanıcıdan veya sistemden alınan kodlanmış veriler, uygulama tarafından kodu çözülmeden önce düzgün bir şekilde doğrulanmadığında, uygulamalarda güvenilmeyen seriyi kaldırma güvenlik açıkları ortaya çıkar.
Güvenlik açığı bulunan bir uygulama, alınan verileri uygun olmayan biçimde seri halinden çıkarabilir ve işleyebilir; bu, uygulama çökmelerinden (Hizmet Reddi) saldırganın uygulama bağlamında rasgele komutlar çalıştırmasına kadar çeşitli sonuçlara yol açabilir.
Zend durumunda, güvenlik açığı, bir PHP sihirli yöntemi olan Stream sınıfının yıkıcısından kaynaklanıyor . Nesne yönelimli programlamada, yapıcılar ve yıkıcılar, yeni bir sınıf nesnesi oluşturulduğunda ve yok edildiğinde sırasıyla çağrılan yöntemlerdir.
Yizhou işaret bağlantı kaldırma () denilen yöntem Çayı olan bir parametre, bir dosya adı, bir dosya silme yıkıcı bekler dize veri türü. Gerçekte, streamName nesnesi dize olmayan bir türde olursa, uygulama çalıştırmasının sonunda yine de yıkıcıya iletilir.
Bu nedenle, yalnızca bir dize değerini bekleyen yıkıcı, dizeye eşdeğer değerini almak için nesnenin __toString yöntemini çağırmaya çalışır. Ancak __toString yöntemi, nesnenin yaratıcısı veya nesnenin somutlaştırdığı sınıfın yaratıcısı tarafından kolayca özelleştirilebilir.
Örnek olarak, Yizhou, Zend Framework’ün Gravatar sınıfındaki __toString yönteminin, programcıları tarafından, sonunda saldırganın keyfi kod yürütmek için doğrudan kontrole sahip olduğu değerleri döndürecek şekilde yazılmış olduğunu vurguladı.
Bu, Stream sınıfının streamName’in beklendiği bir Gravator nesnesine geçirilmesi durumunda , belirli koşullar altında, tehdit aktörünün Zend ile oluşturulan savunmasız PHP uygulamaları içinde rastgele komutlar çalıştırabileceği anlamına gelir.
Araştırmacı, PHP uygulaması tarafından çözümlendiğinde saldırganın çıktılarını işlenen web sayfalarındaki komutlarının çıktısını oluşturacak şekilde Zend’e serileştirilmiş nesnelerin aktarılmasının mümkün olduğu en az 2 senaryo gösterdi.
Bir kavram kanıtı (PoC) istismarında, araştırmacı web uygulamasının phpinfo sayfasının sistem komutunu “whoami” başarıyla ayrıştırdığını, serileştirilmiş bir HTTP isteğinden geçirdiğini ve Windows hesap adını “nt otorite \ sistem” döndürdüğünü gösterdi.