Meraklısı İçin Apache Struts RCE Zafiyeti
CVE-2017-9197 kodlu uzaktan kod çalıştırma zafiyetinin Showcase uygulamasında bulunan bir programlama hatasından kaynaklandığını, sadece Showcase uygulamasını deploy edenlerin etkileneceğini, zafiyetin teknik detaylarını ve daha fazlasını bu yazımızda bulabilirsiniz.
Apache Struts Java uygulamaları geliştirirken kullanılan ücretsiz ve açık kaynak kodlu bir MVC Framework. Struts Java içerisinde ayrı bir scripting dil olan Expression Language’in OGNL (Object Graph Navigation Language) implementasyonunu kullanmaktadır. Struts kullanıcıları tam da şu sıralar Struts üzerinde ard arda bulunan OGNL injection ile Uzaktan Kod Çalıştırma zafiyetleri ile çokça karşılaşmaktalar. Bunlardan en yenisi 7 Temmuz 2017’de Struts Framework’ünde CVE-2017-9791 kodlu sonuçları root yetkisi ile sisteme erişimle sonuçlanan yine bir “Uzaktan Kod Çalıştırma” zafiyeti. Struts 2’ye dair benzer altyapıdaki bir önceki RCE zafiyeti hakkında şu yazımızı okuyabilirsiniz. Zira Struts Java dünyasında geliştirilen uygulamalarda sıklıkla kullanıldığı için zafiyet büyük önem arz etmekte.
Apache Struts’ın iki major versiyonu bulunmakta; Struts1 ve Struts2. Struts2’nin ilk full release’i 2007 yılında duyurulurken Struts1’in de desteği 2008 yılında sona erdi. Ancak Struts2 içerisinde Struts1 plugini, Action sınıfı ve ActionForms kullanma imkanı tanınmakta. Haliyle desteği 2008 yılında sona eren bir versiyon bir çok zafiyet barındırabilir. Ancak yazının konusu olan zafiyet bir programlama hatasından yani programlama mantığı hatasından kaynaklanmaktadır. Özellikle zafyeti raporlayan kişi ic3z ile ekibimizden Ziyahan Beyin yazışmaları sonucu kendisi de zafiyetin showcase uygulamasında yapılan bir programlama hatasından kaynaklandığını ve zafiyetten sadece showcase uygulamasını da deploy edenlerin etkileneceğini doğrulamıştır.
Zafiyetin temeli showcase uygulamasında olduğundan aşağıda detaylarını paylaştığımız kodlama nüanslarına dikkat etmek çok önemli. Özellikle en önemli meselelerden olan “input validation”ın önemi burada açıkça ortaya çıkıyor. Kullanıcıdan alınan girdi Struts1Action.java içerisine gitmektedir. Ve geçtiği aşamalarda sanitize işlemine tabi tutulmamaktadır. Sanitize işlemine tabi tutulmayan girdi zararlı OGNL payload’u ile istismar edilebilmektedir.
Burada zafiyet sonrası yapılan zafiyeti fixleme çalışmasında da görüldüğü gibi raw message’ın ActionMessage içerisinden direkt geçmesi yerine resource key’ler kullanılıyor.
Böylece önceden kullanıcıdan alınan girdi kontrol edilmezken şimdi plugin içerisindeki resource key kullanılarak kullanıcıdan alınan girdi sanitize işlemine tabi tutulmaktadır.
Ancak bu çözüm genel olarak geçici bir çözümdür. Burada önemli nokta yapılan programlama yanlışıdır. Kullanıcıdan girdi alındığı durumlarda girdinin işlendiği fonksiyonlarda girdinin sanitize işlemine tabi tutulup tutulmadığına dikkat edilmelidir.
Yayınlanan istismar kodları: https://www.exploit-db.com/exploits/42324/
Zafiyet incelemesini yaparken ekip olarak şaşırtıcı bir detay ile karşılaştık. Netsparker zafiyeti kendi içerisinde mevcut olan payload ile Code Evaluation statüsünde tespit edebilmekte ve doğrulayabilmekte idi.
Kısa vadede alınacak önlemler:
- Kullanıcıdan alınan veriye asla güvenilmeyip, validation ve santize işlemlerinden geçirilmeli.
- Uygulamalarınıza düzenli aralıklarla sürekli olarak farklı bakış açılarından penetrasyon testleri ve otomatik taramalar yaptırmalısınız. Örneğin bu özel durumda da görüldüğü gibi eğer uygulama daha önce Netsparker ile taranmış olsa idi zafiyet çok daha önce tespit edilebilecekti.
- Kullandığınız Apache Struts versiyonunu güncelleyip olası güncellemeler için de rutin kontroller yapmalısınız.
Referanslar:
[1]: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-9791
[2]: http://www.securitytracker.com/id/1038838
[3]: https://nvd.nist.gov/vuln/detail/CVE-2017-9791
[4]: https://struts.apache.org/docs/s2-048.html
[5]: https://github.com/apache/struts/commit/73da12e723c2737bd515946588ddcd898acf584a
[6]: https://packetstormsecurity.com/files/cve/CVE-2017-9791