CVE-2017-9791: Apache Struts 1 Improper Input Validation Vulnerability
Zorluk Seviyesi: Orta | Kaynak: CISA KEV
Zafiyet Analizi ve Giriş
CVE-2017-9791, Apache Struts 1'de bulunan bir güvenlik açığıdır ve bu zafiyet "Improper Input Validation" (Yanlış Girdi Doğrulama) kategorisine girmektedir. Apache Struts, Java tabanlı, açık kaynaklı bir web uygulama çerçevesidir ve özellikle kurumsal uygulamalar için kullanılmaktadır. 2017 yılında keşfedilen bu zafiyet, belirli bir eylem mesajı (ActionMessage) içerisine kötü niyetli bir alan değeri geçirildiğinde, uzaktan kod yürütme (RCE - Remote Code Execution) olanağı sağlamaktadır.
Zafiyet temel olarak, Struts 1 plugin'inde bir hata olması nedeniyle ortaya çıkmıştır. Bu hata, sistemin beklediği giriş verilerinin doğru bir şekilde kontrol edilmemesi sonucunda meydana gelir. Kötü niyetli bir kullanıcı, sahte bir girdi göndererek uygulamanın belirli bölümlerine erişim sağlayabilir ve bu sayede kötü amaçlı kodları çalıştırabilir. Böyle bir saldırı sonucu, saldırgan sadece uygulama üzerinde değil, aynı zamanda sunucu üzerinde de tam yetkiye sahip olabilir.
Bu zafiyetin etkileri oldukça geniş bir yelpazeye yayılmaktadır. Özellikle finansal hizmetler, kamu sektörü ve sağlık hizmetleri gibi kritik sektörler bu zafiyetten önemli ölçüde etkilenmiştir. Örneğin, bir finansal hizmetler kuruluşu, Struts 1 uygulamasını kullandığında bu zafiyeti istismar eden bir siber saldırı, müşteri bilgilerini tehlikeye atabilir, hesap ele geçirme (Auth Bypass - Kimlik Doğrulama Atlatma) veya veri sızdırma gibi sonuçlar doğurabilir. Sağlık sektöründe ise, hasta bilgileri veya kritik sağlık uygulamalarına erişimin kaybedilmesi gibi ciddi sonuçlar doğurabilir.
Zafiyetin detaylarına baktığımızda, Struts 1 kütüphanesinin, "setAction" metodunu kullanarak kullanıcıdan gelen verilerin doğrudan işlenmesi ve yeterince uygunsuz bir şekilde kontrol edilmemesi temel problemdir. Örneğin, aşağıdaki gibi bir kod parçasında bu hata örneklendirilebilir:
public void setAction(String action) {
this.action = action;
}
Bu kod parçasında "action" değişkenine gelen herhangi bir değer kontrol edilmeden doğrudan atanıyor. Kötü niyetli bir kullanıcı, bu "action" değişkenine zararlı bir payload (yük) yerleştirdiğinde, sistem bu zararlı veriyi alıp işler ve uzaktan kod yürütmesine olanak tanır.
Sonuç itibarıyla, Apache Struts 1 üzerinde bulunan CVE-2017-9791 zafiyeti, düzgün bir girdi doğrulama süreci uygulanmadığında gerçekleşmektedir. Uygulama geliştiricileri, bu tür zafiyetlerden kaçınmak için kullanıcı girdi verilerini mutlaka doğrulamalı, sanitize (temizleme) etmelidir. Ayrıca, güvenlik açıklarını taramak için düzenli olarak güncellenmiş güvenlik yamaları uygulamak ve en iyi güvenlik uygulamalarını takip etmek kritik öneme sahiptir. Siber güvenlik uzmanlarının, bu tür açıkları tespit etmeleri ve mevcut uygulama mimarisini sürekli gözden geçirmeleri, etkili bir güvenlik stratejisi için vazgeçilmezdir.
Teknik Sömürü (Exploitation) ve PoC
Apache Struts 1, yaygın olarak kullanılan bir web uygulaması çatı sistemidir, ancak belli başlı zafiyetlere de sahiptir. CVE-2017-9791, bu zafiyetlerden biri olarak dikkat çekmektedir ve kötü niyetli bir kullanıcı, Struts 1'in ActionMessage bileşenine zararlı bir alan değeri göndererek uzaktan kod çalıştırma (RCE) yeteneği kazanabilir. Bu durum, saldırganın hedef sistemde kötü amaçlı yazılım çalıştırmasına veya diğer yıkıcı eylemler yapmasına olanak tanır.
Diğer birçok zafiyette olduğu gibi, exploit aşamaları birkaç adımdan oluşur. İlk aşama, hedef sistemin durumunu analiz etmektir. Saldırgan, sistemin Apache Struts 1 kullanıp kullanmadığını ve bu sürümün zafiyetten etkilenip etkilenmediğini belirlemelidir. Bunun için, hedef web uygulaması üzerinde belirli HTTP istekleri göndererek mevcut bileşen ve sürüm bilgileri elde edilebilir.
İkinci aşama, zararlı yükün (payload) oluşturulmasıdır. Struts 1'deki bir eyleme (action) gönderilecek bir payload oluşturulmalıdır. Aşağıda basit bir örnek verilmiştir:
import requests
url = 'http://hedefadres.com/struts2/action' # Hedef web uygulamasının URL'si
payload = {'param': '\";system(\"whoami\");\"'} # Kötü niyetli yük
response = requests.post(url, data=payload)
print(response.text)
Yukarıdaki Python kodu, belirli bir alana zararlı bir Java Script kodu gönderir. Buradaki 'param', hedef uygulamanın işlem yaptığı bir alandır. Bu şekilde, eylem çalıştırıldığında, 'whoami' komutu ile sistem bilgileri alınmakta ve bu da saldırganın uygulama üzerinde ne kadar yetki sahibi olduğunu anlamasına olanak sağlamaktadır.
Üçüncü aşamada, gerçek dünya senaryolarına değinmek önemlidir. Diyelim ki, bir e-ticaret platformu Apache Struts 1 kullanıyor ve bu platformda kullanıcı bilgilerini güncelleyebilen bir form mevcut. Saldırgan, bu formu hedef alarak gerekli alanlara zararlı bir yük yerleştirir. Eğer sistem bu veriyi yeterince doğrulamıyorsa, bu durumda otonom bir senaryoda gerçekleştirilmek istenen tüm kullanıcı verileri üzerindeki kontrolü kaybedeceği anlamına gelir. Saldırgan, veritabanı sorgularını değiştirebilir, özel verilere erişebilir veya başka zararlı kodlar çalıştırabilir.
Dördüncü aşama ise, sistem üzerindeki zararın etkisinin değerlendirilmesiyle ilgilidir. Elde edilen erişimle, sızma testine devam ederek daha fazla bilgiye ulaşabiliriz. Bu aşamada saldırganın amacına yönelik olarak çeşitli adımlar atılabilir, örneğin, daha fazla değişiklik yapmak veya sistem üzerinde arka kapı (backdoor) oluşturmak.
Saloz (exploit) yayınlamak için kullanıcının oturum bilgilerini veya diğer kullanıcıların bilgilerini çalması durumunda, etkilenen tüm kullanıcılar tehlikeye girebilir. Özetle, Apache Struts 1 üzerindeki CVE-2017-9791 zafiyeti, doğru bir şekilde kullanıldığında, büyük zararlara yol açabilecek bir güvenlik boşluğu barındırır. Bu nedenle, güvenlik uzmanlarının bu tür zafiyetlere karşı gerekli önlemleri almaları ve sistemde güncellemeleri takip etmeleri kritik öneme sahiptir.
Forensics (Adli Bilişim) ve Log Analizi
Apache Struts, popüler bir web uygulama framework'üdür ve CVE-2017-9791 zafiyeti, Struts 1'in belirli sürümlerinde yer alan bir hatadan kaynaklanmaktadır. Bu zafiyet, saldırganların kötü niyetli alan adı değerleri kullanarak uzaktan kod yürütmesi (RCE) olanağı sağlayabilmektedir. Özellikle, bu tür bir zafiyetin nasıl istismar edildiğini ve bunun sonuçlarını anlamak, bir siber güvenlik uzmanının görevlerinin önemli bir parçasını oluşturur.
Saldırganlar, Apache Struts 1'e gönderilen ham mesajlar (raw message) aracılığıyla, ActionMessage bileşenine zararlı veri gönderebilir. Bu durumda, sistemde kötü niyetli bir komut yürütülebilir. Örneğin, bir saldırgan, aşağıdaki gibi bir HTTP isteği göndererek zararlı bir eylem tetikleyebilir:
POST /example/actions HTTP/1.1
Host: vulnerable-application.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 45
field1=value1&maliciousField=%27%3Bcommand%20to%20execute%3B%27
Bu olayı tespit etmek için, bir siber güvenlik uzmanı birkaç önemli adıma dikkat etmelidir. Öncelikle, güvenlik bilgi ve olay yönetim (SIEM) sistemleri veya log dosyaları üzerinde inceleme yaparak anormal etkinlikleri belirlemelidir. Bu süreçte, özellikle erişim (access) ve hata (error) log dosyaları kritik öneme sahiptir.
Erişim logları, sunucuya yapılan tüm istekleri kaydeder ve bu loglarda belirli imzalar (signature) aramak, potansiyel saldırıları tespit etmek için yararlıdır. Saldırganların gönderdiği zararlı istekleri tespit etmek için aşağıdaki gibi belirli örüntüleri (pattern) izleyen log girdileri aranabilir:
- Anormal URL Yapısı: Örneğin,
?veya&karakterlerini içeren karmaşık sorgular. Bu, tipik URL'lerin dışında anormal bir davranış sergileyebilir. - Kötü Niyetli Karakterler: LOG içerisinde
%27,%3Bgibi hexadecimal kodlamayla temsil edilen karakterleri aramak, istismar girişimlerini örneklendirebilir. - Hata Mesajları: Hata loglarında görünen ve "Null Pointer" (Boş İşaretçi), "Servlet Exception" gibi ifadeler, kod yürütme girişiminin başarılı olup olmadığını gösterebilir.
Blob (Binary Large Object) ve JavaScript gibi teknik terimleri kullanarak, bu tür kodların nasıl çalışabileceğini ve olası bir istismar senaryosunu daha derinlemesine anlamak mümkündür. Örneğin, bir saldırı girişimi olarak belirli bir JavaScript kodunun yürütülmeye çalışıldığını gösteren log kaydı, bir güvenlik uzmanı için kritik bir gösterge olabilir.
Bu tür bir zafiyeti ve bunu tespit etme yöntemlerini bilmek, sadece siber güvenlik uzmanlarının değil, aynı zamanda organizasyonların güvenlik stratejilerini güçlendirmesi açısından da önemli bir adımdır. Siber saldırılara karşı etkili bir savunma oluşturmak için log analizi ve olay yanıtı süreçlerinin sürekli olarak gözden geçirilmesi ve güncellenmesi gerekmektedir. Böylelikle, saldırganların kötü niyetli girişimlerine karşı daha etkili bir direniş sağlanabilir.
Savunma ve Sıkılaştırma (Hardening)
Apache Struts 1 içindeki CVE-2017-9791 zafiyeti, siber güvenlik alanında dikkat edilmesi gereken ciddi bir sorundur. Bu açıktan faydalanarak, kötü niyetli bir saldırgan, remoten code execution (uzaktan kod çalıştırma) gerçekleştirebilir. Zafiyet, Struts 1 eklentisinin, kullanıcıdan gelen verileri yeterince kontrol etmemesi sonucu ortaya çıkmaktadır. Kötü niyetli bir kullanıcı, ActionMessage'e gönderilen ham mesajdaki alan değerlerini manipüle ederek sistemde istenmeyen komutlar çalıştırabilir.
Apache Struts 1, uzun yıllardır kullanılan bir web uygulama çerçevesidir. Ancak, zamanla eski kalmış ve güncel güvenlik standartlarına uyum sağlamaktan uzak hale gelmiştir. Özellikle CVE-2017-9791 gibi zafiyetler, bu eski sistemlerin neden güncellenmesi gerektiğinin önemli bir göstergesidir. Bu tür zafiyetlerin istismarını önlemek için uygulama düzeyinde savunma ve sıkılaştırma (hardening) yöntemlerinin uygulanması hayati önem taşır.
Birinci adım olarak, hali hazırdaki Struts uygulamanızın güncellenmesi gerekmektedir. Struts 2 sürümlerine geçiş yaparak, daha güncel güvenlik güncellemelerini ve yamalarını almaya başlayabilirsiniz. Eğer geçiş yapamayacak durumdaysanız, uygulamanızda yapılacak bazı yazılımsal önlemler ile zayıf noktaları azaltmak mümkündür.
Kullanıcıdan alınan verilerin doğruluğunu sağlamak için girdi doğrulama mekanizmaları geliştirilmelidir. Girdi verisi sanitize edilerek, tehlikeli karakterlerin ve komutların kullanılmasının önüne geçilmelidir. Örneğin:
String safeInput = request.getParameter("input").replaceAll("[^a-zA-Z0-9]", "");
Bu tarz bir sanitizasyon, kötü niyetli girdilerin işlenmesini zorlaştırır. Ancak sadece girdi doğrulama yeterli değildir; aynı zamanda kullanıcı doğrulaması (authentication) süreçleri de güçlendirilmelidir. Uygulama düzeyinde rol tabanlı erişim kontrolü uygulanabilir. Böylece yalnızca yetkili kullanıcıların belirli operasyonları gerçekleştirmesine izin verilmesi sağlanır.
Ayrıca, Web Uygulama Güvenlik Duvarı (WAF) kullanarak ek bir güvenlik katmanı oluşturmak, hem web uygulamalarını korumanın hem de potansiyel saldırıları tespit etmenin etkili bir yoludur. WAF yapılandırmalarında, CVE-2017-9791'e yönelik kural setleri ekleyerek, şüpheli istekleri engelleyebiliriz. Örneğin, HTTP isteklerinde geçen belirli parametre değişimlerini engelleyen kurallar yazılabilir:
SecRule REQUEST_HEADERS "cc(?:e|s|r)[^ 0-9]" "id:1001,phase:2,deny,status:403"
Bu şekilde belirli kalıplara uymayan istekler tespit edilerek, zararlı isteklerin kaynağında engellenmesi sağlanır. Yapılandırılan WAF'ler, uygulama güvenliğini artırırken aynı zamanda performans kayıplarını da en aza indirgemek için optimize edilmelidir.
Son olarak, sürekli izleme, dökümantasyon ve güncellemeleri takip etmek, güvenlik açığı yönetiminin ayrılmaz bir parçasıdır. Güvenlik güncellemelerini ve açıkları takip etmek için çeşitli platformlar ve araçlar kullanılabilir. Struts 1 gibi eski sistemi kullanan kuruluşların, sızma testleri ve güvenlik denetimleri yaptırarak zafiyetlerini tespit etmeleri ve bu açıktan faydalanılmasını önlemeleri önerilmektedir.
Kısacası, CVE-2017-9791 gibi zafiyetler, siber güvenliğin ne kadar önem taşıdığını gözler önüne seriyor. Alınacak önlemler ile bu tür tehditlerin üstesinden gelebilir, güvenli bir web ortamı oluşturabiliriz.